piGarden drv/rainsensorqty gestione dell’irrigazione in base alla quantità di pioggia precipitata

Come molti sapranno piGarden non ha una gestione del rilevamento pioggia molto “smart”.

Andrea, già autore di piGardenSched, ha colmato questa mancanza realizzando rainsensorqty, un driver che permette di rilevare la quantità di pioggia precipitata e in base a questa interrompere o meno l’irrigazione.

Il nuovo driver lo trovate già integrato nella nuova versione di piGarden (0.5.14). Se volete aggiornare a quest’ultima come sempre dovrete impartire i seguenti comandi:

cd
cd piGarden
git pull origin master

Fatto questo vi ritroverete con l’ultima versione di piGarden.

Bene…… adesso lascio la parola ad Andrea che illustrerà nel dettaglio come funziona e come attivare la nuova gestione del rilevamento pioggia.

aggiornato alla versione 0.2.5

IL RAIN GAUGE

Rispetto al sensore base , che permette di determinare lo stato di pioggia anche solo con una goccia di acqua, il driver drv/rainsensorqty è in grado di misurare effettivamente la quantità di pioggia integrandosi con piGarden attraverso la gestione drivers di piGarden. Si integra anche con piGardenSched

Viene utilizzato un meccanismo tanto semplice quanto efficace; si trasforma una misura analogica (quantità di acqua) in un’informazione digitale (impulsi). Io l’ho acquistato qui.

L’aggeggio è costituito da una sorta di imbuto che convoglia la pioggia in una vaschetta basculante la quale, ad ogni riempimento, sollecita un contatto magnetico.
A sinistra vedete come è inserita la scheda con il contatto magnetico.
Mentre a destra potete vedere il dettaglio del contatto reed.

 

CIRCUITO PULL-DOWN

Il metodo più semplice per interfacciare un contatto magnetico è attraverso un circuito pull-down (o pull-up con logica inversa a quella descritta):

In stato di riposo, la porta GPIO è collegata attraverso 2 resistenze in serie al negativo e rileva lo stato 0 (da qui il concetto di pull/tira down/giù).

In caso di chiusura del contatto magnetico, la porta GPIO viene collegata al positivo attraverso la resistenza di 1K Ohm e al negativo con la seconda resistenza in serie da 10K Ohm. Poiché la strada più breve è (minor resistenza) verso il positivo, la porta GPIO rileva lo stato 1, ma solo per un istante, poi torna a 0.

Come tutti i pulsanti (il reed switch si comporta come tale) la chiusura non è perfetta, ma avvengono dei rimbalzi che possono essere gestiti con un circuito RC per generare una onda quadra (impulsi) il più squadrata possibile. Rainsensorqty gestisce il debounce via software con un ritardo prima di ascoltare l’impulso seguente (vedi variabile RAINSENSOR_DEBOUNCE nel file di configurazione /home/pi/piGarden/drv/rainsensorqty/config.include.sh )

Ecco come ho fatto il circuito utilizzando una basetta forata:

Ovviamente potete fare il circuito indicato anche senza basetta collegando solamente le resistenze ai fili che si connettono al raspy e al misuratore di pioggia.

Nel mio caso ho collegato il positivo al raspy sul positivo a 3.3 v al pin 17, il negativo al pin 20 e l’ingresso digitale al pin 22 (GPIO 25).

INCONVENIENTI DEL CIRCUITO SOPRA DESCRITTO – optocoupler

Purtroppo il circuito sopra descritto è funzionale solo per distanze limitate tra il sensore e il raspberry, sia per una questione di disturbi che per la caduta di tensione.

Per ovviare a questo inconveniente ho utilizzato un foto accoppiatore che permette di impiegare tensioni maggiori lato sensore (12v o 24v – sinistra nello schema seguente 1+ e 1- ) e trasformare il segnale in una tensione gestita dal raspy (a destra: 3.3v in VCC, il negativo in GND e O1 verso il GPIO).

Nel mio circuito probabilmente non c’è la resistenza di pull-up R6 / R8. Ho dovuto attivare la resistenza di pull-up interna (vedi variabile GPIO_RESISTOR nel file di configurazione /home/pi/piGarden/drv/rainsensorqty/config.include.sh )

