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.

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

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.

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

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.0
# Data: 11/Aug/2019

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, memorizza tutte le piogge permettendo di visualizzare lo storico (commands/rainsensorqty_HISTORY.sh) – ($STATUS_DIR è impostata da piGarden)
RAINSENSORQTY_LASTRAIN="$STATUS_DIR/rainsensorqty_lastrain"
RAINSENSORQTY_HISTORY="$STATUS_DIR/rainsensorqty_history"
  • 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, lo stato della pioggia con l’ultimo aggiornamento (formato secondi:impulsi), la storia di ogni tip delle rilevazioni pioggia – salvate nella /tmp in quanto non è necessario continuare a salvarne il contenuto, ma utili nel caso di analisi delle precipazioni:
RAINSENSORQTY_MONPID="$TMPDIR/rainsensorqty_monitor.pid"
RAINSENSORQTY_STATE="$TMPDIR/rainsensorqty_state"
RAINSENSORQTY_STATE_HIST="$TMPDIR/rainsensorqty_state.history"
  • 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:

  • chiama la funzione di verifica pioggia, la medesima chiamata da check_rain_sensor
commands/rainsensorqty_CHECK.sh
  • visualizza lo storico della pioggia
commands/rainsensorqty_HISTORY.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
commands/rainsensorqty_INIT.sh
  • killa i processi di monitoring ed eventuali figli
commands/rainsensorqty_KILL.sh
  • simula una pioggia registrandola in $RAINSENSORQTY_LASTRAIN
 commands/rainsensorqty_RAINNOW.sh
  • rimuove dai file $RAINSENSORQTY_LASTRAIN $RAINSENSORQTY_HISTORY l’ultima pioggia registrata
 commands/rainsensorqty_REMOVELASTRAIN.sh
  • resetta il contatore dello script di monitor:
 commands/rainsensorqty_RESET.sh

Buona misurazione della pioggia!

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.