mihaicozac Postat Octombrie 4, 2017 Autor Partajează Postat Octombrie 4, 2017 Nu am avut motive, sistemul funcţionează destul de bine, eu sunt mulţumit. Am vrut să adaug o rutină de control a unei instalaţii solare, însă anul ăsta n-am mai cumpărat nimic, poate la anul. Link spre comentariu
mihaicozac Postat Februarie 5, 2018 Autor Partajează Postat Februarie 5, 2018 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
gica70 Postat Februarie 5, 2018 Partajează Postat Februarie 5, 2018 Toata admiratia! Astept si alte implementari. Link spre comentariu
ROBERT78 Postat Martie 19, 2019 Partajează Postat Martie 19, 2019 Felicitari intradevar e o realizare mare 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