Qualche giorno fa mi ha scritto un appassionato: Gregory per raccontarmi il suo progetto di irrigazione arduino:
Gregory ha realizzato una sua personale versione della centralina di irrigazione arduino e lo ha fatto anche prima che io pubblicassi i miei esperimenti.
Gregory ha realizzato anche un blog in cui pubblica i suoi lavori, veramente ben fatto graficamente e con una filosofia già nel titolo che ti accoglie:
Il progetto di irrigazione arduino descritto sul blog di Gregory è molto interessante perchè arricchisce quello da me pubblicato “irrigare con Arduino” aggiungendo la possibilità di irrigare 3 differenti zone:
- un orto
- un campo di patate
- un frutteto
e lasciarti la possibilità di avere una uscita per la canna.
Inoltre Gregory è davvero attento all’ambiente ed ha costruito delle cisterne in cui raccoglie l’acqua piovana ottenendo almeno due ottimi risultati:
- riutilizza acqua piovana, risparmiando il consumo di acqua corrente
- irriga i propri terreni con acqua
ricca di sali minerali che fanno davvero bene alle coltivazioninon contaminata da agenti chimici
Lo schema elettrico
Lo schema elettrico utilizzato per il progetto è il seguente:
replicato per ciascuna delle elettrovalvole che vuoi controllare.
Lo sketch dell’irrigazione arduino di Gregory
Ho chiesto a Gregory di inviarmi lo sketch pe poterlo condividere ed ha confermato la mia prima intuizione: è davvero una splendida persona e disponibile a condividere i suoi successi con altri appassionati.
/* * SISTEMA DI IRRIGAZIONE IRRIGREG * 3 linee di irrigazione con comando manuale e automatico * + sistema di travaso tra due cisterne * * http://gregmaracas.blogspot.it/ */ #include <DS1307new.h> #include <Wire.h> int patate = 10; int frutta = 9; int orto = 8; int travaso = 11; int pompa = 7; int h_alarm = 15; int m_alarm = 30; int fine_alarm = 44; int h_alarm_frutta = 6; int m_alarm_frutta = 01; int fine_alarm_frutta = 15; int h_alarm_patate = 6; int m_alarm_patate = 16; int fine_alarm_patate = 31; boolean active_orto = false; boolean active_orto_man = false; boolean active_patate = false; boolean active_patate_man = false; boolean active_frutta = false; boolean active_frutta_man = false; boolean travaso_int = false; boolean orto_int = false; boolean frutta_int = false; boolean patate_int = false; boolean pompa_int = false; void setup() { Serial.begin(9600); //inizializzo la seriale pinMode (travaso, OUTPUT); pinMode (frutta, OUTPUT); pinMode (patate, OUTPUT); pinMode (orto, OUTPUT); pinMode (pompa, OUTPUT); pinMode (2, INPUT); pinMode (3, INPUT); pinMode (4, INPUT); pinMode (5, INPUT); pinMode (6, INPUT); digitalWrite(travaso, LOW); digitalWrite(frutta, LOW); digitalWrite(orto, LOW); digitalWrite(patate, LOW); digitalWrite(pompa, LOW); Wire.begin(); //inizializzo la libreria wire /*parte commentata da utilizzare solo per rimettere l'orologio, questione da sviluppare*/ //RTC.stopClock(); //RTC.fillByYMD(2013,4,21); //RTC.fillByHMS(14,39,0); //RTC.setTime(); //RTC.startClock(); //RTC.adjust(DateTime(__DATE__, __TIME__)); } /*nuovo loop con libreria DS1307new*/ void loop() { RTC.getTime(); //abilito l'acquisizione dei dati Serial.println(" "); Serial.println("giorno della settimana"); switch (RTC.dow) { case 1: Serial.print("LUNEDI'"); break; case 2: Serial.print("MARTEDI'"); break; case 3: Serial.print("MERCOLEDI'"); break; case 4: Serial.print("GIOVEDI'"); break; case 5: Serial.print("VENERDI'"); break; case 6: Serial.print("SABATO"); break; case 0: Serial.print("DOMENICA"); break; } Serial.println(" "); Serial.println(" "); Serial.println("GG/MM/AAAA"); Serial.print(RTC.day, DEC); Serial.print("/"); Serial.print(RTC.month, DEC); Serial.print("/"); Serial.print(RTC.year, DEC); Serial.println(" "); Serial.println(" "); Serial.println("hh:mm:ss"); Serial.print(RTC.hour, DEC); Serial.print(":"); Serial.print(RTC.minute, DEC); Serial.print(":"); Serial.print(RTC.second, DEC); Serial.println(" "); Serial.print(RTC.dow, DEC); delay (1000); if ((!travaso_int) && (!patate_int) && (!frutta_int) && (!orto_int) && (!pompa_int)) { fermato(); } if (digitalRead(5) == HIGH) { digitalWrite(frutta, LOW); digitalWrite(orto, LOW); digitalWrite(patate, LOW); digitalWrite(travaso, LOW); delay (1000); digitalWrite(pompa, HIGH); pompa_int = true; } else { pompa_int = false; } if (digitalRead(6) == HIGH) { //travaso faitravaso(); travaso_int = true; } else { travaso_int = false; } if (digitalRead(3) == HIGH) { //frutta irrigazione_frutta(); frutta_int = true; } else { frutta_int = false; } if (digitalRead(4) == HIGH) { //patate irrigazione_patate(); patate_int = true; } else { patate_int = false; } if (digitalRead(2) == HIGH) { //orto irrigazione_orto(); orto_int = true; } else { orto_int = false; } // automatico orto: lunedi mercoledi venerdi domenica if ((!active_orto) && (RTC.hour == h_alarm) && ((RTC.dow == 1) || (RTC.dow == 3) || (RTC.dow == 5) || (RTC.dow == 0)) && (RTC.minute >= m_alarm) && (!pompa_int) && (!travaso_int) && (!orto_int) && (!travaso_int) && (!frutta_int) && (!patate_int)) { irrigazione_orto(); } if ((active_orto) && (RTC.hour == h_alarm) && (RTC.minute >= fine_alarm) && (!pompa_int) && (!travaso_int) && (!orto_int) && (!travaso_int) && (!frutta_int) && (!patate_int)) { fermato(); active_orto = false; } //automatico frutta: martedì giovedi sabato if ((!active_frutta) && (RTC.hour == h_alarm_frutta) && ((RTC.dow == 2) || (RTC.dow == 4) || (RTC.dow == 6)) && (RTC.minute >= m_alarm_frutta) && (!pompa_int) && (!travaso_int) && (!orto_int) && (!travaso_int) && (!frutta_int) && (!patate_int)) { irrigazione_frutta(); } if ((active_frutta) && (RTC.hour == h_alarm_frutta) && (RTC.minute >= fine_alarm_frutta) && (!pompa_int) && (!travaso_int) && (!orto_int) && (!travaso_int) && (!frutta_int) && (!patate_int)) { fermato(); active_frutta = false; } //automatico patate: martedì giovedi sabato in coda alla frutta if ((!active_patate) && (RTC.hour == h_alarm_patate) && ((RTC.dow == 2) || (RTC.dow == 4) || (RTC.dow == 6)) && (RTC.minute >= m_alarm_patate) && (!pompa_int) && (!travaso_int) && (!orto_int) && (!travaso_int) && (!frutta_int) && (!patate_int)) { irrigazione_patate(); } if ((active_patate) && (RTC.hour == h_alarm_patate) && (RTC.minute >= fine_alarm_patate) && (!pompa_int) && (!travaso_int) && (!orto_int) && (!travaso_int) && (!frutta_int) && (!patate_int)) { fermato(); active_patate = false; } } void irrigazione_orto() { digitalWrite(frutta, LOW); digitalWrite(orto, HIGH); digitalWrite(patate, LOW); digitalWrite(travaso, LOW); delay (1000); digitalWrite(pompa, HIGH); } void irrigazione_frutta() { digitalWrite(frutta, HIGH); digitalWrite(orto, LOW); digitalWrite(patate, LOW); digitalWrite(travaso, LOW); delay (1000); digitalWrite(pompa, HIGH); } void irrigazione_patate() { digitalWrite(frutta, LOW); digitalWrite(orto, LOW); digitalWrite(patate, HIGH); digitalWrite(travaso, LOW); delay (1000); digitalWrite(pompa, HIGH); } void fermato() { digitalWrite(frutta, LOW); digitalWrite(orto, LOW); digitalWrite(patate, LOW); digitalWrite(travaso, LOW); digitalWrite(pompa, LOW); } void faitravaso() { digitalWrite(frutta, LOW); digitalWrite(orto, LOW); digitalWrite(patate, LOW); digitalWrite(travaso, HIGH); //da collegare due elettrovalvole in parallelo digitalWrite(pompa, HIGH); }
Il codice è scritto in modo chiaro per cui non dovresti avere difficoltà a comprenderne il funzionamento, evidenzio solo le parti più complesse dal punto di vista logico:
int patate = 10; int frutta = 9; int orto = 8; int travaso = 11; int pompa = 7;
in queste prime righe trovi l’impostazione dei pin corrispondenti a ciascuna delle zone:
- patate
- frutteto
- orto
- travaso da cisterna a cisterna
- canna o pompa a mano
int h_alarm = 15; int m_alarm = 30; int fine_alarm = 44; int h_alarm_frutta = 6; int m_alarm_frutta = 01; int fine_alarm_frutta = 15; int h_alarm_patate = 6; int m_alarm_patate = 16; int fine_alarm_patate = 31;
// automatico orto: lunedi mercoledi venerdi domenica if ((!active_orto) && (RTC.hour == h_alarm) && ((RTC.dow == 1) || (RTC.dow == 3) || (RTC.dow == 5) || (RTC.dow == 0)) && (RTC.minute >= m_alarm) && (!pompa_int) && (!travaso_int) && (!orto_int) && (!travaso_int) && (!frutta_int) && (!patate_int)) { irrigazione_orto(); }
void irrigazione_orto() { digitalWrite(frutta, LOW); digitalWrite(orto, HIGH); digitalWrite(patate, LOW); digitalWrite(travaso, LOW); delay (1000); digitalWrite(pompa, HIGH); }
Il cui scopo è inviare un comando di tipo digitalWrite( pin,HIGH ) al settore corrispondente.
Buona irrigazione !!!
Prima di inserire un commento, per favore, leggi il regolamento
10 pings
Skip to comment form