REALIZZAZIONE

Per evitare disturbi nella parte elettrica, ho optato per alimentatori distinti per ogni sorgente di alimentazione impiegando anche cavi schermati:

  • 5V per alimentare il raspberry – cavo schermato tipo antifurto 6 fili 2×0,50+4×0,22 rame
  • 12 V AC per alimentare le elettrovalvole in CorrenteAlternata – cavo per irrigazione a fili rigidi anche fino ai relè
  • 12 V DC per la gestione del circuito a valle del circuito opto-coupler (il reed switch chiuderà un circuito a 12V DC) – cavo schermato tipo antifurto 6 fili 2×0,50+4×0,22 rame fino all’optocoupler, filo schermato 2 fili + calza fino al rain gauge

I cavi schermati sono fondamentali per evitare i disturbi soprattutto per le GPIO utilizzate come input. Ricordatevi che la calza si collega al negativo solo da un lato, se non viene usata per il collegamento.

Ecco i miei componenti:

COLLEGAMENTI

Ecco le foto della mia installazione:

E i commenti:

Il collegamento dall’alimentatore 12V verso il rain gauge è fatto così:

Verso il raspberry (a sinistra) con VCC 3.3v, GND e O1 sulla GPIO 25
La calza del cavo schermato verso il rain gauge è collegato al negativo.

Ecco il mio quadro elettrico:

e le note:

Con l’interruttore verde attivo l’alimentatore dei 5V DC e quindi accendo il raspberry. Solo con il secondo interruttore rosso, in cascata al primo, accendo anche gli alimentatore 24 V AC e 12V DC per comandare EV e sensore pioggia.

DESCRIZIONE DEL DRIVER

Il driver si trova in ~/piGarden/drv/rainsensorqty – la versione attuale è la 0.2.5

Il driver viene inizializzato da piGarden all’avvio del raspberry (quando viene invocato da crontab: @reboot /home/pi/piGarden/piGarden.sh init )

Il cuore pulsante del driver è lo script drv_rainsensorqty_monitor.sh che parte all’avvio e rimane in ascolto del cambio di stato del contatto magnetico del sensore pioggia.

Tale script di monitor svolge due funzioni:

  • Determina lo stato pioggia aggiornando il file $RAINSENSORQTY_LASTRAIN solo se conta $RAINSENSORQTY_LOOPSFORSETRAINING impulsi non distanziati dal tempo indicato dalla variabile $RAINSENSORQTY_SECSBETWEENRAINEVENT
  • registra ogni impulso della vaschetta nel file $RAINSENSORQTY_HISTORYRAW

integrazione con piGarden

il driver risponde alla chiamata da piGarden se presente in crontab la seguente entry:

# START cron check_rain_sensor
* * * * * /home/pi/piGarden/piGarden.sh check_rain_sensor 2> /tmp/check_rain_sensor.err
# END cron check_rain_sensor

La risposta dipende dallo stato dell’evento pioggia registrato nel file $RAINSENSORQTY_STATE.

piGarden gestisce autonomamente il ritardo in caso di pioggia attraverso la variabile $NOT_IRRIGATE_IF_RAIN_ONLINE.

integrazione con piGardenSched

l’integrazione con piGardenSched è più dinamica in quanto lo schedulatore non richiede lo stato della piogga come piGarden ogni minuto, ma verifica la quantità di acqua precipitata nelle ore precedenti alla schedulazione contando gli impulsi e determinando lo stato di pioggia se questi superano il valore della variabile $RAINSENSORQTY_LOOPSFORSETRAINING

Se la schedulazione è:

  • ogni giorno
    • viene verificata la quantità di pioggia nelle 24 ore precedenti
  • ogni due giorni
    • viene verificata la quantità di pioggia nelle 24 ore precedenti e tra le 24 e 48 ore precedenti
  • ogni tre giorni
    • viene verificata la quantità di pioggia nelle 24 ore precedenti, tra le 24 e 48 ore precedenti e tra le 48 e 72 ore precedenti
  • ogni quattro giorni
    • viene verificata la quantità di pioggia nelle 24 ore precedenti, tra le 24 e 48 ore precedenti, tra le 48 e 72 ore precedenti e tra le 72 e 96 ore precedenti
  • e così via

