Sari la conținut
ELFORUM - Forumul electronistilor

Automatizare încălzire casă cu Arduino


mihaicozac

Postări Recomandate

  • 4 luni mai târziu...

Variantă nouă de cod, conţine câteva îmbunătăţiri:

 

-citirea temperaturii gazelor de evacuare se face într-o arie cu 20 de locuri, pt. obţinerea unei valori stabile care nu zăpăceşte automatizarea, mai ales în zona de comutare pe motorină.

 

-în faza de aprindere a focului cu soba rece era nevoie să se ţină uşiţa deschisă până soba se încălzea la 36C şi intra în funcţiune automatizarea, acuma e suficient să se dea reset la Arduino şi clapeta se deschide la maximum cu soba rece până atinge temperatura setată.

 

-timerul de comutare lemne/motorină are 2 constante diferite de lucru, laa încălzirea sobei cu lemne coboară de 10 ori mai repede decât la răcirea ei.

 

-afişajul arată acum şi valorile contoarelor de comutare lemne/motorină şi cel de comandă a pompei de la încărcarea boilerului de apă caldă.

int presetInput, airControl, tempDiff1, tempDiff2, motorDrive,  motorPosition, positionError, wwMode, power, counter_a, counter_w, main_display;
double preset_T, actual_T, exhaust_T, warmWater_T1, warmWater_T2, forward_T, forward_h, forward_w, return_T;
long counter_d;
const int samples = 20;

int exhaust[samples];                                                      // ARIA CITIRI TEMPERATURA GAZE EVACUARE SOBA LEMNE LEMNE
int index = 0;                                                             // INDEXUL ARIEI
int total = 0;                                                             // SUMA VALORILOR ARIEI
int average = 0;                                                           // MEDIA VALORILOR ARIEI

void setup() {
  lcd.begin(20, 4);
  airControl = 0;
  motorDrive = 127;
  counter_a = 1023;
  counter_d = 100000;
  counter_w = 127;
  pinMode[0, OUTPUT];
  pinMode(1, OUTPUT);                                                      //COMANDA TREAPTA POMPA INCARCARE BOILER.
  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);
  for (int sample = 0; sample < samples; sample++) {
    exhaust[sample] = 0;}                                            //INITIALIZAREA ARIEI CITIRE SENZOR TEMP GAZELOR DE ARDERE.
}

