Aggiornato 4 min
Sensore di umidità Wemos: dal cablaggio a ThingSpeak
Costruisci un monitor con Wemos D1: collega e calibra un sensore capacitivo, converti le letture ADC e invia dati e avvisi con ThingSpeak.

In questo breve blog voglio descrivere il piccolo sensore di umidità che ho creato per poter monitorare lo stato delle mie piantine. Questo perché sono un'appassionata di cucina e il basilico ci sta proprio bene sui piatti freddi: al momento della scrittura, infatti, siamo in piena estate.
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).
Questo è un sensore capacitivo. Le piste della sonda si comportano come un
condensatore e l'acqua nel terreno cambia la permittività effettiva del
materiale. Il circuito sulla scheda trasforma la variazione di capacità in una
tensione analogica su AOUT. A differenza di una sonda resistiva con elettrodi
esposti, non stima l'umidità facendo passare corrente continua nel terreno, per
questo è meno soggetto a corrosione.
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). Campiona la tensione analogica e la
rappresenta con 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 % su questa scala di calibrazione).
- 633 → massimo della secchezza. Ho ottenuto questo valore con il sensore asciutto (0 % di umidità). Questi estremi sono empirici e specifici per il sensore, la scheda e la tensione di alimentazione usati. Un altro esemplare va calibrato con le proprie letture a secco e in acqua.
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.
Fonti e approfondimenti
Scritto da Giulia Guglielmi
Note su elettronica, IoT e software.