Maggiori dettagli nell’articolo di piGardenSched .

attivazione da /etc/piGarden.conf:

Per attivare il driver è necessario inserire la seguente variabile nel file di configurazione:

RAIN_GPIO="drv:rainsensorqty:25"        # Physical 22 - wPi 6

dove la parte drv:rainsensorqty attiva il driver e il valore numero identifica la GPIO port nel formato BCM.

la variabile seguente è impiegata anche da drv/rainsensorqty per rilevare la chiusura del contatto magnetico che, in un circuito pull-up, è lo stato 0.

# Valore in ingresso sul gpio definito in RAIN_GPIO che indica lo stato di pioggia
RAIN_GPIO_STATE=0

le seguenti variabili controllano il driver come descritto:

RAINSENSORQTY_LOOPSFORSETRAINING=16 # dopo 16 impulsi, 16 vaschette riempite si considera pioggia
RAINSENSORQTY_SECSBETWEENRAINEVENT=10800 # =3h, significa che dopo 3 si resetta il numero di vaschette da riempire e solo dopo il riempimento di altre 16 nuove vaschette si considera una nuova pioggia

infine la variabile seguente e’ la quantita’ di acqua espressa in mm di precipitazioni (vedere anche paragrafo Calibrazione successivo):

RAINSENSORQTY_MMEACH=0.33 # see RAINSENSORQTY driver readme for details

Potete trovare la sezione utile al driver nella sottodirectory ~/piGarden/drv/rainsensorqty/conf_example/piGarden.conf.rainsensorqty.example

File di configurazione specifico config.include.sh

Esiste sotto la directory drv/rainsensorqty un file di configurazione “di fino” del driver: config.include.sh

  • Ecco l’intestazione e l’impostazione della TMPDIR (nella mia installazione /tmp è un RAM disk):
#
# Driver rainsensorqty - driver for measure the rain volume
# Author: androtto
# file "config.include.sh"
# specific driver config file
# Version: 0.2.5
# Data: 08/Jan/2020

export TMPDIR=/tmp
  • serve per ritardare la lettura di un secondo impulso falso causato dal rimbalzo del contatto magnetico
RAINSENSOR_DEBOUNCE=0.3 # 0.3 seconds for manage debounce of reed contact
  • aumenta il livello di verbosita’ nei file di log
RAINSENSORQTY_verbose="yes" # yes/no
  • rispettivamente:
    • memorizza l’ultima pioggia (per PiGarden)
    • memorizza tutte le piogge permettendo di visualizzare lo storico (commands/rainsensorqty_HISTORY.sh) – ($STATUS_DIR è impostata da piGarden)
    • memorizza in formato grezzo (raw) tutti gli impulsi registrati (formato secondi:impulsi) – consultabile il contenuto con commands/rainsensorqty_HISTORYRAW.sh
RAINSENSORQTY_LASTRAIN="$STATUS_DIR/rainsensorqty_lastrain"
RAINSENSORQTY_HISTORY="$STATUS_DIR/rainsensorqty_history"
RAINSENSORQTY_HISTORYRAW="$STATUS_DIR/rainsensorqty_history.raw"
  • log dello script di monitoring, popolato solo se RAINSENSORQTY_verbose=”yes” – ($DIR_SCRIPT è impostata da piGarden)
RAINSENSORQTY_MONITORLOG="$DIR_SCRIPT/log/rainsensorqty_monitor.log"
  • file che viene popolato con il pid dello script di monitoring
RAINSENSORQTY_MONPID="$TMPDIR/rainsensorqty_monitor.pid"
  • home directory del driver
RAINSENSORQTY_DIR="$DIR_SCRIPT/drv/rainsensorqty"
  • script di monitoring – lo script eredita le variabili di ambiente da $RAINSENSORQTY_VAR ($TMPDIR/.rainsensorqty_var)
