mihaicozac Postat Februarie 18, 2017 Partajează Postat Februarie 18, 2017 (editat) Prezint în cele ce urmează cum am rezolvat controlul unei instalaţii de încălzire şi producere de apă caldă menajeră a casei în care locuiesc acuma. Când m-am mutat a trebuit să fac o verificare generală a instalaţiei, care se compune dintr-un cazan pe combustibil solid şi altul pe motorină. A fost nevoie să curâţ incintele de ardere, să schimb şi să reglez duza de injecţie, Au fost schimbate şi ţevile de încălzire spre etaj, pt. că original era o singură ţeavă care înseria toate caloriferele, deci fără tur-retur. Schema hidraulică a instalaţiei este următoarea: După cum se observă cele 2 cazane sunt înseriate hidraulic, cazanul pe motorină fiind la ieşire. Automatizarea lui comută între încălzire şi apă caldă funcţie de temperatura din boiler, aşa că a fost nevoie să montez câţiva senzori de temperatură în punctele vitale ale instalaţiei, pt. ca logica controllerului să primească suficiente informaţii pt. o comandă corectă. Funcţiile automatizării sunt următoarele: -asigură o temperatură a cazanului pe lemne cât mai apropiată de cea reglată din potenţiometrul de PRESET, prin controlul aerului de admisie -la răcirea sobei cu lemne, când nu se mai poate asigura suficientă căldură, se comandă pornirea cazanului pe motorină şi se închide complet clapeta de aer pt. a preveni pierderile termice din sobă prin curentul de aer de ventilaţie. -în cazul în care se produce apă caldă menajeră folosind soba cu lemne, se opreşte pompa de recirculare şi temperatura sobei este reglată automat la o valoare de 14C peste cea instantanee a apei calde din boiler, pt. un transfer maxim de energie. -în funcţie de diferenţa de temperatură de la intrarea şi ieşirea agentului termic în boiler se reglează treptele pompei de încărcare pt. adaptarea debitului necesar. -opreşte pompa de recirculare dacă temperatura agentului termic scade sub o valoare la care nu mai are rost să funcţioneze, de ex. primăvara şi toamna când încălzirea funcţionează cu întreruperi. Senzorii folosiţi sunt de tip LM45, pe care i-am lipit pe o plăcuţă mică de cablaj imprimat, montată pe o fâşie de tablă de Cu şi izolată apoi cu tun termocontractil. Pt. comanda clapetei de admisie aer la soba cu lemne am construit un servomotor cu un cabestan, care ridică şi coboară clapeta. Poziţia cabestanului este citită cu un potenţiometru, astfel se poate realiza o comandă proporţională a poziţiei: Desigur că înainte de a monta automatizarea pe poziţii a fost nevoie de teste şi optimizări, pt. asta am folosit pt. datele de intrare în loc de senzori un bloc de potenţiometre din care simulam diferite stări şi observam pe afişajul LCD şi ledurile de ieşire comportamentul controllerului: Până la urmă le-am adunat pe toate pe o plăcuţă de încercări şi afişajul l-am montat într-o cutie separată, pt. a-l putea pune într-un loc la vedere: În cutia afişajului au mai apărut ulterior nişte leduri pt. afişarea stării, în poză nu sunt prezente. Unul verde pt. cazul când pompa de recirculare funcţionează, altul roşu când se prepară apă caldă şi încă unul albastru când se porneşte cazanul pe motorină. Pt. controlul pompei de încărcare a boilerului am desfăcut cutia de conexiuni a pompei, am îndepărtat comutatorul manual şi am adaptat circuitul meu de comandă: Ledurile arată treapta de putere în care se găseşte pompa schema este în aşa fel proiectată încât fără comandă din Arduino pompa funcţionează la turaţie maximă: În momentul în care comanda cazanului pe motorină cere apă caldă şi pompa de încărcare porneşte, tensiunea de alimentare locală de 12V comandă un optocuplor care informează Arduino că tocmai s-a intrat în regim de producere de apă caldă menajeră şi acesta ia deciziile de rigoare: Senzorii de temperatură sunt conectaţi pe post de generator de curent variabil, în loc de tensiune variabilă. Acest lucru oferă mai multe avantaje, se folosesc doar 2 fire între controller şi senzor, se obţine imunitate foarte mare la zgomot şi prin alegerea corespunzătoare a rezistenţei de sarcină din controller se adaptează domeniul de temperaturi necesar la rezoluţia ADC-ului din Arduino. De ex. pt. domeniul de temperaturi 0-100C se aleg 200 ohmi la LM45 şi 1k la Arduino, astfel avem variaţie de tensiune de 0-5V pe intrarea analogică. Compensarea abaterii se face apoi din software: Pt. comanda clapetei de aer ar fi fost probabil mai potrivit un motor pas cu pas, însă era mai greu de verificat poziţia exactă, aveam nevoie de senzori de cap de cursă. Aşa cu reductor şi cabestan mecanica e simplificată la maximum. doar electronica s-a complicat puţin. Am avut nevoie de un etaj de putere în punte pe care l-am realizat cu 2 amplificatoare audio TDA2030, frecvenţa PWM-ului din Arduino fiind relativ joasă, la 960Hz. Când semnalul de ieşire are factorul de umplere 50% motorul stă oprit, şi orice variaţie peste sau sub această valoare mişcă motorul într-o direcţie sau cealaltă. Potenţiometrul solidar cu axul cabestanului citeşte poziţia lui şi Arduino actualizează această poziţie funcţie de valoarea calculată a variabilei "airControl": Din cauza frecvenţei mici de la PWM a fost nevoie de inductanţe mari la ieşirile amplificatorului, chiar şi aşa se aude un uşor "scârţâit" când motorul reglează fin. Ca să nu tot bâzâie aiurea la corecţii foarte reduse, am prevăzut în cod ca driverul de motor să fie alimentat doar dacă e nevoie de o corecţie este mai mare de cca. 5%. Asta compensează şi jocurile mecanice ale reductorului şi cabestanului. Citirea temperaturii gazelor de evacuare se face cu un termocuplu tip K legat la un circuit specializat AD595, care oferă 10mV/C, astfel la intrarea Arduino se pot citi direct temperaturi de pânţ la 500C. După testarea pe masă a urmat instalarea pe viu, aici în prima fază am montat doar senzorii şi modulul conectat la afişaj şi am urmărit timp de cca. o săptămână valorile afişate şi funcţionarea logicii. Bineînţeles că a fost nevoie de corecţii, ca întotdeauna, pt. că nu se pot prevedea toate situaţiile posibile. De ex. se răcea soba şi pornea centrala pe motorină, însă după un timp soba pe lemne nemaifiind în sarcină mare se încălzea puţin din nou şi zăpăcea comanda, în sensul că pornea şi oprea cazanul pe motorină la fiecare 2 secunde. Aşa m-am trezit într-o dimineaţă, în frig şi cu ţăcăneli de relee. Ulterior am modificat codul adăugând temporizarea deciziei de a porni cazanul pe motorină funcţie de direcţa în care o ia temperatura sobei. Acuma chiar dacă aceasta se încălzeşte parţial e nevoie de cca. 4 minute ca să se oprească sau pornească cazanul pe motorină, timp în care temperatura din instalaţie se modifică suficient ca să nu mai zăpăcească totul. Imagine de la teste: Cred că am scos şi băgat de vreo 100 de ori modulul Arduino în soclu pţnă am reuşit scrierea unui algoritm mulţumitor. Nici acuma nu e perfect însă în proporţie de 95% se comportă după aşteptări. Public şi codul, deşi este strict optimizat pt. instalaţia mea, poate serveşte ca sursă de inspiraţie şi pt. alţii: #include <LiquidCrystal.h>LiquidCrystal lcd(12, 11, 5, 4, 3, 2);int presetInput, airControl, tempDiff1, tempDiff2, motorDrive, motorPosition, positionError, wwMode, power, counter;double preset_T, actual_T, exhaust_T, warmWater_T1, warmWater_T2, forward_T, return_T;void setup() { lcd.begin(20, 4); lcd.print("ARDUINO HEAT CONTROL"); airControl = 0; motorDrive = 127; counter = 512; pinMode[0, OUTPUT]; pinMode(1, OUTPUT); //COMANDA TREAPTA POMPA APA CALDA. pinMode(8, OUTPUT); //COMANDA ALIMENTARII CU TENSIUNE CONTROLLER MOTOR CLAPETA. pinMode(9, OUTPUT); //COMANDA PORNIRE ARZATOR MOTORINA. pinMode(13, OUTPUT); //COMANDA RELEU POMPA RECIRCULARE. pinMode(7, INPUT); //COMUTATOR MOD APA CALDA. digitalWrite[0, LOW]; digitalWrite(1, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(13, HIGH);}void loop() { //CITIRE DATE presetInput = analogRead(A0); //POTENTIOMETRU PRESET LEMNE. actual_T = analogRead(A1); //SENZOR TEMPERATURA LEMNE. actual_T = actual_T * 1.07 - 60; actual_T = constrain(actual_T, 0, 1023); //COMPENSAREA ABATERII. exhaust_T = analogRead(A2); //SENZOR TEMPERATURA GAZE EVACUARE. exhaust_T = exhaust_T - 4; exhaust_T = constrain(exhaust_T, 0, 1023); warmWater_T2 = analogRead(A3); //SENZOR TEMPERATURA APA CALDA. warmWater_T2 = warmWater_T2 * 1.15 -60; warmWater_T2 = constrain(warmWater_T2, 0, 1023); //COMPENSAREA ABATERII. return_T = analogRead(A5); //SENZOR TEMPERATURA RETUR. return_T = return_T * 1.06 - 60; return_T = constrain(return_T, 0, 1023); //COMPENSAREA ABATERII motorPosition = analogRead(A6); //SENZOR POZITIE CLAPETA AER. wwMode = digitalRead(7); //PRELUCRARE DATE presetInput = map(presetInput, 0, 1023, 450, 750); //LIMITARE DOMENIU REGLAJ power = actual_T - return_T; if (wwMode == LOW) {warmWater_T1 = return_T - 50; preset_T = warmWater_T1 + 140; //COMUTARE IN MOD APA CALDA. forward_T = analogRead(A7);} //SENZOR TEMPERATURA TUR INCARCARE. else{preset_T = presetInput; warmWater_T1 = warmWater_T2; //CITIRE POTENTIOMETRU PRESET. forward_T = analogRead(A4);} //SENZOR TEMPERATURA TUR INCALZIRE. forward_T = forward_T * 1.03 - 60; forward_T = constrain(forward_T, 0, 1023); //COMPENSARE ABATERE. tempDiff1 = preset_T - actual_T; tempDiff2 = forward_T - warmWater_T1; airControl = tempDiff1 * 4; airControl = constrain(airControl, 0, 255); //SEMNAL CANTITATE NECESARA DE AER. if((actual_T < 420) && (power < 80) && (exhaust_T < 90)) { airControl = min(32, airControl);} if((power < 30) || (return_T < 260) || (exhaust_T < 90)) { //OPRESTE AERUL DACA SE TERMINA JARUL SI airControl = 0;} //DACA VATRA S-A RACIT ASTFEL SE REDUC //PIERDERILE DE CALDURA PE COS. if ((power > 65) || (actual_T > 430)) { counter--;} else if (((power <= 60) || (forward_T < 400) && (exhaust_T < 100))) { counter++;} counter = constrain(counter, 0, 1023); //TEMPORIZAREA COMUTARII ARZATOR if (counter < 1) { digitalWrite(9, LOW);} else if(counter > 1022) { digitalWrite(9, HIGH);} //PORNESTE ARZATORUL PE MOTORINA. positionError = (airControl * 4) - motorPosition; if((positionError < 32) && (positionError > -32)) {digitalWrite(8, LOW);}//NEGLIJEAZA JOCURILE MECANICE SI else{digitalWrite(8, HIGH);} //ALIMENTEAZA MOTORUL CLAPETEI DOAR //DACA E NEVOIE DE SUFICIENTA CORECTIE. motorDrive = 128 + positionError; motorDrive = constrain(motorDrive, 0, 255); analogWrite(6, motorDrive); analogWrite(10, 255 - motorDrive); //CONTROL PROPORTIONAL MOTOR CLAPETA. if(wwMode == HIGH) { if((forward_T > return_T + 80) && (forward_T > 400)) { digitalWrite(13, HIGH);} //OPRESTE POMPA DE RECIRCULARE else if((forward_T < return_T + 60) && (forward_T < 380)) { //DACA TEMPERATURA APEI SCADE SUB PRAG digitalWrite(13, LOW);}} else {digitalWrite(13, LOW);} //SAU DACA PORNESTE POMPA DE INCARCARE. if(tempDiff2 > 90) //CITIRE ABSORBTIE CALDURA IN BOILER {digitalWrite(0, LOW); digitalWrite(1, LOW);} else if((tempDiff2 < 90) && (tempDiff2 >= 60)) {digitalWrite(1, LOW); digitalWrite(0, HIGH);} else {digitalWrite(1, HIGH); digitalWrite(1, HIGH);} //SE COMUTA TREPTELE POMPA INCARCARE //AFISARE DATE lcd.setCursor(0, 1); lcd.print("PR:"); if(preset_T <= 999) {lcd.print(" "); } if(preset_T <= 99.9) {lcd.print(" "); } lcd.print(preset_T / 10, 1); lcd.print("C"); lcd.setCursor(10, 1); lcd.print("EG:"); if(exhaust_T <= 199) {lcd.print(" "); } if(exhaust_T <= 19.9) {lcd.print(" "); } lcd.print(exhaust_T / 2, 1); lcd.print("C"); lcd.setCursor(0, 2); lcd.print("IS:"); if(actual_T <= 999) {lcd.print(" "); } if(actual_T <= 99.9) {lcd.print(" "); } lcd.print(actual_T / 10, 1); lcd.print("C"); lcd.setCursor(10, 2); lcd.print("FW:"); if(forward_T <= 999) {lcd.print(" "); } if(forward_T <= 99.9) {lcd.print(" "); } lcd.print(forward_T / 10, 1); lcd.print("C"); lcd.setCursor(0, 3); lcd.print("WW:"); if(warmWater_T1 <= 999) {lcd.print(" "); } if(warmWater_T1 <= 99.9) {lcd.print(" "); } lcd.print(warmWater_T1 / 10, 1); lcd.print("C"); lcd.setCursor(10, 3); lcd.print("RE:"); if(return_T <= 999) {lcd.print(" "); } if(return_T <= 99.9) {lcd.print(" "); } lcd.print(return_T / 10, 1); lcd.print("C"); delay(200);} Editat Februarie 18, 2017 de mihaicozac Link spre comentariu
Vizitator Postat Februarie 18, 2017 Partajează Postat Februarie 18, 2017 Felicitari omule,ai muncit nu gluma.Cat despre algoritmul de functionare nu i-ti fa griji,in timp sunt sigur ca o sa il aduci acolo unde trebuie.Sunt cazane industriale care vin cu softuri de parca le-au gandit maimutele in jungla,al tau e parfum.La fel de buna si ideea de a monta senzorii ca generator de curent,ii poti lega cu cabluri neecrante si nu fac probleme. Link spre comentariu
gica70 Postat Februarie 19, 2017 Partajează Postat Februarie 19, 2017 Felicitari. Iata cum pasiunea aduce confort si siguranta! Link spre comentariu
nico_2010 Postat Martie 19, 2017 Partajează Postat Martie 19, 2017 Editeaza postarea din nou si foemateaza codul in IDE Arduino Link spre comentariu
mihaicozac Postat Aprilie 18, 2017 Autor Partajează Postat Aprilie 18, 2017 Nu mai pot edita, aşa că public o variantă mai nouă de cod, puţin modificată. Treptele de la pompa de apă caldă se comută doar după întârzieri de 20 secunde, iar pinul 10 de la Arduino în loc de ieşire complementară a PWM-ului de la motorul clapetei (pt. comanda de ex. a unui L298), acuma are funcţie de comutator display, la punerea acestui pin la masă se intră într-un submeniu care arată starea variabilelor interne. #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int presetInput, airControl, tempDiff1, tempDiff2, motorDrive, motorPosition, positionError, wwMode, power, counter_d, counter_w, main_display; double preset_T, actual_T, exhaust_T, warmWater_T1, warmWater_T2, forward_T, forward_h, forward_w, return_T; void setup() { lcd.begin(20, 4); airControl = 0; motorDrive = 127; counter_d = 512; counter_w = 127; pinMode[0, OUTPUT]; pinMode(1, OUTPUT); //COMANDA TREAPTA POMPA APA CALDA. pinMode(8, OUTPUT); //COMANDA ALIMENTARII CU TENSIUNE CONTROLLER MOTOR CLAPETA. pinMode(9, OUTPUT); //COMANDA PORNIRE ARZATOR MOTORINA. pinMode(13, OUTPUT); //COMANDA RELEU POMPA RECIRCULARE. pinMode(7, INPUT); //INTRARE SELECTARE MOD APA CALDA. pinMode(10, INPUT_PULLUP); digitalWrite[0, LOW]; digitalWrite(1, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(13, HIGH); } void loop() { //CITIRE DATE presetInput = analogRead(A0); //POTENTIOMETRU PRESET LEMNE. actual_T = analogRead(A1); //SENZOR TEMPERATURA LEMNE. actual_T = actual_T * 1.05 - 55; actual_T = constrain(actual_T, 0, 1023); //COMPENSAREA ABATERII. exhaust_T = analogRead(A2); //SENZOR TEMPERATURA GAZE EVACUARE. exhaust_T = exhaust_T - 2; exhaust_T = constrain(exhaust_T, 0, 1023); forward_h = analogRead(A4); //SENZOR TEMP TUR APA CALDA forward_h = forward_h * 1.02 - 50; forward_h = constrain(forward_h, 0, 1023); forward_w = analogRead(A7); //SENZOR TEMP TUR INCALZIRE forward_w = forward_w * 1.01 - 48; forward_w = constrain(forward_w, 0, 1023); warmWater_T2 = analogRead(A3); //SENZOR TEMPERATURA APA CALDA. warmWater_T2 = warmWater_T2 * 1.03 - 50; warmWater_T2 = constrain(warmWater_T2, 0, 1023); //COMPENSAREA ABATERII. return_T = analogRead(A5); //SENZOR TEMPERATURA RETUR. return_T = return_T * 1.045 - 50; return_T = constrain(return_T, 0, 1023); //COMPENSAREA ABATERII motorPosition = analogRead(A6); //SENZOR POZITIE CLAPETA AER. wwMode = digitalRead(7); //PRELUCRARE DATE presetInput = map(presetInput, 0, 1023, 450, 750); //LIMITARE DOMENIU REGLAJ LA 45-75C power = actual_T - return_T; if (wwMode == LOW) { warmWater_T1 = ((forward_w + return_T) / 1.94 - 70); preset_T = warmWater_T1 + 140; //COMUTARE IN MOD APA CALDA. forward_T = forward_w;} //SENZOR TEMPERATURA TUR INCARCARE. else{ preset_T = presetInput; //CITIRE POTENTIOMETRU PRESET. warmWater_T1 = warmWater_T2; forward_T = forward_h;} //SENZOR TEMPERATURA TUR INCALZIRE. tempDiff1 = preset_T - actual_T; tempDiff2 = forward_T - return_T; airControl = tempDiff1 * 4; airControl = constrain(airControl, 0, 255); //SEMNAL CANTITATE NECESARA DE AER. if((actual_T < 420) && (exhaust_T < 90)) { airControl = min(32, airControl);} if(power < 30 || (actual_T < 360 && exhaust_T < 90)) { //OPRESTE AERUL DACA SE TERMINA JARUL SI airControl = 0;} //DACA VATRA S-A RACIT ASTFEL SE REDUC //PIERDERILE DE CALDURA PE COS. if ((power > 65 || actual_T > 430) && (forward_T < actual_T)) { counter_d--;} else if (((power <= 60) || (forward_T < 400) || (actual_T < forward_T)) && (exhaust_T < 90)) { counter_d++;} counter_d = constrain(counter_d, 0, 1023); //TEMPORIZAREA COMUTARII ARZATOR if (counter_d == 0) { digitalWrite(9, LOW);} else if(counter_d == 1023) { digitalWrite(9, HIGH);} //PORNESTE ARZATORUL PE MOTORINA. positionError = (airControl * 4) - motorPosition; if((positionError < 32) && (positionError > -32)) { digitalWrite(8, LOW);} //NEGLIJEAZA JOCURILE MECANICE SI else{ digitalWrite(8, HIGH);} //ALIMENTEAZA MOTORUL CLAPETEI DOAR //DACA E NEVOIE DE SUFICIENTA CORECTIE. motorDrive = 128 + positionError; motorDrive = constrain(motorDrive, 0, 255); analogWrite(6, motorDrive); //CONTROL PROPORTIONAL MOTOR CLAPETA. //analogWrite(10, 255 - motorDrive); if(wwMode == HIGH) { if((actual_T > 390) || (forward_T > 390)) { digitalWrite(13, HIGH);} //OPRESTE POMPA DE RECIRCULARE else if((actual_T < 360) && (forward_T < 360)) { //DACA TEMPERATURA APEI SCADE SUB PRAG digitalWrite(13, LOW);}} else { digitalWrite(13, LOW);} //SAU DACA PORNESTE POMPA DE INCARCARE. int wwCase = map(tempDiff2, 0, 180, 0, 9); switch (wwCase) { case 0: counter_w--; break; case 1: counter_w--; break; case 2: if(counter_w > 127) {counter_w--; if(counter_w < 127) {counter_w = 127;}} else if(counter_w < 127) {counter_w++; if (counter_w > 127) {counter_w = 127;} } break; default: counter_w++; break; //CITIRE ABSORBTIE CALDURA IN BOILER. } counter_w = constrain(counter_w, 0, 255); if(counter_w > 254) { digitalWrite(0, LOW); digitalWrite(1, LOW);} if (counter_w <= 127 && counter_w > 0) { digitalWrite(0, LOW); digitalWrite(1, HIGH);} if (counter_w == 0) { digitalWrite(0, HIGH); digitalWrite(1, HIGH);} //SE COMUTA TREPTELE POMPA INCARCARE //AFISARE DATE main_display = digitalRead(10); if(main_display) { lcd.setCursor(0, 0); lcd.print("ARDUINO HEAT CONTROL"); lcd.setCursor(0, 1); lcd.print("PR:"); if(preset_T <= 999) {lcd.print(" "); } if(preset_T <= 99.9) {lcd.print(" "); } lcd.print(preset_T / 10, 1); lcd.print("C "); lcd.setCursor(10, 1); lcd.print("EG:"); if(exhaust_T <= 199) {lcd.print(" "); } if(exhaust_T <= 19.9) {lcd.print(" "); } lcd.print(exhaust_T / 2, 1); lcd.print("C"); lcd.setCursor(0, 2); lcd.print("IS:"); if(actual_T <= 999) {lcd.print(" "); } if(actual_T <= 99.9) {lcd.print(" "); } lcd.print(actual_T / 10, 1); lcd.print("C "); lcd.setCursor(10, 2); lcd.print("FW:"); if(forward_T <= 999) {lcd.print(" "); } if(forward_T <= 99.9) {lcd.print(" "); } lcd.print(forward_T / 10, 1); lcd.print("C"); lcd.setCursor(0, 3); lcd.print("WW:"); if(warmWater_T1 <= 999) {lcd.print(" "); } if(warmWater_T1 <= 99.9) {lcd.print(" "); } lcd.print(warmWater_T1 / 10, 1); lcd.print("C "); lcd.setCursor(10, 3); lcd.print("RE:"); if(return_T <= 999) {lcd.print(" "); } if(return_T <= 99.9) {lcd.print(" "); } lcd.print(return_T / 10, 1); lcd.print("C"); } else { lcd.setCursor(0, 0); lcd.print("INTERNAL VARIABLES: "); lcd.setCursor(0,1); lcd.print("COUNTER_D "); if(counter_d <= 999) {lcd.print(" "); } if(counter_d <= 99.9) {lcd.print(" "); } if(counter_d <= 9.9) {lcd.print(" "); } lcd.print(counter_d); lcd.print(" "); lcd.setCursor(0, 2); lcd.print("COUNTER_W "); if(counter_w <= 999) {lcd.print(" "); } if(counter_w <= 99.9) {lcd.print(" "); } if(counter_w <= 9.9) {lcd.print(" "); } lcd.print(counter_w); lcd.print(" "); lcd.setCursor(0, 3); lcd.print("AIRCONTROL "); if(airControl <= 999) {lcd.print(" "); } if(airControl <= 99.9) {lcd.print(" "); } if(airControl <= 9.9) {lcd.print(" "); } lcd.print(airControl); lcd.print(" "); } delay(200); } Arduino_Heat_Control_WW_mod.rar Link spre comentariu
lucian_v Postat Mai 12, 2017 Partajează Postat Mai 12, 2017 Felicitari pentru proiect, foarte frumos ce ati realizat. O intrebare am daca nu va deranjeaza : cum comandati din arduino pompa aceea grundfos? adica cum ii schimbati treptele de putere? Multumesc Link spre comentariu
mihaicozac Postat Mai 12, 2017 Autor Partajează Postat Mai 12, 2017 Pompa are senzori de presiune, temperatură şi debitmetru interni, şi în funcţie de cererea de fluid din instalaţie reglează automat turaţia. Eu doar o alimentez cu tensiune din automatizare când e cazul, restul este independent. Link spre comentariu
gica70 Postat Mai 13, 2017 Partajează Postat Mai 13, 2017 "Cat despre algoritmul de functionare nu i-ti fa griji..." Pentru ca aceste greseli de a scrie pe "iti", "imi" cu cratima se repeta foarte des in mediul "digital", pentru ca le fac chiar oamenii instruiti dar care s-au lasat dusi de val, doresc, doar, sa atrag atentia; deci fara suparare! Link spre comentariu
nico_2010 Postat Mai 13, 2017 Partajează Postat Mai 13, 2017 @gica70: esti off topic Link spre comentariu
Liviu M Postat Mai 13, 2017 Partajează Postat Mai 13, 2017 Sorry, off topicul de genul lui gica70 ar trebui acceptat. Stiu, sunt off-topic. Link spre comentariu
vasile eugen Postat Mai 13, 2017 Partajează Postat Mai 13, 2017 Felicitafi pentru proiect. Link spre comentariu
nico_2010 Postat Mai 15, 2017 Partajează Postat Mai 15, 2017 @Liviu M si gica70: sunteti offtopic pentru ca observatiile voastre vizeaza carente (indiferent de natura lor) ale unei persoane si nu ale ideii din topic. Ca urmare, pentru astfel de observatii va rog sa folositi mesageria privata. Link spre comentariu
lucian_v Postat Mai 18, 2017 Partajează Postat Mai 18, 2017 Pompa are senzori de presiune, temperatură şi debitmetru interni, şi în funcţie de cererea de fluid din instalaţie reglează automat turaţia. Eu doar o alimentez cu tensiune din automatizare când e cazul, restul este independent. Asta stiu ca am si eu dar eu am crezut ca o controlati dvs in sensul ca ii schimbati viteza de exemplu .. Va multumesc Link spre comentariu
Vizitator seda14us Postat Septembrie 30, 2017 Partajează Postat Septembrie 30, 2017 Felicitari... Este super,asa ceva. 100% best... Link spre comentariu
Vizitator seda14us Postat Octombrie 3, 2017 Partajează Postat Octombrie 3, 2017 Ai mai lucrat la Proiect ? Ma intereseaza daca ai mai lucrat la software... ma intereseaza si pe mine... Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum