4 min
Costruire un piccolo sensore di umidità del terreno, dal cablaggio al cloud
I passi che ho seguito per costruire un piccolo sensore di umidità del terreno con una scheda Wemos: il cablaggio, la lettura tramite ADC, la conversione in percentuale nel firmware e l'invio a ThingSpeak.

In questa pagina
Questi sono i passi che ho seguito per sviluppare il mio piccolo sensore di umidità del terreno, dall'hardware fino al cloud.
Hardware
Ho usato un cavo jumper (tre fili) per collegare il sensore alla Wemos. Il jumper deve essere del tipo maschio/maschio.

Ho poi connesso i fili secondo questa logica:
| Wemos | Sensore |
|---|---|
3V3 | VCC |
GND | GND |
A0 | AOUT |

Una volta collegato tutto, ho preso un cavo con attacco micro-USB-B da inserire nella Wemos, con l'estremità USB-A collegata al laptop. In questo modo il laptop alimenta e gestisce il sensore via USB.
I 3.3 V forniti dalla Wemos alimentano il sensore, e il GND chiude il circuito
sia per l'alimentazione sia per l'uscita AOUT del sensore. Il GND è ciò che
chiude il circuito (ground, la massa comune, la terra).
Il sensore genera una tensione proporzionale all'umidità presente nel terreno.
Il terreno è un conduttore, e la sua conducibilità elettrica cambia in funzione
di quanto è umido. Al variare dell'umidità varia la conducibilità, e
l'elettronica del sensore trasforma questa variazione in una tensione analogica
presente sul pin AOUT.
Per svilupparlo e calibrarlo, il laptop è sufficiente. Nella versione finita ho poi spostato la Wemos in una piccola scatola stagna alimentata da un power bank USB.

Dall'analogico al digitale: l'ADC
AOUT è collegato al pin A0 della Wemos. Dietro a quel pin c'è un
convertitore analogico-digitale (ADC) che converte la tensione (una sequenza
binaria) in un numero intero, per esempio:
633

A0 alimenta l'ADC integrato.Firmware
A questo punto i valori che escono dall'ADC vengono elaborati dal firmware, codice scritto in C++ che converte la tensione in una percentuale tramite una trasformazione lineare. Questi sono i test che ho fatto:
- 270 → massimo dell'umidità. Ho ottenuto questo valore immergendo il
sensore nell'acqua (100 % di umidità). Con il terreno bagnato la resistenza è
bassa, e
A0legge una tensione vicina a 0 V. - 633 → massimo della secchezza. Ho ottenuto questo valore con il sensore
asciutto (0 % di umidità). Con il terreno asciutto la resistenza è alta, e
A0legge una tensione vicina a VCC.
Da questi due punti la percentuale si ricava con una semplice formula lineare:
633 − lettura
umidità % = ─────────────────── × 100
633 − 270
Una lettura di 270 dà 100 %, una lettura di 633 dà 0 %, e tutto ciò che sta in mezzo cade su una retta. In C++ bastano poche righe:
const int WET = 270; // sensore in acqua → 100%
const int DRY = 633; // sensore asciutto → 0%
float readMoisture() {
int raw = analogRead(A0);
return (float)(DRY - raw) / (DRY - WET) * 100.0;
}
Rete e cloud
Ottenuta la percentuale, il firmware effettua una chiamata HTTP verso l'API di ThingSpeak, che mostra i valori percentuali su un grafico a linee nella sua dashboard.

E questo è tutto il percorso: il terreno cambia la lettura del sensore, l'ADC la trasforma in un numero, il firmware trasforma quel numero in una percentuale, e ThingSpeak trasforma la percentuale in qualcosa che posso tenere d'occhio da ovunque.