monitor_sh="$RAINSENSORQTY_DIR/drv_rainsensorqty_monitor.sh"
# internal gpio resistor, 3 values: pull-up, pull-down, none
# pull-up/down if rain gauge is connected directly to raspberry
# none if connected through an optocoupler circuit
GPIO_RESISTOR="none" #pull-up|pull-down|none
  • lo script di monitoring ascolta il cambiamento di stato da quello di riposo allo stato di impulso (chiusura del contatto reed). dipendentemente dal circuto implementato, se lo stato di riposo e’ 0, lo script attende la variazione verso 1 (rising) se lo stato di riposo e’ 1, lo script attende la variazione verso 0 (falling) la variabile RAINSENSORQTY_PULSE viene impostata secondo il valore di RAIN_GPIO_STATE presente in /etc/piGarden.conf cioe’ il valore che ci si aspetta per registrare il riempimento della vaschetta dello stato di pioggia
#rising means waiting for 1 status (from 0)
#falling means waiting for 0 status (from 1)
#RAINSENSORQTY_PULSE=rising  # pull-down circuit (rest status is 0)
#RAINSENSORQTY_PULSE=falling # pull-up circuit   (rest status is 1)
(( RAIN_GPIO_STATE == 1 )) && RAINSENSORQTY_PULSE=rising  # pull-down circuit (rest status is 0)
(( RAIN_GPIO_STATE == 0 )) && RAINSENSORQTY_PULSE=falling # pull-up circuit   (rest status is 1)

Calibrazione

Secondo il seguente processo da me effettuato sul mio misuratore di pioggia:

  • Ho misurato 18 ml che hanno prodotto 10 impulsi; pertanto un impulso è stato causto da 1.8 ml di acqua:
  • 1.8 ml sono pari a 1800 mmc ( 1 ml = 1000 mmc, mm cubici)
  • la superficie interna della vaschetta in mmq, quella utile a raccogliare l’acqua, è pari a 109 mm x 48 mm = 5232 mmq
  • volume / superficie mi dà l’altezza, quindi 1800 mmc / 5232 mmq = 0.344037 mm
  • se fossero stati 1.7 ml di acqua per ogni impulso/vaschetta riempita, la variabile sarebbe stata impostata a 0.324924 mm

Il default della variabile è quindi un valore intermedio:

RAINSENSORQTY_MMEACH=0.33 # see RAINSENSORQTY driver readme for details

Leggendo un po’ qua e un po’ là, il prato può non essere irrigato se riceve almeno 5 litri di acqua al metro quadro, pari a 5mm di precipitazioni.

  • 5 mm / 0,33 mm ad impulso = 15,15 impulsi

ecco la ragione per cui il default di RAINSENSORQTY_LOOPSFORSETRAINING è 16

File di log

I file di log da consultare sono:

  • ~/piGarden/log/piGarden.drv.log

che in modalità verbosa in assenza di pioggia:

Mon Mar 25 23:17:01 CET 2019 drv_rainsensorqty_rain_sensor_get arg:drv:rainsensorqty:25
drv_rainsensorqty_check - 23:17:01-25/03/19             NORMAL: checking if 472 pid is running
drv_rainsensorqty_check - 23:17:01-25/03/19             NORMAL: 472 pid is running
drv_rainsensorqty_check - 23:17:01-25/03/19             NORMAL - drv_rainsensorqty_check ok, monitor process running
drv_rainsensorqty_check - 23:17:01-25/03/19             NORMAL: last rain Wed Mar 20 23:41:25 CET 2019 - LEVEL 1 rain
drv_rainsensorqty_check - 23:17:02-25/03/19             NORMAL: check rain Mon Mar 25 23:17:01 CET 2019
drv_rainsensorqty_check - 23:17:02-25/03/19             NO_RAIN - return 99
drv_rainsensorqty_check - 23:17:02-25/03/19             DEBUG : check rain - diff 430536 < 60 - return 99
  • ~/piGarden/log/rainsensorqty_monitor.log
15:52:24-13/08/19 ---- NEW RUN
15:52:24-13/08/19 WAITING FOR falling PULSE
16:02:31-13/08/19 PULSE RECEIVED (counter 1)
16:02:32-13/08/19 WAITING FOR falling PULSE
17:17:31-13/08/19 PULSE RECEIVED (counter 1)
17:17:32-13/08/19 WAITING FOR falling PULSE
17:27:31-13/08/19 PULSE RECEIVED (counter 2)
17:27:32-13/08/19 WAITING FOR falling PULSE

