Centralina irrigazione arduino v2

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:

irrigazione arduino shield

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.

Centralina irrigazione arduino v2 commento uno

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.

Centralina irrigazione arduino v2 commento

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.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/centralina-irrigazione-arduino-v2.html

40 commenti

Vai al modulo dei commenti

    • Luca il 25 Giugno 2017 alle 01:33
    • Rispondi

    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 ]]

    1. 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.

    • Luca il 29 Giugno 2017 alle 00:39
    • Rispondi

    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

    1. Ottimo Luca.

    • Luca il 6 Luglio 2017 alle 10:38
    • Rispondi

    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

    1. Ciao Luca,
      non ho capito cosa vuoi fare, me lo spieghi meglio?

        • Luca il 6 Luglio 2017 alle 23:35
        • Rispondi

        voglio settare i timer di irrigazione da display, sto ragionando su come fare ma lo trovo complesso e ti vorrei chiedere dei consigli.

        1. 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

            • Luca il 7 Luglio 2017 alle 09:18

            Grazie mille! Inizio subito a studiarmi la eeprom.

            • Luca il 10 Luglio 2017 alle 00:41

            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 ?

          1. 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.

            • Luca il 11 Luglio 2017 alle 10:27

            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?

          2. 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.

            • Luca il 13 Luglio 2017 alle 09:40

            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.

          3. Grazie Luca.

    • Diego il 22 Marzo 2018 alle 12:50
    • Rispondi

    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

    1. 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.

    • Ilario il 3 Maggio 2018 alle 18:05
    • Rispondi

    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

    1. 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.

        • Ilario il 4 Maggio 2018 alle 10:41
        • Rispondi

        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

        1. Ciao Ilario,
          gli unici collegamenti sono quelli di inserire una shield sull’altra e di collegare l’elettrovalvola come mostrato nelle foto.

            • ilario il 4 Maggio 2018 alle 18:20

            Ok, allora devo cercare negli altri post dove sono le foto.
            Grazie di tutto e complimenti per il tuo sito.

            • ilario il 5 Maggio 2018 alle 12:12

            Ciao, per cortesia una spiegazione, la shield RTC a cosa serve?
            Grazie

          1. Ciao Ilario,
            serve come orologio, per mantenere aggiornata l’ora, come decritto nel codice RTC significa Real Time Clock

    • Vincenzo il 16 Maggio 2018 alle 21:51
    • Rispondi

    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

    1. Ciao Vincenzo,
      ti chiedo di leggere e rispettare le poche semplici regole del blog riportate nella pagina “Regolamento

    • Ezio il 8 Aprile 2019 alle 00:58
    • Rispondi

    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

      • Ezio il 8 Aprile 2019 alle 23:03
      • Rispondi

      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

      1. 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.

    1. Ciao Ezio,
      si è un limite di questo progetto, mi sembra che altri nei commenti abbiano suggerito delle valide soluzioni.

        • Ezio il 13 Aprile 2019 alle 11:52
        • Rispondi

        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

        1. Ciao Ezio,
          sono contento di leggere che tu stia procedendo.
          Quando sarà ultimata mi piacerebbe pubblicare il progetto a tuo nome, se vuoi.

    • Umberto Medicamento il 19 Ottobre 2019 alle 15:41
    • Rispondi

    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

    1. 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.

        • Umberto Medicamento il 21 Ottobre 2019 alle 22:06
        • Rispondi

        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

        1. Ciao Umberto,
          sono certo che la curiosità sia la nostra spinta migliore ad imparare e superare le sfide 🙂

    • SuperEnnio il 29 Gennaio 2020 alle 17:24
    • Rispondi

    Ciao, chiedo se nella provincia di Piacenza c’e qualche appassionato di ARDUINO al quale posso commisionare di sviluppare un programma un poco complesso.

    1. Ciao SuperEnnio,
      lascio online il tuo commento perché possa contattarti qualcuno, anche se questo blog non è una piattaforma dedicata a tale scopo.

    • Andrea Anselmi il 11 Febbraio 2020 alle 16:27
    • Rispondi

    Ciao ho un problema, quando carico il programma mi ha errore “rtc.sqw” come mai ? Come posso fare ?
    Grazie

    1. 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.