Realizzare una stazione meteo con NodeMCU che si colleghi in WiFi e spedisca un messaggio tramite Telegram

Ritorniamo a parlare di stazioni meteo per presentarvi un progetto realizzato con ESP8266 che rileva pressione, umidità e temperatura per poi inviare i dati tramite Telegram. Il progetto prevede anche di risparmiare al massimo la batteria per alimentare la dev-board utilizzando il Deep-Sleep.

Progetto

In questo progetto realizzeremo una stazione meteo da posizionare esternamente alla casa, ponendola ad una distanza tale che il NodeMCU possa collegarsi alla rete WiFi di casa, raccogliere i dati per poi inviarli all’utente tramite un messaggio di testo su Telegram. Il progetto non si limiterà solo a configurare la dev-board, ma prevede una fase preliminare per creare un Bot su Telegram che riceverà le informazioni dalla ESP8266: questo richiederà un’apposita libreria. Inoltre, per garantire una lunga carica al progetto modificheremo un power bank per collegarlo direttamente alla dev-board.



Componenti

Le componenti essenziali a questo progetto sono sostanzialmente 3: il NodeMCU V3 (andrebbe bene anche un Wemos D1 Mini), un sensore digitale BME280 (visto in questo articolo) e un power bank tascabile. Ovviamente per i collegamenti ci serviranno alcuni jumper, mentre per disporre esternamente la stazione meteo utilizzeremo una scatola di derivazione da 180 x 140 x 70 mm. Prima di passare ai collegamenti, premettiamo che dovremmo aprire e effettuare delle saldature ai contatti delle batterie del power bank, invece di alimentare il NodeMCU direttamente da porta USB; il motivo risiede nel sistema di gestione del consumo elettrico integrato in quasi tutti i power bank. Questo sistema spegne il power bank se la corrente richiesta è al di sotto di una certa soglia, impedendo così di erogare la corretta corrente alla stazione meteo quando essa è in deep-sleep.

Collegamenti

Vediamo come effettuare i collegamenti per la nostra stazione meteo con Telegram. Iniziamo dicendo che abbiamo usato un NodeMCU V3, ma avremmo preferito usare un Wemos D1 Mini perché più piccolo e adatto a pochi collegamenti. Passiamo ora alla modifica al power bank che ci permetterà di alimentare la dev-board in modo corretto e senza problemi. Armatevi di pazienza e dei giusti attrezzi per aprire la scocca del power bank senza rovinarlo o romperlo; noi abbiamo adoperato gli attrezzi per la riparazione degli smartphone, ideali anche per riparare notebook. Se non li avete vi suggeriamo di acquistarli a questo LINK. Una volta aperto, verificate sempre con un multimetro la tensione e saldate due jumper ai poli della batteria. Abbiamo anche praticato un foto sulla scocca del power bank per far uscire i jumper saldati e richiudere il power bank. Non dissaldate nulla, soprattutto il circuito che controlla le porte USB del power bank, perché lo riutilizzeremo per ricaricare le batterie quando esse saranno scariche.



Per collegare la ESP8266 al sensore BME280 abbiamo usato i pin D1 e D2 per connetterlo ai pin SCL e SDA del sensore, mentre per alimentarlo è sufficiente usare i 3,3V forniti dalla dev-board. Abbiamo poi connesso il pin digitale D0 al pin RST, collegamento necessario per permettere alla scheda di andare in Deep-Sleep e poi risvegliarsi. Colleghiamo i jumper che avevamo connesso prima alla batteria del power bank al pin VIN il polo positivo della batteria, mentre al pin GND il negativo.

Lista componenti su Amazon:



Codice

Procediamo ora creando un Bot di Telegram che ci comunicherà le informazioni rilevate dalla stazione meteo. Apriamo una chat con il BotFather, ossia un Bot che ci servirà per creare altri bot.

Per avviarlo scriviamo /start e poi premiamo Invio

Il BotFather ci risponderà che può aiutarci a creare un nuovo bot e per farlo digitiamo il comando /newbot.

Diamo un nome al nuovo Bot semplicemente digitandolo e dando poi Invio. Adesso toccherà dargli anche una username che lo renderà riconoscibile. Non sarà sempre facile perché molti nomi sono già utilizzati, quindi siate fantasiosi. L’importante è che finisca in Bot o _bot, come riportato nell’esempio.

