Igrometro

Realizzare un rilevatore di umidità del suolo con ESP8266

Torniamo ad adoperare la ESP8266 per creare un nuovo progetto per uso domestico, ideale per curare piccole piante in casa. Riusciremo a interagire con il dispositivo tramite un web browser e lo progetteremo anche ricevere un avviso sonore e leggere i dati da un display Oled.

Progetto

La dev-board scelta è un NodeMCU V3 con ESP8266 che programmeremo come WebServer per rilevare in dati da un igrometro analogico. Come abbiamo già visto nell’articolo sull’interruttore WiFi, sceglieremo di utilizzare la libreria mDNS per creare un DNS personalizzato e accedere facilmente al dispositivo, invece di rintracciarne l’IP. Le informazioni ricavate dall’igrometro verranno stampante sul web browser e su un piccolo display Oled, mentre adopereremo un buzzer passivo per emettere un segnale acustico che ci avviserà se l’umidità del suolo scenderà sotto la soglia limite. L’utente così può monitorare lo stato della pianta comodamente da computer, tablet o smartphone e sapere quando aggiungere l’acqua per evitare che la pianta si secchi.

Componenti

Abbiamo già detto che il NodeMCU V3 sarà la scheda che si occupa di gestire ogni cosa ed è stato scelto poiché era già in nostro possesso senza acquistare altre dev-board. Il NodeMCU raccoglierà le informazioni da un igrometro analogico e stamperà i valori mappati su un display Oled da 0,91″, mentre come altro dispositivo di output, stavolta sonoro, adopereremo un buzzer passivo. Per dare corrente useremo una batteria a litio da 3,7V a 2000mAh che ricaricheremo tramite l’apposito modulo di ricarica TP4056  dotato di presa Micro-USB, per adoperare il caricabatterie dello smartphone per ricaricare la batteria a litio una volta esaurita. Abbiamo adoperato questa batteria per le ridotte dimensioni e per la differenza di potenziale, ideale per fornire il giusto voltaggio al NodeMCU. Per accendere e spegnere il sistema basterà un semplicissimo switch. Tutte le componenti sono state saldate su una scheda forata 50×70 mm. Sia il display Oled da 0,91″ che il NodeMCU sono stati posti su dei pin header femmina.



Lista componenti Amazon:

Lista componenti Aliexpress:

Collegamenti

Effettuare i collegamenti per il nostro Igrometro WiFi non è particolarmente complesso. Il sensore va connesso al pin analogico A0, mentre per la corrente basteranno i 3,3V forniti dalla dev-board. Anche il collegamento al buzzer è estremamente semplice, infatti il pin positivo va connesso al pin digitale D5, mentre il Ground al GND. Il display Oled utilizza l’interfaccia I2C, quindi vanno trovati i pin SDA e SCL sulla scheda, che corrispondono rispettivamente ai pin D2 e D1. Come per l’igrometro, anche qui la tensione a 3,3V fornita dalla scheda basta per alimentare il display, quindi il Vcc va al pin 3V3 e il GND al GND.

Igrometro

Particolare attenzione ai collegamenti tra batteria e modulo di ricarica. Sebbene il sistema sia molto intuitivo, state sempre attenti a collegare i pin correttamente o rischiate di danneggiare batteria e modulo di ricarica. I pin interni del modulo riportano le scritte B+ e B-, ad indicare i cavo positivo (rosso) della batteria e il cavo negativo (nero). Andranno quindi connessi come vedete in figura. I pin più esterni sono destinati al collegamento con la dev-board; OUT+ è la tensione in uscita e va connessa a un pin 3V3 (sui NodeMCU i pin 3V3 funzionano sia in INPUT che OUTPUT di tensione), mentre OUT- va collegato al pin GND della scheda. Nota bene che lo switch per dare tensione al sistema è posto tra il pin 3V3 del NodeMCU e il pin OUT+ del modulo di ricarica; è importante perché per ricaricare correttamente la batteria lo switch deve essere aperto, quindi il sistema senza corrente.



