Adoperando un Wemos Pro e Telegram, possiamo realizzare una stazione meteo, alimentata da energia solare
Come abbiamo visto nel primo progetto, andremo ad utilizzare una ESP8266 (Wemos Pro) collegata ad un sensore per misurare temperatura, umidità e pressione, connettendosi al WiFi di casa e spedendo messaggi tramite Telegram al nostro smartphone. Invece di alimentarla esclusivamente a batteria, abbiamo integrato il sistema di un pannello solare che alimenta la stazione di giorno e ne ricarica le batterie. Ovviamente non manca il Deep-Sleep per far dormire la stazione per circa un’ora tra un invio e l’altro, in modo da limitare i consumi nei tempi morti.
Progetto
In questo progetto realizzeremo una stazione meteo da posizionare esternamente alla casa, ponendola ad una distanza tale che il Wemos Pro 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, adopereremo un pannello solare da 5V, connesso ad un power manager, per gestirne l’alimentazione e ricaricare la batteria durante il giorno.
Componenti
Le componenti essenziali sono pressappoco le stesse del progetto precedente: una ESP8266 qualsiasi, ma per le dimensioni ridotte e per la antenna esterna abbiamo scelto un Wemos Pro, un sensore digitale BME280 (visto in questo articolo), una batteria da 3,7V (noi stiamo riciclando quella di un power bank tascabile), un pannello solare da 5V e 6W e il power manager Sunflower della DFRobot. Ovviamente per i collegamenti ci serviranno alcuni cavi che salderemo ai pin, mentre per disporre esternamente la stazione meteo utilizzeremo una scatola di derivazione da 180 x 140 x 70 mm. Per assemblare il tutto abbiamo utilizzato una scheda forata su cui abbiamo saldato i pin header, su cui abbiamo poi saldato i cavi per i collegamenti. Per stabilizzare il tutto non sono mancate le fascette di plastica, le guaine termo restringenti e un tubo di plastica o in ferro con una leggera curvatura per fissare la stazione meteo e, infine, abbondante nastro biadesivo M3.
Lista componenti:
- Wemos Pro: https://amzn.to/3jopVRY
- Jumper: https://amzn.to/2xQpv1U
- BME280: https://s.click.aliexpress.com/e/_AYZMEy
- Switch: https://amzn.to/3mHHX3J
- Sunflower DFRobotic: https://bit.ly/3kyLv5v
- Pannello Solare 5V: https://s.click.aliexpress.com/e/_AAPN1I
- Schede forate: https://amzn.to/3ynby4E
- Scatola di derivazione: https://amzn.to/3laIFTB
- Batteria Litio: https://amzn.to/3BtjhA9
- Connettore alimentazione maschio: https://amzn.to/3kyjafS
- Cavo alimentazione Micro-USB: https://amzn.to/38oloZn
Collegamenti
Vediamo come effettuare i collegamenti per la nostra stazione meteo con Telegram. Ricordandovi che il BME280 utilizza l’interfaccia I2C, quindi i collegamenti sono estremamente semplici. Per collegare la ESP8266 al sensore BME280 abbiamo usato i pin D1 e D2 per connetterlo ai pin SCL e SDA del sensore. Abbiamo poi connesso il pin digitale D0 al pin RST, collegamento necessario per permettere alla scheda di andare in Deep-Sleep e poi risvegliarsi. Tra questi due pin abbiamo saldato uno switch che chiude o apre il collegamento: sarà utile posizionarlo in aperto per caricare lo sketch, per poi posizionarlo in chiuso.
Adoperate la scheda forata per saldare ogni componente ai relativi cavi, isolandoli con delle guaine termorestringenti o con del nastro isolante. Per tenere formi i cavi arrivano al sensore abbiamo adoperato una guaina più grande.
I collegamenti elettrici sono anch’essi facili: il Sunflower richiede che la batteria sia collegata nell’apposito terminale a vite, rispettando la polarità, e stessa cosa per il pannello solare, che anch’esso va connesso ad un apposito terminale a vite. Nel lato destro del power manager troviamo il connettore USB OUT con uscita a 5V e 1A che adopereremo per alimentare il Wemos Pro; potete usare un cavo di alimentazione con connettore Micro-USB e collegare il power manager alla dev-board. Assicuratevi di montare il dissipatore passivo in dotazione nella parte posteriore del Sunflower.
Per assemblare tutto dovremmo levigare la base della scatola di derivazione, praticare un buco per inserire la scatola posta nel retro del pannello solare, poi fissare questo con del nastro biadesivo M3 o superiore al retro della scatola. Se potete, chiudete ogni fessura con la colla a caldo o con del silicone.
Fissate ogni componenti con del biadesivo o della colla a caldo, cercando di disporre al meglio ogni parte. Praticate i fori con un avvitatore per l’antenna del Wemos Pro e per i fori con cui fissare la scatola di derivazione ad un supporto.
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 Wemos Pro e che potete scaricare a questo LINK. Iniziamo includendo la libreriaESP8266WiFi.h per il funzionamento del WiFi, la libreria UniversalTelegramBot per controllare il Bot su Telegram, la libreria ArduinoJson per gestire i dati da inviare, la libreria BME280 e la libreria Wire.h per utilizzare l’interfaccia I2C. Definiamo poi il nome della nostra rete WiFi, la relativa password, il token e l’IDchat che abbiamo ottenuto pocanzi, e creiamo l’oggetto bot per gestire i messaggi del Bot Telegram e l’oggetto bme per far funzionare il sensore BME280. Dichiariamo poi le tre variabili per temperatura umidità e pressione.
#include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #include <ArduinoJson.h> #include <BME280I2C.h> #include <Wire.h> #define WIFI_SSID "XXXXXXXXXXXX" #define WIFI_PASSWORD "xxxxxxxxxxxxxxxxxx" #define BOT_TOKEN "XXXXXXX:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" #define CHAT_ID "xxxxxxxx" BME280I2C bme; X509List cert(TELEGRAM_CERTIFICATE_ROOT); WiFiClientSecure secured_client; UniversalTelegramBot bot(BOT_TOKEN, secured_client); 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(115200); Wire.begin(); bme.begin(); bme_sensor();
Questa funzione si limita a prelevare le informazioni dal sensore, depositare i dati nelle variabili create in precedenza e stampare su seriale ogni informazione.
bme.read(pres, temp, hum); Serial.print("Temperatura: "); Serial.print(temp); Serial.println ("°C"); Serial.print("Umidità: "); Serial.print (hum); Serial.println(" %"); Serial.print("Pressione: "); Serial.print (pres); Serial.println (" Pa");
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 l’indirizzo IP assegnato.
Serial.print("Connecting to Wifi SSID "); Serial.print(WIFI_SSID); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); secured_client.setTrustAnchors(&cert); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.print("\nWiFi connected. IP address: "); Serial.println(WiFi.localIP()); configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP time_t now = time(nullptr); while (now < 24 * 3600) { Serial.print("."); delay(100); now = time(nullptr); } Serial.println(now);
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) + "%"; bot.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. Durante le ore di luce la stazione verrà alimentata dal pannello solare, mentre ricarica la batteria e quest’ultima alimenterà la stazione durante le ore notturne e, grazie al Deep-Sleep ridurrà di molto i consumi, evitando di ricaricare manualmente la batteria. Sono quasi due mesi che è in funzione, senza dare nessun problema.
La stazione è momentaneamente posizione a diversi metri dal punto di accesso WiFi, sottoposta alla intemperie e ben isolata e fissata. L’obiettivo di avere 0 manutenzione è pressoché raggiunto.