In questo post vediamo come utilizzare un semplice sensore che permetterà ad Arduino di rilevare l'umidità del terreno.
Il sensore che vediamo in figura , così come quello per rilevare la pioggia funziona in modo molto semplice e ad un costo molto basso dell'ordine di quache Euro.
Come funziona
Questo sensore di umidità del terreno può rilevare la quantità di umidità presente nel terreno circostante al punto in cui è posizionato.
La tecnologia del sensore non è elevata così come la sua precisione ma risulterà comodo per monitorare il livello di umidità in un vaso, oppure per un contenitore più ampio possiamo utilizzare più sensori posizionati a distanza e tramite codice fare la media dei sensori.
Questo sensore utilizza le due sonde poste ai lati per far circolare la corrente attraverso il suolo per poi calcolarne la resistenza.
In tal modo sarà possibile ottenere il livello di umidità del terreno.
In sostanza più acqua c’è nel terreno e, ovviamente, più conduce elettricità e quindi vi sarà meno resistenza, mentre in caso contrario il terreno asciutto conduce poca elettricità e quindi vi sarà più resistenza.
Il sensore ha 4 Pin di uscita:
A0 = uscita analogica con valori nel range 0-1023;
D0 = Uscita digitale con valori 0 o 1;
GND;
VCC = Tensione ingresso.
Occorrono:
5 V per usare l’uscita analogica (ne vediamo a breve l’esempio);
3.3 V per usare l’uscita digitale.
Vi sono anche due led:
Led PWR = si accende quando il sensore è ON;
Led D0 = si accende quando è rilevata umidità.
Per modificare la sensibilità del sensore di umidità del terreno basta ruotare il trimmer. Ruotando in senso antiorario la sensibilità si abbassa, in senso orario si alza invece.
Con questo sketch Arduino rileverà il valore analogico dell’umidità del terreno ogni 2 secondi, e lo stamperà a schermo.
Una volta caricato lo sketch, per leggere i valori del nostro sensore bisogna aprire il Serial Monitor. Se l’umidità è bassa (fuori dalla terra dovrebbe essere intorno a 1000) i valori dovrebbero essere alti, mentre mano a mano che aumenta le letture dovrebbero indicare numeri più bassi.
È consigliabile fare qualche prova girando la vite del potenziometro per una calibrazione ottimale del sensore.
#define pinSensor 0
int sensorValue;
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(pinSensor);
Serial.print("Valore: ");
Serial.println(sensorValue);
delay(2000);
}
Nel caso voleste ottenere un valore da 0 a 100 è disponibile la funzione map che ci consente di ridimensionare i nostri valori nel range di numeri che preferiamo.
Per far ciò è sufficiente incollare questo codice sensorValue = map(sensorValue, 0, 1023, 100, 0) dopo la riga sensorValue = analogRead(pinSensor)
In questo caso avremo 0 se il sensore è fuori dal terreno e un numero superiore man mano che aumenta l'umidità (max 100).
Vediamo alcune varianti.
Invece di stampare a schermo il valore analogico dell’umidità si potrebbero fare alcune varianti, ad esempio aggiungere un cicalino che inizi a suonare quando l’umidità del terreno raggiunge una certa soglia, oppure si può collegare una pompa o gocciolatore che innaffi automaticamente il terreno fino a ritornare ad un valore accettabile, oppure più semplicemente si può far accendere un led.
Vediamo quest’ultima variante:
#define pinSensor 0
int sensorValue;
const int terreno_secco = 40; //soglia sotto il quale si accende il Led
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(pinSensor);
sensorValue = map(sensorValue, 0, 1023, 100, 0);
Serial.print("Valore: ");
Serial.println(sensorValue);
if (sensorValue <= terreno_secco)
digitalWrite(13,HIGH); //Accendi led pin 13
else
digitalWrite(13,LOW); //Spegni led pin 13
delay(2000);
}
Se vogliamo collegare una pompa per irrigare in modo automatico possiamo collegare al posto del Led un relais a 5V , e utilizzare i contatti puliti per alimentare la pompa.
In questo ultimo esempio utilizziamo un display 20x4 i2c per visualizzare il valore di umidità in percentuale.
Grazie a tale interfaccia i2c è possibile collegare il display, che solitamente prevederebbe un minimo di 6 pin (RS, E, D4, D5, D6, D7) più un pin per la gestione della retroilluminazione con soli 2 pin ( SCL ed SDA ) oltre all’alimentazione +5v e Gnd.
Il potenziometro blu serve ad aggiustare il contrasto del display. La linea dei dati è riconoscibile con la sigla SDA (pin A4) mentre quella del clock con SCL (pin A5).
Il sensore umidità sempre collegato al Pin A0.
Per poter utilizzare tale interfaccia è necessario scaricare la libreria LiquidCrystal_I2C in alternativa a quella di sistema LiquidCrystal fornita con l'ambiente IDE di Arduino.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // indirizzo LCD a 0x27
int sensore;
float umidterreno;
void setup() {
lcd.begin();
lcd.clear();
lcd.setCursor(0, 0);
Serial.begin(9600);
}
void loop() {
Serial.print("Valore: ");
Serial.println(umidterreno);
lcd.setCursor(6, 0);
lcd.print("ArduRob"); // Scritta Iniziale
lcd.setCursor(0, 2);
lcd.print("Umidita Terra ");
sensore = analogRead(A0); // Lettura Sensore pin A0
umidterreno = map(sensore, 0, 1023, 100, 0) ;
lcd.print(umidterreno);
lcd.print("%");
delay(2000);
lcd.clear();
}
Considerazioni finali, questo sensore come per il sensore livello acqua e il sensore pioggia avremo un passaggio di corrente continua tra gli elementi in rame che con il terreno umido e l'acqua tendono a corrodersi, con risultati falsati dopo un certo periodo, perciò per un utilizzo lungo come per esempio un progetto di una serra, consiglio di utilizzare un sensore anticorrosione, in un prossimo post vedremo il progetto completo per una piccola serra da interno/esterno.
Commentaires