Codice

Parte del codice utilizzato, che potete scarica QUI, deriva dal tutorial su come creare un WebServer con ESP8266, perciò non ci soffermeremo troppo su certi aspetti che abbiamo già affrontato precedentemente. Iniziamo come sempre includendo le librerie necessarie sia per la ESP8266, sia per il display Oled (Adafruit-GFX e SSD1306-Master). Definiamo le misure del nostro display e creiamo l’oggetto “display” per gestire lo stesso.

</pre>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
<pre>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET D0
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Procediamo inserendo SSID e password della nostra rete WiFi, la porta di connessione del protocollo HTTP e definiamo alcune variabili. Abbiamo anche creato un logo che appare quando accendiamo il dispositivo che abbiamo spiegato come realizzare in occasione del display Oled da 0,96″.


const char* ssid = "nome-rete-wifi";
const char* password = "password-wifi";
ESP8266WebServer server(80);

int suolo, percentuale;
String stringa="";

Nel VOID SETUP avviamo la connessione WiFi al modem/router, con cui creare un apposito DNS http://igrometro.local/ da utilizzare per la connessione tramite web browser. Effettuata la connessione, viene stampato il logo che viene visualizzato per 3 secondi, poi si pulisce il display e si avvia il loop. Abbiamo, ovviamente, anche definito la direzione del pin D5 a cui è collegato il buzzer passivo.


pinMode(D5, OUTPUT);
Serial.begin (9600);

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("Connettiti a: ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("igrometro")) {
Serial.print("Igrometro online: ");
Serial.println("http://igrometro.local/");
}

server.on("/", caricamento);
server.begin();

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
display.clearDisplay();

display.drawBitmap (0, 0, logo, 128, 32, 1);
display.display();

delay(3000);

display.clearDisplay();

Nel VOID SETUP troviamo un richiamo alla funzione caricamento() che invia i dati rilevati dal sensore sulla pagina web con DNS che abbiamo creato prima. Questa funzione è scritta in fondo allo sketch, ma ciò non ha particolare rilievo.


server.send(200, "text/html","&lt;h1&gt;Igrometro:" + stringa + "%" + "&lt;/h1&gt;");

All’interno del VOID LOOP troviamo la funzione igro() che ci servirà per recuperare i dati dal sensore di umidità del suolo che verrà mappato in formato percentuale. Quando il valore scende sotto il 20%, si attiva il buzzer per avvisarci che manca l’acqua alla pianta. I valori vengono stampati sul display Oled e il valore precedentemente mappato viene trasformato in una stringa che ritroviamo nella funzione caricamento() accennata poco fa.


suolo = analogRead(A0);

percentuale = map (suolo, 1023, 0, 0, 100);

if (percentuale &lt; 20){

tone (D5, 850, 500);
delay (500);
}

display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0, 0);
display.println("Umidita' suolo:");

display.setTextSize(2);
display.setTextColor(1,0);
display.setCursor(0, 15);
display.println(percentuale);

display.setTextSize(2);
display.setTextColor(1);
display.setCursor(25, 15);
display.println("%");

display.display();

stringa = String(percentuale);

Infine, stampiamo i valori su monitor seriale, aggiorniamo la richiesta di connessione di eventuali client e aggiorniamo il mDNS ogni 100 millisecondi circa.


Serial.print(percentuale);
Serial.println(" %");

server.handleClient();
MDNS.update();

delay(100);

 

Conclusioni

Il progetto dell’igrometro WiFi per rilevare l’umidità del suolo della pianta è un progetto pensato per poter gestire una piccola piantina in modo che non ci possa scordare di darle acqua ed evitare che si secchi e muoia. Non è molto complesso e di facile realizzo, per di più molto comodo ricaricarle il dispositivo adoperando il caricabatterie dello smartphone. Abbiamo realizzato anche un case da realizzare con una stampante 3D, per evitare che le componenti si bagnino e si rovinino facilmente e che potete scaricare QUI.