Per le attività in programma per il corso sui laboratori green, spiegherò come controllare il livello d’acqua in una cisterna utilizzata per l’irrigazione. A livello prototipale svolgerò prima sperimentazioni su singola pianta utilizzando il “water sensor” che potete acquistare per pochi centesimi online. In una fase successiva impiegherò dei sensori di livello che vengono comunemente impiegati in cisterne e controlleremo il riempimento e lo svuotamento della cisterna.

Il “water sensor” misura il livello di conduttività elettrica del liquido, conduttività che sarà funzione della quantità di superficie del sensore immerso.
Nell’acqua ed in generale nei liquidi, il passaggio di corrente è dovuto alla presenza di sali, infatti l’acqua pura non risulta conduttiva.
Le piste parallele di rame presenti sul sensore sono connesse al potenziale positivo e al GND, quando il sensore viene immerso nel liquido viene misurata una differenza di potenziale tra i due poli, d.d.p. che dipenderà dalla quantità di superficie immersa, pertanto al variare della quantità d’acqua varierà il valore di resistenza tra i due potenziali.
Sottolineo che il sensore non è preciso e richiede una taratura iniziale che dipende prevalentemente dall’acqua, inoltre sensori diversi potrebbero fornirvi misure diverse.
Il segnale di uscita del sensore (pin S) verrà inviato su un pin analogico di Arduino e da esso convertito in un valore numerico che oscillerà tra ~ 0 e ~500, pertanto se il sensore non è immerso il valore misurato sarà di circa 0, mentre se sarà totalmente immerso raggiungerà il valore massimo rilevato.
Sul sensore sono presenti 10 piste di rame parallele, connesse in modo alternato, in modo che vi siano 5 piste connesse ad un potenziale alto e 5 piste connesse a GND. E’ presente inoltre un LED che indica quando il sensore viene alimentato.

- S (Signal): uscita analogica da connettere ad un ingresso analogico di Arduino
- +Vcc: potenziale positivo dell’alimentazione. Si consiglia di alimentare il sensore con una tensione compresa tra 3,3 V e 5V. Si ricorda che l’uscita analogica del sensore varierà in funzione della tensione di alimentazione del sensore.
- – : da connettere al GND
Attenzione che il sensore non è progettato per essere completamente immerso, fate in modo che solo le tracce ramate parallele esposte sul PCB vengano a contatto con l’acqua.
Connessione del sensore e calibrazione
Come indicato ad inizio lezione, uno dei problemi maggiori di questi dispositivi è la loro breve durata di vita dovuta all’ossidazione delle parti esposte ad un ambiente umido.
Un’alimentazione continua al sensore accelera l’ossidazione dei terminali. Per ridurre il degrado del sensore è consigliabile non alimentare costantemente il sensore, quindi l’alimentazione viene fornita solamente quando bisogna effettuare la lettura.
La modalità più semplice è quella di connettere il pin +Vcc del sensore ad un pin digitale di Arduino a porlo ad HIGH quando vogliamo effettuare la lettura e porlo a LOW quando non effettuiamo la lettura.
Colleghiamo il +Vcc del sensore al pin digitale 12 di Arduino e il Pin S (Segnale) al pin analogico A0 di Arduino.

6 | #define alimentazioneSensore 12 |
10 | int livelloLiquido = 0; |
14 | pinMode(alimentazioneSensore, OUTPUT); |
17 | digitalWrite(alimentazioneSensore, LOW); |
25 | int livello = leggiSensore(); |
27 | Serial.print( "Livello acqua: " ); |
28 | Serial.println(livello); |
35 | digitalWrite(alimentazioneSensore, HIGH); |
37 | livelloLiquido = analogRead(lettura); |
38 | digitalWrite(alimentazioneSensore, LOW); |
39 | return livelloLiquido; |
Dalla Serial Monitor leggiamo i valori rilevati e nel mio caso rilevo che il valore 0 indica non immersione, valori tra 400 e 410, parziale immersione e valori prossimi a 450 o superiori indicano una completa immersione.
Come detto ad inizio di questa lezione, l’acqua pura non è conduttiva, la conduttività dipende dai sali immersi nell’acqua, quindi è buona norma procedere prima con una calibrazione del sensore con l’acqua il cui livello intendete monitorare.
Con lo sketch mostrato sopra annotate i valori quando il sensore non è immerso, quando è parzialmente immerso e quando è completamente immerso.
0: sensore non a contatto con l’acqua
~ 410: parzialmente immerso
~ 460: completamente immerso
E’ essenziale che la calibrazione venga fatta mantenendo ben fisso il sensore e attendendo che i valori letti si stabilizzino, questa operazione richiede qualche minuto.

