//Atuomater quadcore creativity pc 12V dualrotorserverturbine regulator (regulation manuall or automated by themperature) //circuit: powderfull possible dimmingpowder 4x 200Watt by P-chennel Mosfets irf4095 drivingpowder 12V (for mosfet/transistorcircuit) 5Vfor STM32F103C8T6 highpowerled and LED/KEY 8dig8buttons8leds module (AMS1117 3V3 regulator on5V for 10k tempsensors) //mosfetswitchingcicuit thing no needing for textdescription caused values and wirelines good shown on this picture: https://marderchen.lima-city.de/NEU+/pretty_highdrain_PWMboardforSTM_12V4xIRF4095.jpg >471 (407R) on D882(NPN3A transistor) goes to STM /* Pictures * https://marderchen.lima-city.de/NEU+/stmregulatet_turbinequadcorecooling_irf4095bank.jpg * https://marderchen.lima-city.de/NEU+/quadcore_turbineregulator_nextlayer.jpg * https://marderchen.lima-city.de/NEU+/quadcore_turbineregulator_moafettest.jpg * https://marderchen.lima-city.de/NEU+/quadcore_turbineregulator_progressy_.jpg * https://marderchen.lima-city.de/NEU+/quadcore_turbineregulator_wiretree_notenoughthintempsenswire.jpg * https://marderchen.lima-city.de/NEU+/quadcore_turbineregulatorunit_finecased.jpg * https://marderchen.lima-city.de/NEU+/quadcore_turbineregulatorunit_tastercapsglued.jpg * https://marderchen.lima-city.de/NEU+/quadcore_turbineregulator_koting.jpg * https://marderchen.lima-city.de/NEU+/quadcore_turbineregulator_tasterlabeled.jpg */ // basicly its kind of loud this pc even is driving serverturbines only with 5V so build this to reduce standbyloudness //have fun use if usefull.. by marderchen #include #include #define NO_MODULES 1 // datathinks PB12 - clockthinks PB13- Strobethinks PB14 TM1638 module(PB12, PB13, PB14);// 3wires to STM + gnd and 5V TM1638* modules[NO_MODULES] = {&module,}; byte modes[NO_MODULES]; #define NO_MODULES 1 #define rot PC13 #define MOSI1 PB9 //single front turbienfan in case #define MOSI2 PB8 //dustcatchercase turbine front rotor #define MOSI3 PB7 //dustcatchercase turbine rear rotor #define MOSI4 PB6 //mosfettransistorcircuit soldered just no wires for one more turbine^^ #define temp1 PA0 //position CPUheatsink #define temp2 PA1 //no sensor #define temp3 PA2 //no sensor #define temp4 PA3 //position Mosfets #define LEDwarn PB0 #define BUTZwarn PB1 //no buzzer //serial3 tx PB10 rx PB11 maybe if want conrtolling by pc software uint8_t modus=0; uint16_t temps[5],offtimecount; uint16_t correction=1800;//correcting zerotemp ~actualy 30°C =0 uint16_t errortemp=500; uint16_t errors,errort,errorb; boolean warn=true; uint32_t offtime=1200; int16_t turbin1=100; //singlerotor front int16_t turbin2=100; //caseturbine front int16_t turbin3=100; //caseturbine rear int16_t turbin4=0;//no fan connected long maintime=millis(); long maintime2=millis(); long maintime3=micros(); long timez= millis(); long mosipulsi=micros(); uint16_t ledka=0; uint16_t zeroline=60; uint16_t zahl1,zahl2; String text=""; uint8_t onR=0; boolean onk=false; boolean tplusset=false; boolean tminusset=false; uint8_t modusset=0; void setup() { delay(200); pinMode(rot, OUTPUT); pinMode(MOSI1, OUTPUT); pinMode(MOSI2, OUTPUT); pinMode(MOSI3, OUTPUT); pinMode(MOSI4, OUTPUT); for (int i = 0; i < NO_MODULES; i++) {module.setupDisplay(true, 8); modes[i] = 0;} text="booting"; delay(300); } void loop() { zeitreise(); //if (onk==true) {digitalWrite(grun,HIGH);}else {digitalWrite(grun,LOW);} } String cach=""; void update(TM1638* module, byte* mode) { byte buttons = module->getButtons();//only button pulse if (buttons ==1) {modusset=2;} if (buttons ==2) {onR=1;} if (buttons ==4) {} if (buttons ==8) {} if (buttons ==16) {errors=1;} if (buttons ==32) {tminusset=true;} if (buttons ==64) {tplusset=true;} if (buttons ==128) {modusset=1;} for(uint8_t nul=0;nul<7;nul++){module->setLED(0,nul);} module->setLED(1,modus); if(onk==true){module->setLED(1,7);} if(warn==true){if(errort <10){module->setLED(1,6);}errort++; if(errort>20){errort=0;}} // module->setDisplayToString(text); zeigkram(); cach=""; if(zahl1<=9){cach+="0";} if(zahl1<=99){cach+="0";} if(zahl1<=999){cach+="0";} cach+=zahl1; if(zahl2<=9){cach+="0";} if(zahl2<=99){cach+="0";} if(zahl2<=999){cach+="0";} cach+=zahl2; module->setDisplayToString(cach); } void zeigkram(void){ if (modus==0) {zahl1=temps[0]; zahl2=turbin2;} if (modus==1) {zahl1=turbin1; zahl2=temps[0];} if (modus==2) {zahl1=turbin2; zahl2=temps[0];} if (modus==3) {zahl1=turbin3; zahl2=temps[0];} if (modus==4) {zahl1=temps[0]; zahl2=temps[3];} if (modus==5) {zahl1=errortemp; zahl2=zeroline;} } void machkram(void){ if(onR==1){schaltmal();onR=0;} if(errors=1){warnon();errors=0;} if(modusset ==1 && modus <5) {modus++; modusset=0;} if(modusset ==2 && modus >=1) {modus--; modusset=0;} if (modus==0) { //adjust turbine sensiblity for temperature if(tplusset ==true) {if(zeroline <=1190){zeroline+=10;} tplusset=false;} if(tminusset ==true) {if(zeroline >=19){zeroline-=10;} tminusset=false;}} if (modus==1) { //adjust turbine1 powder manually if(tplusset ==true) {if(turbin1<=1180){turbin1+=20;} tplusset=false;} if(tminusset ==true) {if(turbin1>=20){turbin1-=20;} tminusset=false;}} if (modus==2) { //adjust turbine1 powder manually if(tplusset ==true) {if(turbin2<=1180){turbin2+=20;} tplusset=false;} if(tminusset ==true) {if(turbin2>=20){turbin2-=20;} tminusset=false;}} if (modus==3) { //adjust turbine1 powder manually if(tplusset ==true) {if(turbin3<=1180){turbin3+=20;} tplusset=false;} if(tminusset ==true) {if(turbin3>=20){turbin3-=20;} tminusset=false;}} if (modus==5) { //adjust temperaturtrigger for 3Watt flashing blue HIGH power overheating warn LED if(tplusset ==true) {if(errortemp <1980){errortemp+=20;} tplusset=false;} if(tminusset ==true) {if(errortemp >=20){errortemp-=20;} tminusset=false;}} } void istwarm(void){//no wires to connect temp2, and 3 if ((correction-analogRead(temp1)) 0){temps[0]--;}else{temps[0]++;} if ((correction-analogRead(temp2)) 0){temps[3]--;}else{temps[3]++;} } void schaltmal(void){if (onk==true) {onk=false;} else {onk=true; }} void warnon(void){if (warn==true) {warn=false;} else {warn=true; }} void zeitreise(void){ while ((millis()- maintime) >= 10){warnblitz();maintime = millis();} while ((micros()- maintime3) >= 80000) {for (int i = 0; i < NO_MODULES; i++) {update(modules[i], &modes[i]);} maintime3 = micros();} //refresh display while ((millis()- maintime2) >= 600) {machkram(); digitalWrite(rot,LOW);maintime2 = millis();} //timeinterfall for repead is button still pressed while ((millis()- timez) >= 3) {istwarm();timez = millis();} //read temperatursensors while ((micros()-mosipulsi) >= 20) { //intervall for runing Mosfet (turbine)duty cyclus if(onk==true){pulspowder();}else{digitalWrite(MOSI1, LOW); digitalWrite(MOSI2, LOW); digitalWrite(MOSI3, LOW); digitalWrite(MOSI4, LOW); } mosipulsi = micros(); }} void warnblitz(void){ if (warn==true && temps[0] >errortemp){ modus=5; turbin1=1000;turbin2=1000;turbin3=1000; //go to errotempadjustment and powder turbine near maximum errorb++; if (errorb>50){errorb=0;} if (errorb < 10){digitalWrite(LEDwarn,HIGH);}else{digitalWrite(LEDwarn,LOW);}} else{digitalWrite(LEDwarn,LOW);}} void pulspowder(void) { if(modus==0){turbin2=temps[0]+zeroline;turbin1=round(turbin2*0.8); turbin3=round(turbin2*1.2);} //automatix more temp =more turbinepowder for (uint32_t fcount=1; fcount <(offtime); fcount++) { if (fcount<=turbin1) {digitalWrite(MOSI1, HIGH);} if (fcount> turbin1) {digitalWrite(MOSI1, LOW); } if (fcount<=turbin2) {digitalWrite(MOSI2, HIGH);} if (fcount> turbin2) {digitalWrite(MOSI2, LOW); } if (fcount<=turbin3) {digitalWrite(MOSI3, HIGH);} if (fcount> turbin3) {digitalWrite(MOSI3, LOW); } if (fcount<=turbin4) {digitalWrite(MOSI4, HIGH);} if (fcount> turbin4) {digitalWrite(MOSI4, LOW); } }}