zahariaiulian Postat Ianuarie 16, 2016 Partajează Postat Ianuarie 16, 2016 Salut,am urmatorul cod de mai jos. Intre temperatura 0 grade si 30 pompa imi sta oprita. De la 31 imi pleaca pompa si se opreste la 34 in sus. Acum cand incepe si imi scade temperatura sub 34 grade imi pleaca din nou pompa. Aici e buba. Vreau sa fac in asa fel sa nu mai porneasca la scadere de loc. Doar cand isi face ciclul, sa zic ca scade sub 20 grade si cand ajunge iar la 31 sa plece.. //////////////////////////////////////////////// Pompa 2 ///////////////////////////////////////////////////////////////if (temperature >= 0 && temperature <= 30) { digitalWrite(P2, HIGH); // Opreste pompa 2 lcd.setCursor(9,1); lcd.print("0"); }if (temperature >= 31) { digitalWrite(P2, LOW); // Activeaza pompa 2 lcd.setCursor(9,1); lcd.print("1"); }if (temperature >= 34 ) { digitalWrite(P2, HIGH); // Opreste pompa 2 lcd.setCursor(9,1); lcd.print("0"); } //-----------------------------------------------Sfarsit cod-----------------------------------------------------------// Link spre comentariu
Liviu M Postat Ianuarie 16, 2016 Partajează Postat Ianuarie 16, 2016 Iti mai trebuie o variabila cu care sa activezi/deactivezi pomparea. #define TEMP_ACTIVARE_POMPA 20 /*pragul la care activezi pompa*/boolean bNevoieSaPompez = false; //memoreaza starea pompei Activezi pompa la temperatura care te intereseaza: if((temperature < TEMP_ACTIVARE_POMPA) && (bNevoieSaPompez== false)){ bNevoieSaPompez = true;} Modifici conditia de pornit a pompei: if ((temperature >= 31) && bNevoieSaPompez){ digitalWrite(P2, LOW); // Activeaza pompa 2 lcd.setCursor(9,1); lcd.print("1");} Dezactivezi pompa cand ajunge la pragul de sus. Cred c-o puteai activa si in if-ul anterior, ca-i suficient sa pornesti pompa o singura data. Cum ti se pare tie mai bine/clar. if (temperature >= 34 ) { digitalWrite(P2, HIGH); // Opreste pompa 2 lcd.setCursor(9,1); lcd.print("0"); bNevoieSaPompez = false; //deactiveaza pompa pana scade temperatura suficient.} Link spre comentariu
zahariaiulian Postat Ianuarie 16, 2016 Autor Partajează Postat Ianuarie 16, 2016 Imi poti explica care e faza cu memorarea? Link spre comentariu
Bandi Szasz Postat Ianuarie 16, 2016 Partajează Postat Ianuarie 16, 2016 (editat) Pompa proneste cand temperatura depaseste 31 de grade si valoarea memorata in "bNevoieSaPompez" este "true". Cand temperatura ajunge la 34 opreste pompa si memoreaza bNevoieSaPompez = false, impiedicand ca pompa sa plece din nou la 31 de grade findca bNevoieSaPompez nu este true cum ar trebuii ci este false. Cand temperatura ajunge sub 20 de grade seteaza bNevoieSaPompez = true care permite in momentul in care se incalzeste inapoi la 31 de grade se place pompa. Deci acea variabila impedica pompa sa porneasca din nou la 31de grade pana in momentul in care nu se raceste prima data pana la 20 de grade. Editat Ianuarie 16, 2016 de bandi12 Link spre comentariu
Liviu M Postat Ianuarie 16, 2016 Partajează Postat Ianuarie 16, 2016 Ce memorare? Comentariul de la bNevoieSaPompez? bNevoieSaPompez "memoreaza" starea sistemului - vine de la rece sau de la cald. In functie de valoarea acestei variabile, pompa porneste sau nu - if-ul de pornit pompa depinde si de variabila asta, nu doar de temperatura. In felul asta sistemul stie "directia" temperaturii. Intre timp a explicat si bandi12 cum functioneaza programul cu variabila respectiva. Link spre comentariu
zahariaiulian Postat Ianuarie 16, 2016 Autor Partajează Postat Ianuarie 16, 2016 Problema e ca mie imi sta pompa la 22.3 pornita. Acum afisez tot codul: // include the library code:#include <LiquidCrystal.h>#include <OneWire.h>int TEMP_ACTIVARE_POMPA = 35; /*pragul la care activezi pompa*/boolean bNevoieSaPompez = false; //memoreaza starea pompei int DS18S20_Pin = 6; //DS18S20 Signal pin on digital 2int P1 = 7; // pompa1int P2 = 8; // pompa2int P3 = 9; // pompa2//Temperature chip i/oOneWire ds(DS18S20_Pin); // on digital pin 2// initialize the library with the numbers of the interface pinsLiquidCrystal lcd(12, 11, 5, 4, 3, 2);void setup() { Serial.begin(9600); pinMode(P1, OUTPUT); pinMode(P2, OUTPUT); pinMode(P3, OUTPUT); // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. }void loop() { float temperature = getTemp(); Serial.println(temperature); lcd.setCursor(0,0);lcd.print("Temperatura:");lcd.print(temperature);lcd.setCursor(0,1);lcd.print("P1:");lcd.setCursor(6,1);lcd.print("P2:");lcd.setCursor(12,1);lcd.print("BK:"); //////////////////////////////////////////////// Pompa 1 ////////////////////////////////////////////////////////////// /* Pompa 1 porneste la 30 grade si se oprest la 26 grade */ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////if (temperature > 60 ) // Activeaza pompa 1 sub temperatura de 60 grade { digitalWrite(P1, LOW); lcd.setCursor(3,1); lcd.print("1"); } if (temperature < 55 ) // Dezactiveaza pompa 1 sub temperatura de 55 grade { lcd.setCursor(3,1); lcd.print("0"); digitalWrite(P1, HIGH); }//-----------------------------------------------Sfarsit cod-----------------------------------------------------------////////////////////////////////////////////////// Pompa 2 ///////////////////////////////////////////////////////////////if((temperature < TEMP_ACTIVARE_POMPA) && (bNevoieSaPompez == false)){ bNevoieSaPompez = true;}if ((temperature >= 35) && bNevoieSaPompez){ digitalWrite(P2, LOW); // Activeaza pompa 2 lcd.setCursor(9,1); lcd.print("1");}if (temperature >= 65 ) { digitalWrite(P2, HIGH); // Opreste pompa 2 lcd.setCursor(9,1); lcd.print("0"); bNevoieSaPompez = false; //deactiveaza pompa pana scade temperatura suficient.} if (temperature < 35){ digitalWrite(P2, LOW); // Activeaza pompa 2 lcd.setCursor(9,1); lcd.print("1");}//-----------------------------------------------Sfarsit cod-----------------------------------------------------------////////////////////////////////////////////////// Pompa 3 ///////////////////////////////////////////////////////////////if (temperature > 0 ) { digitalWrite(P3, LOW); // Activeaza pompa 3 lcd.setCursor(15,1); lcd.print("1"); }//-----------------------------------------------Sfarsit cod-----------------------------------------------------------//} float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; } Link spre comentariu
Liviu M Postat Ianuarie 16, 2016 Partajează Postat Ianuarie 16, 2016 (editat) E normal, bucatile astea doua activeaza pompa pe toata plaja de temperaturi < 65°. // include the library code:if ((temperature >= 35) && bNevoieSaPompez){ digitalWrite(P2, LOW); // Activeaza pompa 2 lcd.setCursor(9,1); lcd.print("1");}if (temperature < 35){ digitalWrite(P2, LOW); // Activeaza pompa 2 lcd.setCursor(9,1); lcd.print("1");}Sterge blocul cu if(temperature < 35) Editat Ianuarie 16, 2016 de Liviu M Link spre comentariu
zahariaiulian Postat Ianuarie 16, 2016 Autor Partajează Postat Ianuarie 16, 2016 (editat) L-am sters. Tot asa imi sta pompa. Problema este atunci cand alimentez arduino si am Temperatura 22 grade imi sta pompa 2 activata, cand trece de temperatura 65 si se opreste este ok. Editat Ianuarie 16, 2016 de zahariaiulian Link spre comentariu
Bandi Szasz Postat Ianuarie 16, 2016 Partajează Postat Ianuarie 16, 2016 In setup, nu ar trebuii : digitalWrite(P2, HIGH) ? Din cate stiu la pornire pin-ul este LOW din default si daca pompa pe LOW e pornita e si normal sa porneasca odata cu arduino. Link spre comentariu
zahariaiulian Postat Ianuarie 17, 2016 Autor Partajează Postat Ianuarie 17, 2016 In setup, nu ar trebuii : digitalWrite(P2, HIGH) ? Din cate stiu la pornire pin-ul este LOW din default si daca pompa pe LOW e pornita e si normal sa porneasca odata cu arduino. Da, ai dreptate. Dar chinezaria asta de placa cu relee pleaca cand ii dau LOW . Este exact invers. Va multumesc pentru ajutor. E normal, bucatile astea doua activeaza pompa pe toata plaja de temperaturi < 65°. // include the library code:if ((temperature >= 35) && bNevoieSaPompez){ digitalWrite(P2, LOW); // Activeaza pompa 2 lcd.setCursor(9,1); lcd.print("1");}if (temperature < 35){ digitalWrite(P2, LOW); // Activeaza pompa 2 lcd.setCursor(9,1); lcd.print("1");}Sterge blocul cu if(temperature < 35) Corect, in loc de LOW trebuia sa pun HIGH ca sa opreasca. Ma incurca chestia asta ca este inversat HIGH = oprire si LOW - pornire pe placa asta de relee :|. Multumesc! Link spre comentariu
Bandi Szasz Postat Ianuarie 17, 2016 Partajează Postat Ianuarie 17, 2016 Placa de relee nu are doua contacte ? Normal inchis si normal deschis ? Link spre comentariu
zahariaiulian Postat Ianuarie 17, 2016 Autor Partajează Postat Ianuarie 17, 2016 Ba da, ce legatura are asta? Trebuie sa le folosesc asa cum se foloseste un releu. NC = cand nu este alimentat Link spre comentariu
Bandi Szasz Postat Ianuarie 17, 2016 Partajează Postat Ianuarie 17, 2016 Nu exista "cum se foloseste un releu", ambele contacte sunt exact la fel si fiecare il foloseste cum vrea. Pompa pleaca pe LOW findca este legat pe NC adica cand releul nu este actionat, trebuie mutat pe NO care inseamna cand releul este actionat =>> cand e HIGH. Link spre comentariu
zahariaiulian Postat Ianuarie 18, 2016 Autor Partajează Postat Ianuarie 18, 2016 Nu exista "cum se foloseste un releu", ambele contacte sunt exact la fel si fiecare il foloseste cum vrea. Pompa pleaca pe LOW findca este legat pe NC adica cand releul nu este actionat, trebuie mutat pe NO care inseamna cand releul este actionat =>> cand e HIGH. NC = Normal close / NO = normal open. Deci e clara treaba. Il folosesc asa cum este el fara tensiune. Atunci cand ii dau LOW pe pin-ul X imi actioneaza RELEUL. Nu am pompe legate pe el sau alti consumatori. Iti dau un exemplu: if ( temp < de x grade ) { sa nu actioneze releul - adica LOW } Ehhh.... mie imi actioneaza releul aici! daca ii dau HIGH ii taie alimentarea ;), unde crezi ca e buba? Link spre comentariu
Liviu M Postat Ianuarie 18, 2016 Partajează Postat Ianuarie 18, 2016 @zahariaiulian: n-ai inteles, nu tu trebuie sa faci ce vrea releul, ci releul trebuie sa faca ce vrei tu. Cu alte cuvinte, desi ai dreptate referitor la semnificatia pinilor, nu esti obligat sa folosesti releul asa. Daca tie iti place mai mult sa opresti releul cand faci pinul LOW, nu e nici o problema *) daca ignori semnificatia pinilor si conectezi releul sa functioneze cum iti trebuie tie. Tu esti sefu'. *) Singura problema ar putea fi consumul de curent mai mare, daca inversand logica releul va fi alimentat mai mult timp. 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