«

»

Giu 21

Stampa Articolo

Centralina irrigazione arduino v2

La Centralina irrigazione arduino v2 è l’evoluzione del progetto presentato su questo blog circa quattro anni fa.

Centralina irrigazione arduino

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.

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

17 comments

Vai al modulo dei commenti

  1. Luca

    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. Mauro Alfieri

      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.

  2. Luca

    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. Mauro Alfieri

      Ottimo Luca.

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

    1. Mauro Alfieri

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

      1. Luca

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

        1. Mauro Alfieri

          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

          1. Luca

            Grazie mille! Inizio subito a studiarmi la eeprom.

          2. Luca

            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 ?

          3. Mauro Alfieri

            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.

          4. Luca

            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?

          5. Mauro Alfieri

            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.

          6. Luca

            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.

          7. Mauro Alfieri

            Grazie Luca.

  4. Diego

    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. Mauro Alfieri

      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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>