Quando avete annotato i valori che corrispondono alle tre situazioni possiamo procedere con l’utilizzo del sensore in altri progetti.
Realizziamo ora un progetto in cui con tre LED si vogliono indicare le tre situazioni: vuoto, metà, pieno.

6 | #define alimentazioneSensore 12 |
10 | int livelloLiquido = 0; |
13 | int limiteInferiore = 410; |
14 | int limiteSuperiore = 450; |
23 | pinMode(alimentazioneSensore, OUTPUT); |
26 | digitalWrite(alimentazioneSensore, LOW); |
29 | pinMode(ledRosso, OUTPUT); |
30 | pinMode(ledGiallo, OUTPUT); |
31 | pinMode(ledVerde, OUTPUT); |
39 | int livello = leggiSensore(); |
43 | Serial.println( "Livello acqua: Vuoto" ); |
44 | Serial.print( "Livello acqua: " ); |
45 | Serial.println(livello); |
46 | Serial.println( "--------------------" ); |
48 | digitalWrite(ledRosso, LOW); |
49 | digitalWrite(ledGiallo, LOW); |
50 | digitalWrite(ledVerde, LOW); |
52 | else if (livello > 0 && livello <= limiteInferiore) { |
53 | Serial.println( "Livello acqua: Basso" ); |
54 | Serial.print( "Livello acqua: " ); |
55 | Serial.println(livello); |
56 | Serial.println( "--------------------" ); |
58 | digitalWrite(ledRosso, HIGH); |
59 | digitalWrite(ledGiallo, LOW); |
60 | digitalWrite(ledVerde, LOW); |
62 | else if (livello > limiteInferiore && livello <= limiteSuperiore) { |
63 | Serial.println( "Livello acqua: Medio" ); |
64 | Serial.print( "Livello acqua: " ); |
65 | Serial.println(livello); |
66 | Serial.println( "--------------------" ); |
68 | digitalWrite(ledRosso, LOW); |
69 | digitalWrite(ledGiallo, HIGH); |
70 | digitalWrite(ledVerde, LOW); |
72 | else if (livello > limiteSuperiore) { |
73 | Serial.println( "Livello acqua: Medio" ); |
74 | Serial.print( "Livello acqua: " ); |
75 | Serial.println(livello); |
76 | Serial.println( "--------------------" ); |
78 | digitalWrite(ledRosso, LOW); |
79 | digitalWrite(ledGiallo, LOW); |
80 | digitalWrite(ledVerde, HIGH); |
87 | digitalWrite(alimentazioneSensore, HIGH); |
89 | livelloLiquido = analogRead(lettura); |
90 | digitalWrite(alimentazioneSensore, LOW); |
91 | return livelloLiquido; |
Esercizi per i miei studenti e per i colleghi iscritti al corso edugreen
Esercizio 01
Realizziamo ora uno sketch che stampa sulla serial monitor il livello del liquido nel contenitore espresso in percentuale.
Esercizio 02
Ripetiamo le medesime funzionalità dello sketch precedente, ma in questo caso mostriamo la percentuale su un display 16×2 I2C
Esercizio 03
All’esercizio precedente aggiungere un buzzer che emette un suono quando viene superato il livello massimo.
Buon Making a tutti 
Per favore può fare elenco dettagliato di cosa acquistare? Magari un carrello Amazon per velocizzare grazie
Salve.
Sarà fatto
Saluti.