Stazione meteo interattiva per centraline domotiche

Conoscere i dati dell’ambiente che ci circonda è utile per molti motivi: sapere se fa freddo o caldo è fondamentale per capire come vestirsi prima di uscire di casa, mentre conoscere la qualità dell’aria che respiriamo è indispensabile per la nostra salute. In entrambi i casi la tecnologia ci viene in aiuto. In questo articolo andremo a costruire e programmare una stazione meteo interattiva che può interagire con tutte le centraline domotiche in grado di ricevere dati in MQTT. La stazione meteo interattiva sarà composta da alcuni sensori i quali misureranno rispettivamente temperatura, umidità, pressione atmosferica, qualità dell’aria (PM2.5 e PM10) e un microcontrollore ESP8266 che invierà i dati tramite Wi-Fi alla centrale domotica. Abbiamo scelto il programma di domotica Home Assistant (in questo articolo diamo per assunto sia già installato e configurato e si farà riferimento alla versione 2021.12.5) come centralina di ricezione e acquisizione dati, che viene installato su un Raspberry Pi 4. La scelta è dovuta alla versatilità di questo programma nella creazione e gestione dei dati ricevuti da una grande varietà di sensori.

Hardware

Il principio di funzionamento della stazione meteo interattiva è molto semplice: è stato utilizzato un sensore di tipo BME280 in modalità I2C (Figura 1) che misura temperatura, umidità e pressione atmosferica e un sensore SDS011 (Figura 3) che misura i valori di qualità dell’aria PM2.5 e PM10. Abbinati ad un microcontrollore ESP8266 si esegue una lettura e tramite il Wi-Fi si inviano i dati alla centralina. Analizzando i due sensori, si scopre che il BME280 è un sensore combinato, ovvero è in grado di registrare tre diversi fattori in uno. In questo caso temperatura, umidità e pressione. I parametri di questo sensore sono per la temperatura un range di funzionamento da -40°C a +85°C, una risoluzione di 0.01°C e una precisione di +-1°C, per l'umidità il range di funzionamento è da 0 a 100%, la risoluzione di 0,008% e una precisione del +-3% e, infine, la pressione ha un range da 300 a 1100hPa, una risoluzione di 0,18Pa e una precisione di +-1Pa. Di questo sensore ne esistono due versioni: I2C e SPI. In questo progetto, per comodità, si è utilizzata la versione I2C.

Figura 1: Il sensore BME280 nella versione I2C

Per quanto riguarda, invece, il sensore PM2.5 e PM10, basa il suo funzionamento sul principio di diffusione ottica, detto anche scattering (Figura 2): quando un raggio luminoso colpisce una particella, quest’ultimo viene diffuso in maniera disordinata in ogni direzione. Il sensore è composto da una ventola che aspira l’aria in una “camera oscura” in cui sono contenuti un piccolo laser e un rilevatore. In assenza di particolato il laser non si diffonde nella camera oscura non trovando ostacoli, di converso, colpendo la particella, il laser si irradia e viene rilevato dal fotodiodo. Il sensore riesce a distinguere le particelle PM2.5 e PM10 perché la luce diffusa ha diverse lunghezze d’onda. L’analisi finale viene eseguita da un microcontrollore a 8bit. Analizzando le specifiche si scopre che i parametri di questo sensore sono range di funzionamento da 0 a 999 µg/mᶟ e risoluzione 0,3 µg/mᶟ. Il bus di comunicazione con il nostro ESP8266 è di tipo UART. Purtroppo questo sensore è soggetto a usure molto veloci dovute al fascio laser che è stato dichiarato dal costruttore con un ciclo di vita di 8000 ore (circa 11 mesi), dopodiché si avranno delle letture sfalsate o, addirittura, nessuna lettura. Si dovranno prendere delle accortezze durante la progettazione della nostra stazione meteo per allungare il più possibile la vita del sensore.

Figura 2: Diffusione della luce quando incontra un ostacolo - lo scattering

Un’ultima importante considerazione prima di entrare nel vivo del progetto: attualmente la concentrazione di PM2.5 e PM10 in Italia è regolata dal DLGS 155/2010 e sul sito del Ministero della Salute sono riportati tutti i limiti consentiti per legge:

- Relazione del Ministero della Salute sul PM10

- Relazione del Ministero della Salute sul PM2.5

Figura 3: Il sensore SDS011 in tutta la sua lucentezza

Preparazioni preliminari

