// Controllo temperatura: con Arduino nano 5V ATmega 328.. #include #include #include #include #include // per conservare dati anche dopo spegnimento LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); #define pad A0 // tastiera settaggi int lpad; int vapiup = 395; // valore pin, pulsante int vapidw = 300; int vapiset = 180; int vapidif = 60; // margine tolleranza byte programma = 1; // programma 1 = yogurt. 2 = riscaldamento. 3 = raffreddamento int ore = 0; // ore trascorse int min = 0; // minuti trascorsi int sec = 0; // secondi trascorsi float millesimi = 0; // copia millis() float millesore = 0; // per calcolo minuti dopo ore float millesmin = 0; // per calcolo secondi dopo minuti float temp = 0.0; // Temperatura letta int impostata = 20; // Temperatura impostata int orei = 3; // ore impostate int posrele = 0; // posizione relč 0 = off, 1 = on int scelta = 0; // per entrare nei settaggi long tempominimo = 0; // tempo minimo mantenimento posizione byte finetempominimo = 0; // long contavvio = 0; // tempo funzionamento compressore, continuo byte avvio = 0; // segna prima accensione del compressore int secmin = 30; // mantenere posizione relč x.. long tempo = 0; // tempo menu long minon = 0; // minuti dall'accensione #define RELAY 5 // pin relč #define ds18b20 2 // Il terminale data del sensore č connesso alla porta 12 di Arduino // Imposta la comunicazione oneWire per comunicare OneWire oneWire(ds18b20); // Passaggio oneWire reference alla Dallas Temperature. DallasTemperature sensors(&oneWire); // setup /// setup /// setup /// setup /// setup /// setup /// void setup() { // Start up the library sensors.begin(); // Devo inizializzare il display LCD 20 caratteri per 4 linee lcd.begin(16, 2); // Pulisce l'LCD e pone il cursore all'inizio lcd.clear(); Serial.begin(9600); Wire.begin(); //Start Serial // pulsanti pinMode( pad, INPUT ); analogReference( DEFAULT ); // "DEFAULT" 5.5.. "INTERNAL" 1.1.. // relay pinMode(RELAY, OUTPUT); digitalWrite(RELAY, HIGH); if (EEPROM.read(0) != 27) // se indirizzo zero diverso 27, aggiorna EEPROM { EEPROM.write(0, 27); EEPROM.write(1, impostata); EEPROM.write(2, orei); EEPROM.write(3, programma); } impostata = EEPROM.read(1); // legge valori salvati in EEPROM orei = EEPROM.read(2); programma = EEPROM.read(3); } // loop /// loop /// loop /// loop //// loop /// loop void loop() { pulsante(); // --- controllo pulsanti ------ printlcd(); // ------ PROGRAMMA 1 ---------------- if ((programma == 1) && (orei == 0)) {goto unozero; } if ((programma == 1) && (ore < orei)) { unozero: // da goto pulsante(); // --- controllo pulsanti ------ temperatura(); timer(); if (millis() > tempominimo) // finito tempo minimo, verifica condizioni --- { // Dopo tre minuti ON, pausa 30 secondi if ((minon != 0) && (millis() >= minon + 180000)) // 180M 3 minuti { digitalWrite(RELAY, HIGH); posrele = 0; tempominimo = millis() + 30000; lcd.clear(); lcd.print(" Pausa 30s"); minon = 0; delay(2000); finetempominimo = 0; goto salta; } // se temperatura sotto, ----------------- ON --|| if (temp < impostata) {posrele = 1; if (finetempominimo != 1) {tempominimo = millis() + (secmin * 1000); finetempominimo = 1; minon = millis();} // memorizza millis, prima volta } // se temperatura sopra, ----------------- OFF --|| if (temp > impostata) {posrele = 0; minon = 0; if (finetempominimo != 2) {tempominimo = millis() + (secmin * 1000); finetempominimo = 2;} // memorizza millis, prima volta } } } // FINE programma 1 salta: // da goto if ((programma == 2) && (orei == 0)) {goto duezero; } if ((programma == 2) && (ore < orei)) { duezero: // da goto pulsante(); // --- controllo pulsanti ------ temperatura(); timer(); if (millis() > tempominimo) // finito tempo minimo, verifica condizioni --- { // se temperatura sotto, ----------------- ON --|| if (temp < impostata) {posrele = 1; if (finetempominimo != 1) {tempominimo = millis() + (secmin * 1000); finetempominimo = 1; minon = millis();} // memorizza millis, prima volta } // se temperatura sopra, ----------------- OFF --|| if (temp > impostata) {posrele = 0; minon = 0; if (finetempominimo != 2) {tempominimo = millis() + (secmin * 1000); finetempominimo = 2;} // memorizza millis, prima volta } } } // FINE programma 2 if ((programma == 3) && (orei == 0)) {goto trezero; } if ((programma == 3) && (ore < orei)) { trezero: // da goto pulsante(); // --- controllo pulsanti ------ temperatura(); timer(); if (millis() > tempominimo) // finito tempo minimo, verifica condizioni --- { // se temperatura sopra, ----------------- ON --|| if (temp > impostata) {posrele = 1; if (finetempominimo != 1) {tempominimo = millis() + (secmin * 1000); finetempominimo = 1; minon = millis();} // memorizza millis, prima volta } // se temperatura sotto, ----------------- OFF --|| if (temp < impostata) {posrele = 0; minon = 0; if (finetempominimo != 2) {tempominimo = millis() + (secmin * 1000); finetempominimo = 2;} // memorizza millis, prima volta } } } // FINE programma 3 if ((ore >= orei) && (orei != 0)) { tempo = millis(); digitalWrite(RELAY, HIGH); posrele = 0; lcd.clear(); // Messaggio fine tempo lcd.setCursor(0, 0); // colonna, riga lcd.print(" FINE "); lcd.setCursor(0, 1); lcd.print(" TEMPO "); while (millis() < tempo + 2000) //2 sec. { pulsante(); } lcd.clear(); printlcd(); tempo = millis(); while (millis() < tempo + 2000) //2 sec. { pulsante(); timer();} } // FINE messaggio relay(); // aziona relč // serialprint(); } // FINE loop ... FINE loop ... FINE loop ... FINE loop ... FINE loop ... //// void //// void //// void //// void //// void //// void void printlcd () // aggiorna LCD { lcd.setCursor(0, 0); lcd.print(" "); // colonna, riga lcd.setCursor(0, 0); lcd.print("T"); lcd.print (temp); lcd.print(" di"); lcd.print (impostata); lcd.setCursor(14, 0); // colonna, riga lcd.print("P"); lcd.print (programma); lcd.setCursor(0, 1); lcd.print(" "); // colonna, riga lcd.setCursor(0, 1); lcd.print("h"); lcd.print (ore); lcd.print(":"); lcd.print (min); lcd.print("."); lcd.print (sec); lcd.setCursor(8, 1); lcd.print(" di"); lcd.print (orei); lcd.setCursor(14, 1); // colonna, riga lcd.print("R"); lcd.print (posrele); } void relay () { // ON relč { if (posrele == 1) {digitalWrite(RELAY, LOW);} } // ON relč { if (posrele == 0) {digitalWrite(RELAY, HIGH);} } } void timer () // calcola ore, minuti, secondi { millesimi = millis(); if (millesimi > 3600000) {ore = millesimi / 3600000; millesore = ore * 3600000; min = (millesimi - millesore) / 60000; millesmin = min * 60000 + millesore; sec = (millesimi - millesmin) / 1000;} if (millesimi < 3600000) {ore = 0; min = millis() / 60000; millesmin = min * 60000; sec = (millesimi - millesmin) / 1000;} } void temperatura () // legge la temperatura { sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura temp = sensors.getTempCByIndex(0); } void pulsante () // lettura pin per menů { lpad = analogRead(pad); if (lpad < 900) {menu();} } // fine void pin () // lettura pin per settaggi { lpad = analogRead(pad); } // fine lettura pin void serialprint () { Serial.print("millis() : "); Serial.print(millis ()); Serial.print(" millesimi : "); Serial.println(millesimi); Serial.print("min : "); Serial.print(min); Serial.println(); } // FINE serial print void menu () // -- menů -- -- menů -- -- menů -- -- menů -- -- menů -- { tempo = millis(); lcd.clear(); lcd.print(" Set salta"); delay (1500); digitalWrite(RELAY, HIGH); posrele = 0; // Set. Temperatura while (millis() < tempo + 7000) //7 sec. { pin (); // verifica pin pad lcd.setCursor(0, 0); // colonna, riga lcd.print("Temperatura <>"); lcd.setCursor(0, 1); lcd.print(">"); lcd.print(impostata); if (( lpad <= vapiup + vapidif ) && ( lpad >= vapiup - vapidif )) { impostata ++; lcd.clear(); delay (500); tempo = millis(); if (impostata > 45) {impostata = 45;} EEPROM.write(1, impostata); } if (( lpad <= vapidw + vapidif ) && ( lpad >= vapidw - vapidif )) { impostata --; lcd.clear(); delay (500); tempo = millis(); if (impostata < 0) {impostata = 0;} EEPROM.write(1, impostata); } if (( lpad <= vapiset + vapidif ) && ( lpad >= vapiset - vapidif )) { lcd.clear(); delay(1000); lcd.clear(); break; } } // FINE Temperatura tempo = millis(); lcd.clear(); // Imposta ora while (millis() < tempo + 7000) //7 sec. { pin (); // verifica pin pad lcd.setCursor(0, 0); // colonna, riga lcd.print("Ore.. o = full"); lcd.setCursor(0, 1); lcd.print(">"); lcd.print(orei); if (( lpad <= vapiup + vapidif ) && ( lpad >= vapiup - vapidif )) { orei ++; lcd.clear(); delay (500); tempo = millis(); if (orei > 10) {orei = 10;} EEPROM.write(2, orei); } if (( lpad <= vapidw + vapidif ) && ( lpad >= vapidw - vapidif )) { orei --; lcd.clear(); delay (500); tempo = millis(); if (orei < 1) {orei = 0;} EEPROM.write(2, orei); } if (( lpad <= vapiset + vapidif ) && ( lpad >= vapiset - vapidif )) { lcd.clear(); delay(1000); lcd.clear(); break; } } // FINE ora tempo = millis(); lcd.clear(); // Set. Istruzioni Programma while (millis() < tempo + 7000) //7 sec. { pin (); // verifica pin pad lcd.setCursor(0, 0); // colonna, riga lcd.print("Program. 1yogurt"); lcd.setCursor(0, 1); lcd.print("2riscald 3raffre"); if (( lpad <= vapiset + vapidif ) && ( lpad >= vapiset - vapidif )) { lcd.clear(); delay(1000); lcd.clear(); break; } } // FINE istruzioni scelta programma tempo = millis(); lcd.clear(); // Imposta programma while (millis() < tempo + 7000) //7 sec. { pin (); // verifica pin pad lcd.setCursor(0, 0); // colonna, riga lcd.print("Programma <>"); lcd.setCursor(0, 1); lcd.print(">"); lcd.print(programma); if (( lpad <= vapiup + vapidif ) && ( lpad >= vapiup - vapidif )) { programma ++; lcd.clear(); delay (500); tempo = millis(); if (programma > 3) {programma = 3;} EEPROM.write(3, programma); } if (( lpad <= vapidw + vapidif ) && ( lpad >= vapidw - vapidif )) { programma --; lcd.clear(); delay (500); tempo = millis(); if (programma < 2) {programma = 1;} EEPROM.write(3, programma); } if (( lpad <= vapiset + vapidif ) && ( lpad >= vapiset - vapidif )) { lcd.clear(); delay(1000); lcd.clear(); break; } } // FINE scelta programma lcd.clear(); } // FINE void menu /* Termostato con timer - Programma 1: Yogurt, controllo temperatura, e tempo. Dopo tre minuti acceso, pausa 30 secondi. - Programma 2: Riscaldamento, e controllo tempo. - Programma 3: Raffreddamento, e controllo tempo. Opzioni - Se timer 0 ore = funzionamento continuo. */