COMANDI SPECIALI

Nella sottodirectory commands sono presenti:

rainsensorqty_CHECK.sh

commands/rainsensorqty_CHECK.sh

chiama la funzione di verifica pioggia, la medesima chiamata da check_rain_sensor; serve per testare il funzionamento dell’integrazione con piGarden

rainsensorqty_HISTORY.sh

commands/rainsensorqty_HISTORY.sh

visualizza lo storico della pioggia dal file $RAINSENSORQTY_HISTORY e della pioggia precipitata che non ha ancora prodotto l’evento pioggia.

Può essere chiamato in 3 modalità:

  • opzione -force, rigenera il file $RAINSENSORQTY_HISTORY dal file $RAINSENSORQTY_HISTORYRAW
  • senza parametri, visualizza l’intero contenuto dello storico
  • con un numero XX, visualizza gli ultimi XX eventi 

rainsensorqty_HISTORYRAW.sh

commands/rainsensorqty_HISTORYRAW.sh

visualizza lo storico della pioggia dal file $RAINSENSORQTY_HISTORYRAW

Può essere chiamato in 2 modalità:

  • senza parametri, visualizza l’intero contenuto dello storico raw; chiede una conferma in quanto può essere molto lungo
  • con un numero XX, visualizza le ultime XX linee

rainsensorqty_INIT.sh

commands/rainsensorqty_INIT.sh

inizializza il driver eseguendo lo script di monitoring – normalmente tale processo avviene da piGarden.sh – utile quando si vuole testare dei cambiamenti o se necessario riavviare dopo il kill del comando successivo

rainsensorqty_KILL.sh

commands/rainsensorqty_KILL.sh

killa i processi di monitoring ed eventuali figli

rainsensorqty_RAINNOW.sh

 commands/rainsensorqty_RAINNOW.sh

simula una pioggia registrandola in $RAINSENSORQTY_LASTRAIN $RAINSENSORQTY_HISTORY $RAINSENSORQTY_HISTORYRAW

Può essere chiamato in 3 modalità:

  • senza parametri, genera un evento completo di pioggia fittizia con $RAINSENSORQTY_LOOPSFORSETRAINING linee nel file $RAINSENSORQTY_HISTORYRAW, aggiornando sia $RAINSENSORQTY_LASTRAIN $RAINSENSORQTY_HISTORY
  • con un solo argomento: numero XX, genera XX linee nel file $RAINSENSORQTY_HISTORYRAW , aggiornati anche gli altri file
  • con due argomenti: numero XX linee ogni YY secondi, utile per verificare il funzionamento dell’irrigazione durante un evento pioggia, anche insieme a piGardenSched

rainsensorqty_REMOVELASTRAIN.sh

 commands/rainsensorqty_REMOVELASTRAIN.sh

rimuove l’ultima pioggia registrata dai file $RAINSENSORQTY_LASTRAIN $RAINSENSORQTY_HISTORY $RAINSENSORQTY_HISTORYRAW (una sequenza intera)

rainsensorqty_RESET.sh

 commands/rainsensorqty_RESET.sh

resetta il contatore dello script di monitor senza fermarlo/rieseguirlo:

Buona misurazione della pioggia!