Le primissime operazioni da effettuare sono quelle relative alla configurazione software: sarà necessario predisporre la comunicazione tra i due dispositivi in Home Assistant e la configurazione dell’IDE di Arduino, in modo da avere il framework e le librerie varie già importate. Iniziamo con la creazione di un utente a sé stante per il broker MQTT in Home Assistant. Questa operazione si esegue premendo su Configurazioni - Dispositivi e Zone - Utenti - Aggiungi Utente. Per questo progetto è stato creato l’utente “mqtt” con password “mqtt”. MQTT è l’acronimo di Message Queue Telemetry Transport. Nato nel 1999, si è affermato come standard di comunicazione per le periferiche IoT per la sua semplicità d’uso e versatilità. Utilizza un metodo di comunicazione detto “Publish and Subscribe” (Figura 4), ovvero in modo asincrono: il nodo A pubblica un messaggio (Publish) che verrà ricevuto da tutti i nodi iscritti (Subscribe) a quel topic, ovvero argomenti (come ad esempio la temperatura, l’umidità o la pressione atmosferica). Lo scambio dei messaggi viene gestito da un broker e lo si può specificare anche attraverso una QoS (Quality of Service) definita:

At Most Once: il messaggio viene inviato una volta sola, senza preoccuparsi che venga ricevuto

At Least Once: il messaggio viene inviato finché non si ha una conferma di ricezione

Exactly Once: il messaggio viene inviato una sola volta con conferma di ricezione

Figura 4: Principio di funzionamento del protocollo MQTT

Per installare il broker all’interno di Home Assistant bisogna cliccare su Configurazioni - Componenti Aggiuntivi Backup e Supervisor - Raccolta di Componenti Aggiuntivi. Sulla casella di ricerca in alto digitare “mosquitto broker” e premere su Installa. Non va avviato in quanto bisogna eseguire dei semplici passaggi di configurazione: spuntare le voci Esegui all’Avvio e Attiva Watchdog per automatizzare il processo di avvio e per fare in modo di auto-riavviare il componente in caso di malfunzionamenti. Premere infine su Configurazione sulla barra in alto e modificare i settaggi come in Figura 5.

Figura 5: Configurazione di MQTT all'interno di Home Assistant

A questo punto è possibile avviare il componente aggiuntivo appena installato premendo su Avvia nel pannello Informazioni. Se tutto è stato eseguito correttamente premendo su Configurazione - Dispositivi e Servizi si noterà il pannello di MQTT. Per ora si abbandona Home Assistant per passare all’IDE Arduino. Per questo progetto è stato scelto un nodeMCU ESP8266 modulo 12-E, per le sue dimensioni ridotte e per il modulo Wi-Fi integrato. Per aggiungere la scheda all’IDE di Arduino si preme su File - Impostazioni e si inserisce la stringa https://arduino.esp8266.com/stable/package_esp8266com_index.json nella casella Url aggiuntivi per gestione schede. Successivamente su Strumenti - Gestione schede si ricerca ESP8266 e si preme su Installa. I settaggi da fare per questo tipo di scheda sono:

  • Scheda: NodeMCU 1.0
  • Upload Speed: 115200

Collegando la scheda alla porta del computer, questa verrà rilevata e si può selezionare la porta corrispondente che varia in base al PC, in questo articolo si assumerà di default la porta COM7. Le librerie da installare per il corretto funzionamento della nostra centralina meteo sono espMQTTClient, AdaFruit BME280 e Wire. Queste tre librerie si trovano su Strumenti - Gestione librerie nell’IDE di Arduino. Probabilmente il software chiederà di installare anche delle dipendenze, bisogna rispondere si, perché servono per il corretto funzionamento del software che si andrà a scrivere. Per quanto riguarda il sensore PM2.5 PM10 è stata scelta la libreria Nova Fitness dust sensor, scaricabile su github all’indirizzo https://github.com/lewapek/sds-dust-sensors-arduino-library perché è in grado di gestire via software lo spegnimento e la riaccensione del sensore. Una volta scaricato il file zip la si importa da Sketch - Includi Libreria - Importa libreria da File Zip.

Schema elettrico e collegamento

Prima di procedere con lo schema di collegamento, è bene studiare la piedinatura del microcontrollore che si andrà ad usare, ovvero il nodeMCU ESP8266, che è una piattaforma open source sviluppata specificatamente per applicazioni IoT (Internet of Things) ed è programmabile in LUA, MicroPython o con linguaggio nativo Arduino (C++).

Figura 6: Piedinatura e indicizzazione dei pin dell'ESP8266

