//SELEZIONARE TUTTO E COPIARE IN UNA FINESTRA DELL'IDE //Aggiungo la libreria onewire va scaricata da http://www.pjrc.com/teensy/td_libs_OneWire.html // //ideato e realizzato da: antrec@geocities.com //CC BY-NC-SA 4.0 // //Versione che usa la stessa scheda del solare //pin ancora liberi A2-A3-A6-A7;D9 #include "OneWire.h" #include "Wire.h" #include "RTClib.h" RTC_DS1307 RTC; #define RELAY 4 //acqua #define RELAY1 5 //riscaldamento zona #define VENTOLA 6 //raffreddamento arduino OneWire ds(3); ////////////////////////////////////////////////////////////////////////////////////// // INIZIO DATI SETTABILI //Porta int ora_apertura = 8; int ora_chiusura = 17; int minuti_chiusura = 45; //Temperatura acqua int minima_acqua = 3; int massima_acqua = 6; //Lampada int temp_accensione = -5; int ora_spegnimento = 8; int ora_accensione = 18; //ventola int temp_ventola_on = 45; int temp_ventola_off = 35; ///////////////////////////////////////////////////////////////////////////////// int calcolo_minuti_chiusura= (ora_chiusura*60)+(minuti_chiusura); int calcolo_minuti_apertura= (ora_apertura*60); int calcolo_minuti_chiusura2; int calcolo_minuti_apertura2; // SENSORI fine corsa comando motore const int sensore_chiusura = 15; const int RELAY_chiusura = 7; int stato_sensore_chiusura = 1; const int sensore_apertura = 2; const int RELAY_apertura = 8; int stato_sensore_apertura = 1; //Variabile per memorizzare l'indirizzo della ram del DS1307 byte IndRam = 0x00; //array per la data (unixtime) byte Data[6]; int giorno; byte mese; int anno; int ore; int minuti; int secondi; float temp_scheda = -200; float temp_ambiente = -200; void setup() { //Apro la comunicazion seriale Serial.begin(9600); Wire.begin(); RTC.begin(); pinMode(RELAY, OUTPUT); pinMode(RELAY1, OUTPUT); pinMode(VENTOLA, OUTPUT); pinMode(RELAY_chiusura, OUTPUT); pinMode(sensore_chiusura, INPUT); pinMode(RELAY_apertura, OUTPUT); pinMode(sensore_apertura, INPUT); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop() {DateTime now = RTC.now(); ora_attuale(); temperatura(); acqua(); zona(); apertura_chiusura(); ventola(); } //VOID void temperatura() { byte i; byte present = 0; byte numero = 0; byte type_s; byte data[12]; byte addr[8]; float celsius; if ( !ds.search(addr)) { ds.reset_search(); delay(250); return; } if (OneWire::crc8(addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return; } switch (addr[0]) { case 0x10: type_s = 1; break; case 0x28: type_s = 0; break; case 0x22: type_s = 0; break; default: return; } ds.reset(); ds.select(addr); ds.write(0x44,1); delay(1000); present = ds.reset(); ds.select(addr); ds.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds.read(); } unsigned int raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw << 3; else if (cfg == 0x20) raw = raw << 2; else if (cfg == 0x40) raw = raw << 1; } celsius = (float)raw / 16.0; Serial.print("Codice sonda ="); Serial.write(' '); Serial.print(addr [1], DEC); Serial.write(' '); Serial.print("Nome sonda ="); Serial.write(' '); numero = addr [1], DEC; if (numero == 119) //sostituire il numero con quello che appare sul monitor seriale { Serial.print("Scheda"); Serial.write(' '); temp_scheda = celsius; } if (numero == 208) //sostituire il numero con quello che appare sul monitor seriale { Serial.print("Pollaio"); Serial.write(' '); temp_ambiente = celsius; } Serial.print("Temperatura = "); Serial.print(celsius); Serial.print(" C"); Serial.println(); Serial.println(); } void acqua(){ if (temp_ambiente < minima_acqua ){ digitalWrite(RELAY, HIGH);} else if (temp_ambiente > massima_acqua){ digitalWrite(RELAY, LOW); }} void zona() { if ((temp_ambiente=ora_accensione))){ digitalWrite(RELAY1, HIGH);} else { digitalWrite(RELAY1, LOW); } } void apertura_chiusura(){ switch (mese){ case 1: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+30));(calcolo_minuti_apertura2 = calcolo_minuti_apertura); break; //18,15 -- 8,00 case 2: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+60)); (calcolo_minuti_apertura2 = calcolo_minuti_apertura-60);break; //18,45 -- 7,00 case 3: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+105));(calcolo_minuti_apertura2 = (calcolo_minuti_apertura-60)); break;// 19,30 -- 7,00 case 4: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+140));(calcolo_minuti_apertura2 = (calcolo_minuti_apertura-120)); break; //20,05 -- 6,00 case 5: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+180)); (calcolo_minuti_apertura2 = (calcolo_minuti_apertura - 180));break; //20,45 -- 5,00 case 6: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+180)); (calcolo_minuti_apertura2 = (calcolo_minuti_apertura - 180)); break;//20,45 -- 5,00 case 7: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+165));(calcolo_minuti_apertura2 = (calcolo_minuti_apertura - 180)); break; //20,30 -- 5,00 case 8: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+110));(calcolo_minuti_apertura2 = (calcolo_minuti_apertura - 180));break; //19,35 -- 5,00 case 9: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+55)); (calcolo_minuti_apertura2 = (calcolo_minuti_apertura-120));break; // 18,40 -- 6,00 case 10: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+15));(calcolo_minuti_apertura2 = (calcolo_minuti_apertura-60)); break;// 18,00 -- 7,00 case 11: (calcolo_minuti_chiusura2 = calcolo_minuti_chiusura); (calcolo_minuti_apertura2 = calcolo_minuti_apertura);break;// 17,45 -- 8,00 case 12: (calcolo_minuti_chiusura2 = calcolo_minuti_chiusura);(calcolo_minuti_apertura2 = calcolo_minuti_apertura); break;// 17,45 -- 8,00 default: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura + 180)); (calcolo_minuti_apertura2 = (calcolo_minuti_apertura - 180)); //20,45 -- 5,00 } int ore_minuti = (ore*60)+(minuti); Serial.println("Pollaio2_5_bis calcoli con ora solare"); Serial.println(); //Serial.print("mese: "); // Serial.println(mese); Serial.print("Minuto attuale: "); Serial.println(ore_minuti); Serial.print("Apertura al minuto: "); Serial.println(calcolo_minuti_apertura2); Serial.print("Chiusura al minuto: "); Serial.println(calcolo_minuti_chiusura2); stato_sensore_chiusura = digitalRead(sensore_chiusura); stato_sensore_apertura = digitalRead(sensore_apertura); if ((ore_minuti=calcolo_minuti_chiusura2)){ if ((stato_sensore_chiusura) == LOW) {digitalWrite(RELAY_chiusura, HIGH); // delay(00); digitalWrite(RELAY_apertura, HIGH);} else{ digitalWrite(RELAY_chiusura, LOW); delay(200); digitalWrite(RELAY_apertura, HIGH);} } else{ if ((stato_sensore_apertura)== LOW) {digitalWrite(RELAY_apertura, HIGH); // delay (00); digitalWrite(RELAY_chiusura, HIGH);} else {digitalWrite(RELAY_apertura, LOW); delay(200); digitalWrite(RELAY_chiusura, HIGH);}} } void ventola() { {if (temp_scheda > temp_ventola_on ) digitalWrite(VENTOLA, HIGH);} {if (temp_scheda < temp_ventola_off) digitalWrite(VENTOLA, LOW);} } void ora_attuale() { DateTime now = RTC.now(); Serial.print("Ora letta dall'RTC :"); Serial.write(' '); Serial.print(now.day(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.year(), DEC); Serial.print(' '); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.println(now.second(), DEC); Serial.println(); Serial.println(); Serial.println(); Serial.println(); Serial.println("-------------------------------------"); ore = (now.hour()); minuti = (now.minute()); mese = (now.month()); }