10 pensieri su “piGarden drv/rainsensorqty gestione dell’irrigazione in base alla quantità di pioggia precipitata

  1. piGuardian

    Ciao, hai scritto che avresti pubblicato il progetto piGuardian , non trovo l’articolo

    ciao by Marco

  2. Ciao, davvero complimenti per l’ottimo progetto, lo sto studiando e sicuramente sarà il mio sistema di irrigazione per il giardino. Forse già te lo hanno chiesto, hai mai pensato di valutare se irrigare o meno in base alle previsioni meteorologiche delle 24h a venire, controllando con sensori (online o fisici) l’effettiva precipitazione, e quindi irrigare in base alla la realtà avvenuta? Ad esempio: irrigazione prevista per le 6am, le previsioni danno pioggia in giornata quindi sospendo l’irrigazione. Se poi non piove dare la possibilità eventuale di irrigare la sera a orario preimpostato come sessione di recupero. Il giorno dopo si riprende normale. Magari addirittura valutando in base alla quantità di precipitazione prevista se sospendere o meno (pioggia leggera=irrigo comunque, temporali abbondanti=sospendo).
    Ancora complimenti! E grazie della condivisione!

  3. @Sergio

    La tua idea mi piace… però la vedo dura da realizzare, potrebbe scatenarsi una reazione a catena.

    cioè, mi spiego meglio:

    alle 6AM di domani è prevista l’irrigazione
    stasera però il meteo da PIOGGIA
    Quindi, avendo l’integrazione predittiva sulle 24h successive, il sistema non permette l’irrigazione.
    alle 6AM non piove, il sensore non rileva pioggia, quindi riprogramma l’irrigazione per a sera stessa alle 9PM, nel frattempo non cade neanhe una goccia.
    però il girno dopo, entro le 24ore dalle 9pm è prevista di nuovo pioggia, quindi l’integrazione predittiva sulle 24h successive blocca il sistema nuovamente.

    e cosi via…

  4. @ANDREA

    bello tutto quello che hai fatto, però volevo sapere da perfetto ignorante di elettronica se

    Partendo dal progetto originale, ed aggiungendo un sensore come questo
    https://www.amazon.it/Sensore-pioggia-Rain-Acqua-Click/dp/B07QBCXV36/ref=sr_1_20?__mk_it_IT=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=sensore+pioggia&qid=1599724303&sr=8-20

    dove è possibile scegliere la quantità, x esempio a 6mm, quando il contenitore si riempe a 6mm, invia lo stesso impulso che inviava il rain sensor originale con basetta in modo da fermare l’irrigazione.
    Cioè in questo modo si ha, un sensore più professionale che misura la quantità, e 0 complicazioni nel aggiungere resistenze ect., schemi ect
    è possibile?

  5. @Gabriele
    il linea di massima potrebbe essere usato il suo sensore, ma:
    * è un interruttore normalmente chiuso che si apre al raggiungimento della quantità di pioggia calibrata
    * sarebbe necessario rivedere il driver, ma potrebbe essere usato più semplicemente l’integrazione nativa presente in piGarden che è on/off e non “graduale” come il driver da me sviluppato
    * avevo anch’io un sensor analogo a quello riportato nel mio impianto prima dell’avvento del raspy: mai funzionato. Tipicamente funzionano con dischi di sughero precompressi in base alla taratura che col tempo perdono la loro fuzionalità. Dalla descrizione del prodotto da te indicato: “Dischi idroscopici per l’assorbimento delle acque meteoriche […] Contatto normalmente chiuso”

    Per quanto riguarda la necessità di essere esperti di elettronica… ti devo contraddire! Spero non vi siate spaventate dalla completezza dell’articolo, ma che non voleva sottolineare alcuna complessità della soluzione.
    Infatti se il sensore da me impegato (il conta impulsi a vaschetta) fosse vicino al raspberry (direi qualche metro), potrebbe essere usata anche la tensione di 3,3v e impiegata una qualsiasi GPIO attivando semplicemente la resistenza di pull-up interna.
    Giovani nuovi implementatore di driver pioggia cercasi! 🙂

  6. grazie per la spiegazione.
    In ogni caso, ho un dubbio, riguarda al sensore che hai usato te, ma anche a quello che ho usato io…

    quando piove deve essere poi svuotato?

    altrimenti come si scarica l’acqua…

  7. Il sensore che ho usato io ha dei fori sotto che consentono l’evacuazione dell’acqua. Quello da te individuato immagino che una volta assorbita acqua fino ad aprirsi, eventuale acqua ulteriore sia superflua e quindi non assorbita; poi dovrà asciugarsi.

  8. Ciao, per caso sei riuscito a portare avanti il programma piguardian??

    Eventualmente hai dei link dove trovare documentazione

    grazie

  9. Ciao @marco
    piGardian è funzionante presse la mia abitazione ma purtroppo non ho avuto tempo di documentare il funzionamento.
    Spero di riuscirci in tempi brevi.
    Attualmente è compostto dallo script piGiardian che si occupa di gestire i sensori e la logica. Mentre mqttconnector si occupa di interfacciarsi con home assistant via mqtt

Lascia un commento

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

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