Una volta che avremo trovato una username al nostro Bot, il BotFather ci comunicherà delle informazioni molto importanti che dovremmo tenere solo per noi e conservare gelosamente. La prima è il percorso per trovare il nostro Bot, l’altra è la API che ci servirà nel nostro codice.

Adesso che abbiamo l’API ci serve ricavare un’ultima informazione, ossia l’ID Utente o l’ID gruppo se vogliamo inserire il nostro Bot in un gruppo. Ricorreremo anche stavolta ad un altro Bot chiamato IDBot.

Avviamo una chat con IDBot e digitiamo il comando /getid e otterremo una serie di numeri che rappresentano il nostro ID, oppure inseriamolo nel gruppo con il bot della nostra stazione meteo e diamo il comando /getgroupid. L’ID che otterremo è anch’esso privato.

Passiamo ora ad esaminare lo sketch che caricheremo sul nostro NodeMCU e che potete scaricare a questo LINK. Iniziamo includendo la libreria CTBot.h per gestire il Bot su Telegram, la libreria BME280 e la libreria Wire.h per la gestione dell’interfaccia I2C. Creiamo l’oggetto myBot per gestire i messaggi del Bot e l’oggetto bme per far funzionare il sensore BME280.


#include "CTBot.h"
#include <BME280I2C.h>;
#include <Wire.h>;

CTBot myBot;
BME280I2C bme;

Inseriamo ora l’SSID della nostra WiFi e la relativa password, poi inseriamo l’API che abbiamo ottenuto del BotFather e l’ID ottenuto da IDBot. Definiamo le variabili a virgola mobile per temperatura, umidità e pressione.


#define WIFI_SSID "nome-wifi"
#define WIFI_PASSWORD "password"

#define BOT_TOKEN "XXXXXXXXX:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

int64_t CHAT_ID = xxxxxxxxxx;

float temp, hum, pres;

Nel VOID SETUP avviamo il monitor seriale, l’interfaccia I2C e il sensore BME280. Richiamiamo la funzione bme_sensor() che serve per rilevare temperatura, umidità e pressione.


Serial.begin(9600);
Wire.begin();
bme.begin();

bme_sensor();

Effettuiamo la connessione alla rete WiFi e poi a Telegram tramite il token (API) e testiamo la connessione. Se tutto è andato bene ci verrà comunicato sul monitor seriale che la connessione è andata a buon fine.


Serial.print("Connecting to Wifi SSID ");
Serial.print(WIFI_SSID);
myBot.wifiConnect(WIFI_SSID, WIFI_PASSWORD);
myBot.setTelegramToken (BOT_TOKEN);

if (myBot.testConnection())
Serial.println("\ntestConnection OK");
else
Serial.println("\ntestConnection NOK");

Prepariamo ora il messaggio che dobbiamo ricevere su Telegram. Creiamo una stringa chiama data, con la quale creeremo il testo del messaggio che verrà inviato dal Bot, trasformando in stringa ogni valore numerico rilevato dal sensore. Infine, inviamo la stringa a Telegram tramite l’ID utente o ID Gruppo.


String data = "Ciao, la Temperatura è di " + String(temp) + "°C, la Pressione è di " + String(pres) + " Pa e l'Umidità è del " + String(hum) + "%";

myBot.sendMessage(CHAT_ID, data);

L’atto conclusivo è di definire il tempo per il quale la dev-board va a dormire, impostando il Deep-Sleep per un’ora. Il tempo di 36e8 indica il tempo di un’ora espressa sotto forma di notazione esponenziale (36 x 108), poiché vengono adoperati i microsecondi. Il VOID LOOP viene lasciato vuoto.


ESP.deepSleep(36e8);

Ogni ora la stazione meteo si attiva, rileverà temperatura, umidità e pressione, dopodiché si connetterà per inviare i dati su Telegram per poi entrare in risparmio energetico per un’altra ora. La batteria così ridurrà di molto i consumi, evitando ricariche continue.

Ad oggi, dopo 7 giorni di attivazione continua, la batteria non ha consumato nemmeno il 2% della carica totale.