Sari la conținut
ELFORUM - Forumul electronistilor

Automatizare încălzire casă cu Arduino


mihaicozac

Postări Recomandate

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:

 

Posted Image

 

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.

 

Posted Image

 

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:

 

Posted Image

 

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:

 

Posted Image

 

 

Posted Image

 

 

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:

 

 

Posted Image

 

Î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ă:

 

 

Posted Image

 

 

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ă:

 

 

Posted Image

 

 

Î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:

 

 

Posted Image

 

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:

 

 

Posted Image

 

 

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":

 

 

Posted Image

 

 

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.

 

 

Posted Image

 

 

 

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:

 

 

Posted Image

 

 

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.

 

 

Posted Image

 

 

 

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 de mihaicozac
Link spre comentariu

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
  • 4 săptămâni mai târziu...
  • 5 săptămâni mai târziu...

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
  • 4 săptămâni mai târziu...

"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

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
  • 4 luni mai târziu...

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări