Irrigazione giardino con Arduino

Vietata la riproduzione anche parziale di grafica e contenuti salvo autorizzazione specifica.
Guide solo a scopo dimostrativo, declino ogni responsabilità per danni o incidenti dovuti alle modifica trattate in queste guide.

Con l’arrivo dell’estate abbiamo sempre il problema di dover bagnare il prato, le piante o l’orto senza sapere la giusta quantità di acqua da dare alle piante senza sprecarla.

Mi sono trovato per casa un Arduino UNO e mi sono chiesto se potevo in qualche modo utilizzarlo. cercando in rete ho trovato vari progetti.

Oltre all’Arduino abbiamo bisogno di una scheda RTC (per il controllo della data e dell’ora), e di una scheda relè (si può anche autocostruire).

Ci dobbiamo fare un idea di come suddividere le zone del giardino o dell’orto, per comandare le varie zone avrete bisogno delle elettrovalvole, ce ne sono sia monostabili (devono essere alimentate per restare aperte) che bistabili (hanno bisogno di un impulso per aprirsi e uno per chiudersi), e a varie tensioni di alimentazione; io consiglio le elettrovalvole a 12V in corrente continua, dato che si lavora con l’acqua che non va tanto d’accordo con l’elettricità.

L’elettrovalvole saranno comandate dalle uscite dell’Arduino, ma non possono essere comandate direttamente perché esce una tensione troppo bassa; quindi va creata un’interfaccia che comanda un relè.
Possiamo utilizzare uno schema tipo questo:

Ecco finita la costruzione della scheda relè interfacciata all’Arduino

Passiamo ora alla programmazione dell’Arduino, inserisco il mio sketch che utilizzo tutt’ora:


/**********************************************************
Irrigazione rtc Arduino
Data creazione 14 luglio 2017
Ultima modifica 27 giugno 2019
Irrigazione Prato dalle 2.45 alle 3.00 LUN-MER-VEN-DOM
Fiori dalle 3.00 alle 3.25 TUTTI I GIORNI
Autore: Ciapa

/**********************************************************/

#include <DS1307new.h>
#include <Wire.h>

#define pinSettore1 5 // Uscita elettrovalvola PRATO
#define pinSettore2 6 // Uscita elettrovavlcola FIORI
#define pulsSettore1 3 // Pulsante elettrovalvola PRATO
#define pulsSettore2 4 // Pulsante elettrovalvola FIORI

int settore1[] = {2, 45, 2, 59}; // START E STOP PRATO
int settore2[] = {3, 00, 3, 24}; // START E STOP FIORI
int puls1 = 0; // si userà val per conservare lo stato del pin di input
int puls2 = 0; // si userà val per conservare lo stato del pin di input

void setup() {
Serial.begin(9600); //inizializzo la seriale
Wire.begin(); //inizializzo la libreria wire

pinMode( pinSettore1, OUTPUT ); //definisco i pin come uscite
pinMode( pinSettore2, OUTPUT );
pinMode( pulsSettore1, INPUT ); //definisco i pin come ingresso

pinMode( pulsSettore2, INPUT );

digitalWrite( pinSettore1, LOW ); //definisco le uscite di default spente
digitalWrite( pinSettore2, LOW );
digitalWrite( 3, HIGH ); // forza il pin a livello alto sfruttando la resistenza di pull-up interna ad arduino

digitalWrite( 4, HIGH );

/*parte commentata da utilizzare solo per rimettere l’orologio, questione da sviluppare*/
//RTC.stopClock();
//RTC.fillByYMD(2019,6,27);
//RTC.fillByHMS(9,22,0);
//RTC.setTime();
//RTC.startClock();
//RTC.adjust(DateTime(__DATE__, __TIME__));
}

void loop()
{
RTC.getTime(); //abilito l’acquisizione dei dati

int uscita_Prato = digitalRead(pinSettore1); //Legge il valore dell’uscita del prato
int uscita_Fiori = digitalRead(pinSettore2); //Legge il valore dell’uscita dei fiori
puls1 = digitalRead(pulsSettore1); // legge il valore dell’input e lo conserva
puls2 = digitalRead(pulsSettore2); // legge il valore dell’input e lo conserva

// Settore Uno => PRATO LUNEDI MERCOLEDI VENERDI DOMENICA
if (settore1[0] <= RTC.hour && (RTC.dow == 1 || RTC.dow == 3 || RTC.dow == 5 || RTC.dow == 0) && RTC.hour <= settore1[2] && settore1[1] <= RTC.minute && RTC.minute <= settore1[3] ) {
digitalWrite( pinSettore1, HIGH );
}
else if (puls1 == LOW) { //se il pulsante è premuto
digitalWrite( pinSettore1, HIGH ); //accende l’uscita
}
else {
digitalWrite( pinSettore1, LOW );
}

// Settore Due => FIORI TUTTI I GIORNI
if (settore2[0] <= RTC.hour && RTC.hour <= settore2[2] && settore2[1] <= RTC.minute && RTC.minute <= settore2[3] ) {
digitalWrite( pinSettore2, HIGH );
}
else if (puls2 == LOW) { //se il pulsante è premuto
digitalWrite( pinSettore2, HIGH ); //accende l’uscita
}
else {
digitalWrite( pinSettore2, LOW );
}

// Stampo i risultati sul monitor seriale
Serial.println(” “);
Serial.println(“——————–“);
Serial.println( “START” );
Serial.println(“——————–“);
Serial.print(“Giorno della settimana:”);
Serial.print(” “);

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.print(” “);
Serial.print(“(“);
Serial.print(RTC.dow, DEC);
Serial.print(“)”);
Serial.println(” “);
Serial.println(” “);
Serial.print(“GG/MM/AAAA”);
Serial.print(” “);
Serial.print(” “);
Serial.print(RTC.day, DEC);
Serial.print(“/”);
Serial.print(RTC.month, DEC);
Serial.print(“/”);
Serial.print(RTC.year, DEC);
Serial.println(” “);
Serial.println(” “);
Serial.print(“hh:mm:ss”);
Serial.print(” “);
Serial.print(” “);
Serial.print(RTC.hour, DEC);
Serial.print(“:”);
Serial.print(RTC.minute, DEC);
Serial.print(“:”);
Serial.print(RTC.second, DEC);
Serial.println(” “);
// Serial.println(” “); //scrive il valore dell’umidità
// Serial.print(“Umidita: “);
// Serial.print(UMID);
// Serial.print(“%”);
// Serial.print(” (“);
// Serial.print(sens_UMID);
// Serial.println(“)”);
Serial.println(” “); //scrive i valori delle uscite 0=off 1=on
Serial.print(“Uscita Prato: “);
Serial.print(uscita_Prato);
Serial.print(” Uscita Fiori: “);
Serial.print(uscita_Fiori);
Serial.println(” “);
Serial.println(” “);

delay (2000); //aspetto 2 secondi e ricomincio il ciclo

}


Per la parte idraulica ci possiamo affidare a tanti siti on line che vendono tutti i pezzi necessari o nei grandi centri fai da te.