void loop() {
  
  //CITIRE DATE
  
  presetInput = analogRead(A0);                                            //POTENTIOMETRU REGLAJ TEMPERATURA SOBA LEMNE.
  actual_T = analogRead(A1);                                               //SENZOR TEMPERATURA LEMNE.
  actual_T = actual_T * 1.05 - 55;                                         //COMPENSAREA ABATERII.
  actual_T = constrain(actual_T, 0, 1023);                                  
  exhaust_T = average;                                                     //SENZOR TEMPERATURA GAZE EVACUARE.
  exhaust_T = exhaust_T - 0.5;
  exhaust_T = constrain(exhaust_T, 0, 1023);
  forward_h = analogRead(A4);                                              //SENZOR TEMP TUR BOILER.
  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 BOILER MIJLOC.
  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 TEMP LEMNE LA 45-75C
  power = actual_T - return_T;

  total = total - exhaust[index];
  exhaust[index] = analogRead(A2);
  total = total + exhaust[index];
  index = index + 1;
  if (index >= samples) {
    index = 0;
  }
  average = total / samples;                                               //CALCUL VALOARE MEDIE TEMP GAZE EVACUARE LEMNE.
  
  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 BOILER.  
  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) && (counter_a == 0)) {           //DACA NU E PE FAZA DE INITIERE APRINDERE FOC
      airControl = min(32, airControl);}                                   //LA SFIRSITUL ARDERII SE LIMITEAZA DEBITUL DE AER.                                   
  if(power < 30 || (actual_T < 360 && exhaust_T < 85)) {
      counter_a--;
      }
      else {counter_a = 1023;
      }        
  counter_a = max(counter_a, 0);                                           //OPRESTE AERUL DACA SE TERMINA JARUL SI
  if(counter_a == 0) {                                                     //DACA VATRA S-A RACIT ASTFEL SE REDUC 
      airControl = 0;                                                      //PIERDERILE DE CALDURA PE COS.
      }                                                                    
   
      
                                                                           
                                                                            
                                                                           
  if ((power > 65 || actual_T > 430) && (forward_T < actual_T))  {
       counter_d-=100;}                             
  else if (((power <= 60) || (forward_T < 400) || (actual_T < forward_T)) && (exhaust_T < 80)) {
       counter_d++;} 
  counter_d = constrain(counter_d, 0, 100000);                             //TEMPORIZAREA COMUTARII ARZATOR MOTORINA

  if (counter_d == 0) {
    digitalWrite(9, LOW);}
  else if(counter_d == 100000) {
    digitalWrite(9, HIGH);}                                                //PORNESTE ARZATORUL PE MOTORINA.  
                                                                          
  positionError = (airControl * 4) - motorPosition;                       
  if((positionError < 32) && (positionError > -32)) {
    digitalWrite(8, LOW);}                                                 //NEGLIJEAZA JOCURILE MECANICE SI
  else{                                                                    //ALIMENTEAZA MOTORUL CLAPETEI DOAR
    digitalWrite(8, HIGH);}                                                //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 > 360) || (forward_T > 360)) {
    digitalWrite(13, HIGH);}                                               
  else if((actual_T < 350) && (forward_T < 350)) {                         
         digitalWrite(13, LOW);}}                                          //OPRESTE POMPA DE RECIRCULARE
  else {                                                                   //DACA TEMPERATURA AGENTULUI SCADE SUB PRAG
    digitalWrite(13, LOW);}                                                //SAU DACA PORNESTE POMPA DE INCARCARE BOILER.

  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 GRAD DE ABSORBTIE CALDURA IN BOILER.
  }
                                                                    
  counter_w = constrain(counter_w, 0, 255);
                                                                           
  if(counter_w > 254) {                                                    //SE COMUTA TREPTELE POMPA INCARCARE BOILER.
     digitalWrite(0, LOW);                                                 
     digitalWrite(1, LOW);}                                                //VITEZA MAXIMA.
  if (counter_w <= 127 && counter_w > 0) {
     digitalWrite(0, LOW);                                                 
     digitalWrite(1, HIGH);}                                               //VITEZA MEDIE.
  if (counter_w == 0) {
     digitalWrite(0, HIGH);                                                
     digitalWrite(1, HIGH);}                                               //VITEZA MINIMA.
                                                                           
   
  //AFISARE DATE

  main_display = digitalRead(10);

  if(main_display) {
    lcd.setCursor(0, 0);
    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, 0);
    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, 1);
    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, 1);
    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, 2);
    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, 2);
    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");
    lcd.setCursor(0,3);
    lcd.print("CND  ");
    if(counter_d <= 99999) {lcd.print(" "); }
    if(counter_d <= 9999) {lcd.print(" "); }
    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(10, 3);
    lcd.print("CNW  ");
    if(counter_w <= 999) {lcd.print(" "); }
    if(counter_w <= 99.9) {lcd.print(" "); }
    if(counter_w <=  9.9) {lcd.print(" "); }
    lcd.print(counter_w);
    }
  else {
    lcd.setCursor(0, 0);
    lcd.print("COUNTER_A   ");
    if(counter_a <= 999) {lcd.print(" "); }
    if(counter_a <= 99.9) {lcd.print(" "); }
    if(counter_a <=  9.9) {lcd.print(" "); }
    lcd.print(counter_a);
    lcd.print("    ");
     
    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);
}

Link spre comentariu
  • 1 an 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