Gateway ESP32 Wi-Fi per stazioni meteo Bresser
Giosuè Iaccarino ·Introduzione
Klinkon Electronics da anni collabora su tanti progetti con il DeLucaLabs, laboratorio di maker nei pressi di Sedico. Assieme a loro stiamo sviluppando un sistema per collegare al nostro servizio di monitoraggio ambientale AMMS (Autonomous Meteorological Monitoring System, un sistema di monitoraggio con diverse centraline meteo interconnesse con lo scopo di acquisire dati relativi le condizioni ambientali e elaborare semplici previsioni meteo, creando un archivio OpenData con i dati raccolti) quante piĂą stazioni possibili, e per abbattere i costi e le difficoltĂ tecniche abbiamo ricercato anche le stazioni meteo facilmente modificabili, con un focus su quelle economiche da Amazon, in questo caso le Bresser 5 in 1, e con questo articolo vogliamo spiegarvi come potete replicare il sistema da noi sviluppato in casa anche voi con pochi componenti elettronici.
Il problema
La stazione Bresser 5 in 1 è composta da due unità :
- Stazione meteo con sensori di temperatura, umiditĂ , pressione, velocitĂ e direzione del vento e precipitazioni
- Display di controllo remoto
Queste due unitĂ comunicano tra di loro via radio sulla frequenza libera 868 MHz.
Non potendo quindi leggere i dati della stazione direttamente tramite rete Internet si è reso necessario ideare una soluzione per poterli inviare al server centrale del progetto AMMS per effettuare la raccolta e la consultazione dei dati meteorologici, che consenta tramite un Gateway di ricevere i dati inviati dalla stazione meteo tramite frequenze radio e trasmetterli a sua volta via Internet al server centrale
Ricerca di una possibile soluzione
Si rende necessario quindi lo sviluppo di un dispositivo che consenta di di leggere i dati generati dalla Bresser e “intercettarli” durante il loro invio al display di controllo remoto, mantenendo però la stabilità della connessione nel tempo e che consumi anche il meno possibile, in quanto dovrà rimanere collegato all’alimentazione e alla rete internet 24 ore al giorno.
I nostri hardwaristi Lorenzo e Leonardo, dopo ore di ricerca di possibili soluzioni, hanno deciso di sviluppare un Gateway IoT, prendendo spunto dal progetto OpenSource BresserWeatherSensorReceiver di Matthias Prinke, composto da un modulo radio RFM95W-915S2 e pilotato da un ESP32 che si occuperĂ di analizzare i dati ricevuti dalla stazione meteo per poi spedirli via internet al nostro sistema centralizzato.
Il Wemos D1 Mini, il cervello del nostro sistema, composto da un ESP Wroom32, un potente microcontrollore che consente la connettivitĂ via WIFI o Bluetooth
Il modulino RFM95W, modulo ricevitore di frequenze radio. Il suo compito sarà di leggere i dati della stazione e decodificarli per l’ESP
Sviluppo del prototipo – Hardware
Effettuata la ricerca dei componenti abbiamo ordinato le parti e possiamo finalmente creare il prototipo del sistema, che potete ricreare anche voi seguendo questi passaggi
Si comincia col collegare il modulo RF al WemosD1, seguendo la seguente tabella:
PIN RFM95W | PIN ESP32 D1 Mini |
---|---|
RESET | IO32 |
NSS | IO27 |
SCK | IO18 |
MOSI | IO23 |
MISO | IO19 |
GND | GND |
3.3V | 3.3V |
DIO0 | IO21 |
DIO1 | IO33 |
Schema di connessione del WemosD1 Mini32 al modulo RFM95W, come antenna si può usare uno spezzone di filo rigido da 82mm
Anche se il setup è un po’ provvisorio una volta saldato e assemblato così il sistema è tutto pronto per passare alla parte software, quella un po’ più complessa, che ora spiegheremo nel dettaglio
DISCLAIMER: La guida spiegherà come interfacciare la Bresser affinchè invii i dati al nostro sistema meteo AMMS, con un token che si può richiedere direttamente a noi nel nostro gruppo telegram t.me/klinkonelectronicschat, le rilevazioni comunque possono essere inviate anche tramite thingspeak con l’aggiunta della relativa libreria e sono visibili anche tramite il monitor seriale dell’arduino IDE o di VSCode.
Sviluppo del prototipo – Software
Il programma principale del Gateway è un fork dello sketch d’esempio di Matthias Prinke con l’aggiunta della nostra libreria per l’invio dei dati meteorologici al server AMMS.
Esso si occupa di leggere i dati letti dal modulo RF e di caricare i dati sulla seriale dell’ESP e sul nostro sistema AMMS.
Di seguito trovate il codice base che fa funzionare il sistema. Nel caso stiate replicando il nostro setup vi basta scaricare il pacchetto originale presente nel GitHub a questo link, aprirlo con PlatformIO su VSCode e compilarlo una volta editate le parti di codice di interesse.
#include <AMMSutils.h>
#include <Arduino.h>
#include <ArduinoJson.h>
#include <WiFiManager.h>
#include "WeatherSensorCfg.h"
#include "WeatherSensor.h"
String AMMS_TOKEN = "STATION_TOKEN_HERE";
WeatherSensor weatherSensor;
WiFiManager wifiManager;
AMMSutils amms;
void onDisconnect(WiFiEvent_t event, WiFiEventInfo_t info) {
wifiManager.autoConnect("Bresser Gateway");
}
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println("Firmware version: 1.2");
weatherSensor.begin();
WiFi.mode(WIFI_STA);
WiFi.onEvent(onDisconnect, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
// Connecting to Wi-Fi
wifiManager.setDebugOutput(true);
wifiManager.setConfigPortalTimeout(30);
Serial.printf("Starting execution...\n");
wifiManager.autoConnect("Bresser Gateway");
amms.begin(AMMS_TOKEN);
}
void loop() {
// This example uses only a single slot in the sensor data array
int const i = 0;
// Clear all sensor data
weatherSensor.clearSlots();
// Tries to receive radio message (non-blocking) and to decode it.
// Timeout occurs after a small multiple of expected time-on-air.
int decode_status = weatherSensor.getMessage();
if (decode_status == DECODE_OK) {
Serial.printf("Id: [%8X] Typ: [%X] Battery: [%s] ",
weatherSensor.sensor[i].sensor_id,
weatherSensor.sensor[i].s_type,
weatherSensor.sensor[i].battery_ok ? "OK " : "Low");
if (weatherSensor.sensor[i].temp_ok) {
Serial.printf("Temp: [%5.1fC] ", weatherSensor.sensor[i].temp_c);
amms.setSensorField("temperature", weatherSensor.sensor[i].temp_c);
} else {
Serial.printf("Temp: [---.-C] ");
}
if (weatherSensor.sensor[i].humidity_ok) {
Serial.printf("Hum: [%3d%%] ", weatherSensor.sensor[i].humidity);
amms.setSensorField("humidity", weatherSensor.sensor[i].humidity);
} else {
Serial.printf("Hum: [---%%] ");
}
if (weatherSensor.sensor[i].wind_ok) {
Serial.printf("Wind max: [%4.1fm/s] Wind avg: [%4.1fm/s] Wind dir: [%5.1fdeg] ",
weatherSensor.sensor[i].wind_gust_meter_sec,
weatherSensor.sensor[i].wind_avg_meter_sec,
weatherSensor.sensor[i].wind_direction_deg);
amms.setSensorField("wind_speed", weatherSensor.sensor[i].wind_avg_meter_sec);
amms.setSensorField("wind_direction", weatherSensor.sensor[i].wind_direction_deg);
} else {
Serial.printf("Wind max: [--.-m/s] Wind avg: [--.-m/s] Wind dir: [---.-deg] ");
}
if (weatherSensor.sensor[i].rain_ok) {
Serial.printf("Rain: [%7.1fmm] ", weatherSensor.sensor[i].rain_mm);
amms.setSensorField("precipitation", weatherSensor.sensor[i].rain_mm);
} else {
Serial.printf("Rain: [-----.-mm] ");
}
if (weatherSensor.sensor[i].moisture_ok) {
Serial.printf("Moisture: [%2d%%] ", weatherSensor.sensor[i].moisture);
} else {
Serial.printf("Moisture: [--%%] ");
}
Serial.printf("RSSI: [%5.1fdBm]\n", weatherSensor.sensor[i].rssi);
Serial.println("Sending data");
amms.sendData();
}
delay(100);
}
Spiegazione del codice
L’unico parametro di configurazione da impostare nel programma è il token della stazione che permette al sistema di autenticarsi con il server AMMS:
String AMMS_TOKEN = "STATION_TOKEN_HERE";
All’avvio del ESP32, il programma inizializza il modulo radio
weatherSensor.begin();
e cerca di connettersi alla rete Wi-Fi. Qualora non ci fosse nessuna rete salvata, renderà disponibile la rete Wi-Fi Bresser Gateway che permetterà all’utente di configurare i parametri per la connessione ad Internet.
wifiManager.autoConnect("Bresser Gateway");
Una volta connesso ad Internet, il Gateway si mette in ascolto per nuovi messaggi in ingresso dal modulo radio.
int decode_status = weatherSensor.getMessage();
Ricevuto un nuovo messaggio, procede stampando il contenuto nella seriale
Serial.printf("Temp: [%5.1fC] ", weatherSensor.sensor[i].temp_c);
e aggiungendo i dati dei sensori alla coda d’invio del server AMMS.
amms.setSensorField("temperature", weatherSensor.sensor[i].temp_c);
Finito il ciclo di raccolta e stampa, procede con l’invio dei dati al server.
amms.sendData();
Il Bresser Gateway può essere facilmente configurato tramite l’interfaccia Web che si rende disponibile al primo avvio. Per raggiungere la pagina di configurazione è sufficiente connettersi alla rete Wi-Fi Bresser Gateway, una volta connessi si verrà reindirizzati automaticamente alla pagina di configurazione, dove sarà possibile inserire le credenziali della rete Wi-Fi alla quale si intende collegare il dispositivo.
Conclusioni
Arrivati a questo punto i dati acquisiti dalla Bresser sono diventati “interpretabili” con tutti i sistemi più comuni, dall’invio a piattaforme come Thingspeak o Arduino cloud fino al funzionamento di attuatori pilotati da parametri meteo (per esempio, un relè che si attiva a determinate temperature) per arrivare a creare un display con info di più stazioni (il dispositivo legge tutte le bresser rilevate nell’arco di ricezione dell’antenna, ciascuna assegnata al proprio ID del ricevitore presente nel display originale stesso), pertanto è possibile sfruttare il sistema per utilizzi più che infiniti, unico limite la fantasia
Il sistema, che risulta molto economico (70€ la stazione e 40€ l’hardware tra ESP, modulo RF e cavetti), è molto compatto, e consente di rendere OpenSource anche una stazione abbastanza chiusa, consentendo di convidere i dati a progetti più ampi, per altri maker sotto forma di OpenData e soprattutto possono essere usati a proprio piacimento
La stazione del paese di Sorriva, presso Sovramonte (BL) è una Bresser modificata con il nostro gateway IOT, e compare nel sito di AMMS per il meteo in tempo reale
Future migliorie
Il sistema si presta a infinite personalizzazioni, e di conseguenza migliorie.
La prima di esse è l’utilizzo della devboard di proprio piacimento, l’importante è che sia un ESP32 e che i pin di collegamento vengano rispettati
Il ricevitore della stazione di Sorriva sopracitata
Successivamente stiamo pensando alla realizzazione di un PCB dedicato al sistema, al fine di rendere piĂą facile la costruzione del prototipo di invio dati, oltre che consentire maggiori uscite hardware per collegare batterie, display, attuatori e tanto altro ancora.
Avete idee e proposte per migliorare il progetto? Oltre che alla pagina GitHub del progetto potete contattarci nel gruppo Telegram dove potete parlare direttamente con gli sviluppatori!
Glossario
In questa sezione troverete le definizioni delle parole in grassetto presenti nell’articolo:
- AMMS: AUTONOMOUS METEREOLOGICAL MONITORING SYSTEM, è il sistema meteo creato da Klinkon Electronics in collaborazione con il DeLucaLabs che si occupa di monitorare l’ambiente dove sono presenti le centraline e fornire dati liberi a tutti
- OpenData: dati liberamente accessibili a tutti le cui eventuali restrizioni sono l’obbligo di citare la fonte o di mantenere la banca dati sempre aperta
- 868 MHz: Si tratta di banda in radiofrequenza ISM (Industria, Scienza e Medicina). Queste bande ISM vengono utilizzate in varie applicazioni, dal piccolo al grande pubblico o industriali nelle quali i criteri di portata, di costo e di autonomia sono critici.
- Gateway: in informatica e telecomunicazioni e in particolare nelle reti informatiche, è un dispositivo di rete che collega due reti informatiche di tipo diverso.
- IoT: si riferisce al processo di connessione a Internet di oggetti fisici di utilizzo quotidiano. I dispositivi IoT inseriti in questi oggetti fisici rientrano principalmente in una di queste due categorie: switch (che inviano un comando a un oggetto) o sensori (che acquisiscono dati e li inviano altrove).
- OpenSource: una licenza open source fa si che gli autori invece di vietare, permettono non solo di usare e copiare, ma anche di modificare, ampliare, elaborare, vendere e quant’altro, tutto questo senza imporre obblighi a ricompensare economicamente gli autori, un determinato progetto presente in una repository ben definita.
- Fork: indica lo sviluppo di un nuovo progetto software che parte dal codice sorgente di un altro giĂ esistente, a opera di un programmatore
- Token: indicatore univoco registrato in un registro accessi, con funzione di rappresentare un oggetto digitale, di certificare la proprietà di un bene o di consentire l’accesso a un servizio, in questo caso accedere al nostro servizio di caricamento dati.