La Centralina irrigazione arduino v2 è l’evoluzione del progetto presentato su questo blog circa quattro anni fa.
In questi anni le realizzazioni di questo progetto sono state tantissime e molti mi hanno scritto sia con i ringraziamenti sia con le richieste di modifiche.
Qualcuno mi ha scritto evidenziando qualche anomalia da correggere.
Ecco perché ho ripreso il progetto originale e ti propongo la versione 2, da non confondere con la versione 2.0, che necessiterebbe di un collegamento web e dell’interazione con un device mobile.
Magari ci ragiono e ne preparo una …
Il kit della Centralina irrigazione arduino v2
Sia le schede utilizzate sia i componenti scelti restano invariati.
Puoi quindi seguire le istruzioni presenti nell’articolo originale e montare le shield come mostrato in figura:
questa configurazione ti permette di evitare saldature e puoi facilmente e velocemente realizzare la tua Centralina irrigazione arduino v2 semplicemente cambiando lo sketch.
La centralina irrigazione arduino v2 in kit
La centralina è disponibile in kit con 4 elettrovalvole e alimentatore da 12v 500mA ( sufficiente per attivare una elettrovalvola alla volta ) sul sito robotics-3d
Segnalazioni sulla Centralina irrigazione arduino v1
Tra i commenti più gettonati ci sono da sempre stati quelli relativi alla gestione del cambio ora e dell’irrigazione su intervalli che fossero maggiori di un ora.
Un aspetto a cui avevo concesso poca importanza in quanto ho sempre considerato il progetto adatto a piccoli giardini od orti casalinghi con sistema di irrigazione tale da non richiedere tempi lunghi.
Questo tipo di esigenza è più diffusa di quello che immaginavo ed ecco l’esigenza di realizzare la Centralina irrigazione arduino v2.
Sketch Centralina irrigazione arduino v2
Lo sketch di base è il medesimo presentato nel 2013 e che in tanti avete testato in questi anni.
Ho applicato alcune modifiche ed un sistema di verifica dell’orario e dei minuti correnti più semplice ed efficace.
/********************************************************** * Irrigazione rtc Arduino * * Data creazione 20 maggio 2013 * Ultima modifica 20 giugno 2016 * * autore: Mauro Alfieri * web: mauroalfieri.it * tw: @mauroalfieri * /**********************************************************/ #include <Wire.h> #include <RTClib.h> #define pinSettore1 5 #define pinSettore2 6 #define pinSettore3 7 #define pinSettore4 8 int settore1[] = {20,30,21,15}; int settore2[] = {21,20,22,05}; int settore3[] = {22,10,22,55}; int settore4[] = {23,00,23,45}; RTC_DS1307 RTC; void setup() { Serial.begin(9600); Serial.println( "START" ); Wire.begin(); RTC.begin(); pinMode( pinSettore1,OUTPUT ); pinMode( pinSettore2,OUTPUT ); pinMode( pinSettore3,OUTPUT ); pinMode( pinSettore4,OUTPUT ); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); RTC.adjust(DateTime(__DATE__, __TIME__)); } digitalWrite( pinSettore1,LOW ); digitalWrite( pinSettore2,LOW ); digitalWrite( pinSettore3,LOW ); digitalWrite( pinSettore4,LOW ); } void loop() { if ( RTC.isrunning()) { DateTime now = RTC.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(' '); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); int _current = (now.hour() * 60) + now.minute(); startArea(1, _current); // Settore Uno startArea(2, _current); // Settore Due startArea(3, _current); // Settore Tre startArea(4, _current); // Settore Quattro } delay( 30 ); } void startArea(byte area, int current) { int _currStart; int _currStop; byte _currPin; switch(area) { case 1: _currStart = (settore1[0]*60) + settore1[1]; _currStop = (settore1[2]*60) + settore1[3]; _currPin = pinSettore1; break; case 2: _currStart = (settore2[0]*60) + settore2[1]; _currStop = (settore2[2]*60) + settore2[3]; _currPin = pinSettore2; break; case 3: _currStart = (settore3[0]*60) + settore3[1]; _currStop = (settore3[2]*60) + settore3[3]; _currPin = pinSettore3; break; case 4: _currStart = (settore4[0]*60) + settore4[1]; _currStop = (settore4[2]*60) + settore4[3]; _currPin = pinSettore4; break; } if ((_currStart<=current) && (current<=_currStop)) { digitalWrite( _currPin,HIGH ); } else { digitalWrite( _currPin,LOW ); } }
Descrizione linea per linea
commento le sole line avriate, invitandoti alla lettura del progetto originale per comprendere le scelte in merito alla Centralina irrigazione arduino v2:
linee 20-23: ho inserito degli intervalli orari che fossero a cavallo dell’ora per i primi due settori ed interni per i restanti due;
linee 67-72: sostituiscono tutte le linee dalla 70 alla 95 di fatto semplificando di molto lo sketch. In particolare alla linea 70 ricalcola il valore dell’orario corrente in minuti ossia moltiplica per 60minuti l’ora corrente e sommaci i minuti ( nota che il valore massimo che potrai ottenere è dato dalla moltiplicazione (23*60)+60 ).
Le linee 69-72: richiamano tutte la nuova funzione startArea();
linea 77: definisci la funzione startArea che accetta due parametri. Come primo parametro accetta il settore o area da irrigare ( 1-4 ) e come secondo parametro l’ora e minuto corrente ricalcolati;
linee 79-81: definisci 3 variabili in cui memorizzerai i valori di orario start ed end per ciascun settore e il pin a cui hai collegato il relè che attiva l’elettrovalvola;
linea 83: imposta lo switch che valuta la variabile “area” passata dalle line 69-72
linee 85-87: se sei nella condizione dell’area 1 imposta come variabile di partenza il valore in minuti calcolato con la formula:
(ore*60)+minuti
applicato all’orario di avvio. La linea 86 imposta l’orario di fine di irrigazione calcolato come il precedente orario di start. La linea 87 imposta il pin relativo al relè, useremo questi dati alla fine della funzione;
linee 90-106: sono fondamentalmente identiche alle linee 84-88 ma per i settori 2,3,4;
linea 109: verifica che l’orario corrente, arrivato come secondo parametro della funzione, sia incluso tra l’orario di avvio del settore e l’orario di fine programmato;
linea 110: se ti trovi nell’intervallo verificato alla linea 109 porta il pin _currPin definito alla linea 87 per il primo settore ed a seguire alle linee 93,99,105 per i successivi settori;
linea 112: ti permette di spegnere i settori non utilizzati o coinvolti nel minuto corrente.
La modifica, a parte le funzione, semplifica di molto il progetto e ti permette rapidamente di variare il funzionamento del tuo impianto di irrigazione.
40 commenti
Vai al modulo dei commenti
Ciao Mauro sto seguendo i tuoi progetti di irrigazione e sto cercando di applicare un sensore umidità terreno allo sketch. In pratica al momento del controllo del settore 1 oltre all’ora dovrebbe prendere in considerazione anche l’umidità del terreno. Fin quando il settore 1 è attivo nel range del timer riesco a far staccare o attaccare l’irrigazione ma quando esce fuori dal range del timer il relay rimane acceso.
Mi potresti dare un consiglio ?
[[ codice rimosso in automatico ]]
Autore
Ciao Luca,
non ho compreso il tuo dubbio, vuoi che il sensore sia prioritario rispetto al timer o vuoi che sia il timer ad avere la priorità ed il sensore subordinato a quest’ultimo?
In generale ti chiedo il rispetto delle regole evitando di postare codice, come leggi in fondo ad ogni articolo del blog.
Ho risolto. In pratica voglio che l’irrigazione del settore 1 si attivi solo se combacia l’ora del timer e che ci siano i presupposti di umidità (bassa) per attivare la pompa. Ho aggiunto all’IF oltre il controllo dell’ora anche quello del sensore. Grazie lo stesso. Ora sto implementando la modifica dell’ora ma anche del timer settore 1 in modo da impostare tutto da display. Quando farò progressi te li invierò via email.
Luca
Autore
Ottimo Luca.
Mi trovo in grossa difficoltà con il regolare il timer settore1 da LCD. Volevo dare all’ora e ai minuti del timer un valore (HH,MM,hh,mm) da inserire da LCD, ma dove salvo il valore ? posso salvarlo sul file dell’RTC ? checcasino.
Luca
Autore
Ciao Luca,
non ho capito cosa vuoi fare, me lo spieghi meglio?
voglio settare i timer di irrigazione da display, sto ragionando su come fare ma lo trovo complesso e ti vorrei chiedere dei consigli.
Autore
Ciao Luca,
è una modifica importante e devi coinvolgere la EEPROM per farlo in modo corretto e indelebile.
Ti consiglio la lettura dei miei articoli sull’impostazione dell’orario con i pulsanti e la gestione della EEPROM
Grazie mille! Inizio subito a studiarmi la eeprom.
Ho avuto buoni risultati. Ora riesco ad impostare con i tasti e il display il timer del settore 1. Ho solo un problema, che una volta memorizzato il dato sulla eeprom arduino non legge subito il nuovo timer ma devo resettarlo. C’è un comando specifico che posso usare per far riavviare lo sketch una volta che memorizzo il dato eeprom ?
Autore
Ciao Luca,
io ti consiglierei di far in modo che contemporaneamente alla scrittura nella EEPROM siano reimpostati i tempi, magari puoi aggiungere semplicemente che dopo la scrittura faccia una lettura della EEPROM.
Ok tutto bene, con la lettura della eeprom ho risolto questo problema. Ora vorrei capire come non bloccare l orologio all’ aperturA del menu. Tu hai fatto caso a questo problema?
Autore
Ciao Luca,
è cosa buona, nel mondo Arduino, se risolvi un problema descrivere come l’hai risolto, senza pubblicare codice, solo descrivendo cosa hai fatto.
Non ho capito cosa accade all’apertura del menu.
quando si accede al menu per impostare giorno mese anno ora minuti e secondi il conteggio dell’orologio si blocca. se si accede al menu alle 13 e 04, si rimane nel menu per circa 20 secondi senza aggiornare l’ora, si ritorna all’orologio che sono ancora le 13 e 04. Ho risolto l’aggiornamento della eeprom in due modi, o mettendo la lettura read alla porta del dato o con un void 0 e il riavvio all’esecuzione del codice.
Autore
Grazie Luca.
Ho visto che con queste schede è possibile far aprire una sola elettrovalvola alla volta. Mi sai dire se esistono altre schede, più grandi, con le quali è possibile far aprire 7 o 8 elettrovalvole contemporaneamente? Vorrei limitare la durata dell’irrigazione. Grazie
Autore
Ciao Diego,
si esistono schede relay con 8/12/16/24 uscite solo che spesso devono essere usate come schede esterne diversamente da questa che è una shield per Arduino.
Sarei interessato ad acquistare il kit sul sito 3d robotics, avrei bisogno di avere qualche info in più.
Il diametro degli ingressi delle elettrovalvole quanto è?
Quale pressione sopporta la valvola?
Grazie
Ilario
Autore
Ciao Ilario,
se non ricordo male il diametro è 1/4 di pollice, ma puoi scrivere a robotics-3d.com per conferma, il mio progetto è installato e funzionante da molti anni e non ricordo con precisione il diametro dell’elettrovalvola.
Grazie per la rapida risposta, per cortesia ancora una cosa non trovo uno schema dei collegamenti elettrici nel tuo blog, viene fornito insieme al kit?
Grazie
Autore
Ciao Ilario,
gli unici collegamenti sono quelli di inserire una shield sull’altra e di collegare l’elettrovalvola come mostrato nelle foto.
Ok, allora devo cercare negli altri post dove sono le foto.
Grazie di tutto e complimenti per il tuo sito.
Ciao, per cortesia una spiegazione, la shield RTC a cosa serve?
Grazie
Autore
Ciao Ilario,
serve come orologio, per mantenere aggiornata l’ora, come decritto nel codice RTC significa Real Time Clock
Ciao, complimenti per tutto.
Vorrei aggiungere un sensore di umidità, e in funzione al valore che mi esce far partire o no l’irrigazione.
Io leggo le misure di umidità con questo sketch:
[[ codice rimosso in automatico ]]
vorrei integrare questo sketch nel tuo , mi dai qualche dritta??
Grazie
Autore
Ciao Vincenzo,
ti chiedo di leggere e rispettare le poche semplici regole del blog riportate nella pagina “Regolamento“
buona sera Mauro
ho provato un orario tipo 22,00,01,00
ma non mi funziona il rele resta sempre in HIGH
praticamente non percepisce il passaggio del cambio giorno
mentre inpostando un 0ra tipo 22,00,22,40
funziona, se al contrario cioé HIGH diventa LOW
buona sera
ieri sera ho inserito gli orari al contrario cioè nel primo lo spegnimento nel secondo accensione e sorpresa funziona 🙂
ho trasferito tutta la parte seriale su display 20×4 i2c
ora vorrei usare una funzione che con un pulsante ho interrutttore mi permetta sullo stesso rele di gestire due orari differenti, ci devo ragionare ma prima ho poi ci arrivo
grazie,Mauro sei un maesro per me
Autore
Ottimo Ezio,
è lo spirito giusto quello che ti porta a sperimentare e testare fino a quando non trovi una soluzione che ti soddisfa.
Se arrivi alla soluzione multi orario per zona mi piacerebbe pubblicare a tuo nome la modifica con un articolo.
Ti chiedo di leggere la sezione “collabora al blog” per conoscere come fare.
Autore
Ciao Ezio,
si è un limite di questo progetto, mi sembra che altri nei commenti abbiano suggerito delle valide soluzioni.
ciao
per adesso sono riuscito a modificare solo le ore sia di accensione che spegnimento con tre pulsanti e un paio di if, tutto attinto dal tuo blog 🙂 con alcune modifiche
il progetto sarebbe una piccola serra Prevede
il controllo della temperatura umidita, grazie ad un progetto di Daniele Alberti con alcune modifiche
il controllo on off luce grazie a te
un display 20×4 dove viene visualizzata la situazione e settaggi
4 pulsanti per settaggio temperatura umidità
3 pulsanti per modifica orario on off luce
una scheda a 4 rele per collegare
1 umidificatore
1 ventola o aspiratore
1 una stufetta o resistenza
1 lampada o led
il tutto, come sempre, é migliorabile e modificabile
Autore
Ciao Ezio,
sono contento di leggere che tu stia procedendo.
Quando sarà ultimata mi piacerebbe pubblicare il progetto a tuo nome, se vuoi.
Ciao, complimenti.
Mi chiedevo se puoi aiutarmi.
Vorrei realizzare un controller che si collega a internet, mediante wireless, un sistema di ponti radio per fargli raggiungere la wireless. Come posso fare? E ancora, come posso aumentare il numero di settori controllabili e azionare una pompa quando parte il primo settore? grazie mille
Autore
Ciao Umberto,
sarò onesto: la prima domanda non l’ho compresa.
Per la seconda ti consiglio di leggere e comprendere bene il codice in modo da avere chiaro quali siano le semplici modifiche che puoi applicare per ottenere ciò che desideri.
Grazie mille Mauro, lo farò. Vorrei poter controllare l’impianto di irrigazione via internet, collegandolo ad una rete wifi, ma ti confesso che sono un profano. Il fatto è che l’accesso alla rete è lontano dal luogo in cui automatizzare l’impianto di irrigazione. Ho visto su internet che esiste una tecnologia basata su reti LaRa e su Dragino ma, come ti dicevo, sono un profano. Spero che la mia curiosità mi sostenga! Grazie ancora, Um
Autore
Ciao Umberto,
sono certo che la curiosità sia la nostra spinta migliore ad imparare e superare le sfide 🙂
Ciao, chiedo se nella provincia di Piacenza c’e qualche appassionato di ARDUINO al quale posso commisionare di sviluppare un programma un poco complesso.
Autore
Ciao SuperEnnio,
lascio online il tuo commento perché possa contattarti qualcuno, anche se questo blog non è una piattaforma dedicata a tale scopo.
Ciao ho un problema, quando carico il programma mi ha errore “rtc.sqw” come mai ? Come posso fare ?
Grazie
Autore
Ciao Andrea,
mi sembra che nei commenti ci sia la soluzione già proposta ad altri utenti.
A memoria mi sembra sia sufficiente commentare la linea che richiama il metodo sqw in quanto non è più presente nella libreria.