Dalla piedinatura evidenziata in Figura 6, saltano subito all’occhio i vari pin 3V3 e GND: sono uscite di alimentazione a 3.3V, una delle quali verrà sfruttata per alimentare il nostro sensore BME280, dato che funziona in un range di alimentazione da 3.3V a 5V. La coppia di pin VIN - GND in alto a destra ha una duplice funzione: se non è disponibile un’alimentazione USB si possono sfruttare per alimentare il circuito con un range di tensione da 5V a 12V, anche se è altamente sconsigliato alimentare a 12V in quanto il regolatore di tensione interno potrebbe rovinarsi in breve tempo. Il range di alimentazione ideale è da 5V a 9V. Se, invece, è disponibile un’alimentazione sulla porta USB, il pin Vin può essere sfruttato come alimentatore, in quanto ha la stessa tensione di 5V della presa USB ed alimentare sensori che hanno un voltaggio più alto, come ad esempio l’SDS011. In questo progetto si utilizzerà la seconda soluzione, in modo da avere anche una tensione di alimentazione più alta. I pin GPIO6, 7, 11 e 8, insieme al blocco GPIO15, 13, 12 e 14 sono utilizzabili per il bus SPI, mentre i pin GPIO5 e 4 sono utilizzabili come seriale (RX-TX) oppure come bus I2C. La versatilità di questo microcontrollore, però, permette all’utilizzatore di designare i vari pin a diversi usi. Definendo, ad esempio, il pin GPIO14 come uscita digitale e collegandoci un LED, lo si può accendere e spegnere.

Figura 7: Schema di collegamento

Come si vede dall’immagine in Figura 7, lo schema di collegamento è molto semplice. L’unico problema che si riscontra è che entrambi i sensori sfruttano i pin D1 e D2 (GPIO4 e 5) in quanto questi pin funzionano sia come Seriale che come I2C. Si andrà a rimappare via software il bus I2C per risolvere il problema.

Lato SDS011 si avrà quindi:

TX → pin D1 (RX della porta seriale)

RX → pin D2 (TX della porta seriale)

5V → Vin

GND → GND

E’ importante notare che il collegamento tra SDS011 ed ESP8266 è di tipo incrociato, ovvero il pin TX del sensore va collegato al pin RX del controllore e viceversa.

Lato BME280 si avrà:

SDA → pin D3

SCL → pin D4

Vin → 3V3

GND → GND

Figura 8: PCB del circuito completo realizzato con Fritzing

Per cimentarsi nella realizzazione pratica, è bene creare un piccolo PCB (Figura 8) dove fissare correttamente il controllore e il sensore BME280. Il sensore SDS011 va collegato tramite dei jumper.

Il codice

Per iniziare, è bene partire da un codice base: dall’IDE Arduino premere su File - Esempi - EspMQTTClient - SimpleMQTTClient. Questo codice è la base di partenza della centralina meteo ed è già implementato il collegamento al server: basterà modificare i parametri di connessione.

Figura 9: Parametri MQTT di connessione al broker

Come si vede in Figura 9, WifiSSID e WifiPassword vanno settati con i parametri della rete Wi-Fi a cui dovrà connettersi la centralina, il terzo parametro, MQTT Broker server IP, va settato con l’indirizzo IP del Raspberry Pi su cui è stato installato precedentemente il broker. MQTTUsername e MQTTPassword vanno sostituiti con l’utente che è stato creato in Home Assistant (MQTT come Username e MQTT come Password). La parte commentata con Optional functionalities of EspMQTTClient si può rimuovere, in quanto non servirà per questo progetto così come la parte commentata con Execute delayed instructions. La riga successiva, Publish a message to "mytopic/test", invece, va spostata sotto client.loop(). Aggiungere infine una riga delay(5000) per attendere 5 secondi prima di rieseguire il codice. A questo punto si è pronti per testare il collegamento tra l’ESP8266 e il broker. Sul Raspberry Pi premere su configurazioni - dispositivi e servizi - mosquitto broker. Sulla casella Argomento a cui iscriversi digitare mytopic/test e premere su Inizia ad ascoltare. Caricare il codice modificato in precedenza su Arduino e, dopo qualche secondo, dovrebbe apparire sul broker il messaggio di esempio “This is a message”. Se tutto funziona si è pronti a scrivere il codice completo, che è scaricabile in fondo all'articolo. È importante analizzare il codice sviluppato, in modo da avere completa padronanza della centralina.

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3586 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend