Indoor Air Quality station

“Previsioni del tempo: lo sprecherò anche per tutta la prossima settimana.”

La qualità dell’aria che respiriamo è importante. Anche quando siamo dentro casa nostra.

Con pochi euro di materiale e qualche ora di lavoro (riuscire a ritagliarsi del tempo per giocare non è mai facile!), alla fine sono giunto ad avere un modulo praticamente completo che rileva:

  • temperatura, umidità e pressione atmosferica (BME280);
  • presenza di sostanze organiche volatili (VOCs), come CO2, nell’aria (MQ135);
  • calcolo dell’indice humidex;

i dati rilevati vengono inviati via protocollo MQTT al broker indicato, il tutto comodamente gestibile via interfaccia web attraverso la wifi casalinga.

Le sostanze organiche volatili identificabili dal sensore MQ135 (VOCs) sono monossido di carbonio, anidride carbonica, ammoniaca, idrocarburi aromatici, anidride solforosa, vapori di benzene e altri gas pericolosi, in concentrazioni da 10 a 1000ppm. Sfortunatamente l’uscita analogica del sensore non consente di discriminare la tipologia di gas rilevato (rimando a un interessante articolo in merito: Cheap CO2 meter using the MQ135 sensor with AVR ATmega).

Hardware

Il cuore di tutto è un modulo WeMos D1 mini, che monta il già noto ESP8266, di cui abbiamo già parlato in altri articoli sempre su questo blog, più una manciata di altri componenti:

  • modulo di temperatura, umidità e pressione Bosch BME280;
  • modulo VOCs con MQ135 (su Aliexpress);
  • led RGB anodo comune;
  • 3 resistenze 820 Ohm ¼W;
  • 1 resistenza 270 kOhm ¼W;
  • 1 buzzer passivo 5v (su Aliexpress);
  • modulo WeMos D1 mini lite (su Aliexpress);
  • alimentazione 5V con almeno 500mA di potenza;

lo schema elettrico è piuttosto semplice:

Un occhio esperto potrebbe chiedersi il motivo della ulteriore resistenza da 270KOhm sulla porta dell’ADC A0, considerando che c’è già, sulla scheda WeMos D1 Mini Lite, un partitore resistivo (R1=220KOhm e R2=100KOhm) per portare il range originale (0-1V) a 0-3.3V.

WeMos D1 mini pins and diagram
WeMos D1 Mini lite pinout diagram

Poiché il modulo MQ135 è alimentato dalla Vcc a 5V, è necessario estendere il range dell’ADC portandolo da 3.3 a 5V. Aumentando quindi la R1 fino a 490KOhm (Vout=Vin*(R1/R2)=Vin*(100K/490K)) si ottiene un range di ingresso dell’ADC a 0-5V.

Il modulo Bosch BME280 è connesso via bus i2c ai pin D4 e D5 e alimentato a 3.3V (assicuratevi di avere un modulo che supporta questo voltaggio).

Software

Successivamente sarà necessario compilare e installare il firmware, che potete scaricate da github.com/michelep/IndoorAirQualityMonitor.

Pre-requisiti:

inoltre saranno necessarie anche queste librerie:

Per caricare i files sulla partizione SPIFFS (SPI Flash Filing System) ho usato il comodissimo tool Arduino ESP8266 filesystem uploader.

Dentro la cartella “data”, che contiene i file da memorizzare nello SPIFFS, c’è il file config.json che contiene la configurazione del modulo, compresa la parte che riguarda la connessione alla rete WiFi che i dati del broker MQTT per l’invio dei parametri ambientali rilevati.

L’interfaccia web della stazione di monitoraggio mostra in tempo reale i parametri rilevati.

E’ possibile impostare delle soglie di allarme che fanno suonare il buzzer on-board al superamento dei limiti impostati:

Tutta la configurazione è modificabile dall’interfaccia web disponibile on-board. In assenza della connessione ad una rete WiFi, il modulo si predispone in modalità access-point con SSID “IHOT_AP” e autenticazione PSK con password “12345678“.

Il modulo sincronizza data e ora via NTP e il led RGB “pulsa” del colore relativo all’indice humidex calcolato dai parametri ambientali.

Humidex

L’indice humidex, sviluppato dai meteorologi canadesi, serve a indicare la percezione di comfort a seconda dei parametri ambientali quali temperatura e umidità. Il calcolo avviene secondo una funzione matematica:

float calculateHumidex(float temperature, float humidity) {
  float e;
  e = (6.112 * pow(10,(7.5 * temperature/(237.7 + temperature))) * humidity/100);
  float humidex = temperature + 0.55555555 * (e - 10.0);
  return humidex;
}

che restituisce un valore tra 20 e 54-55, corrispondente all’incirca a questi gradi di comfort:

https://i2.wp.com/www.aragonvalley.com/wp-content/uploads/2015/09/Humidex_11.jpg

MQTT

Durante lo sviluppo del prototipo ho sperimentato diverse metodologie di invio dei dati. Inizialmente usavo una interfaccia REST che, però, si è rivelata presto inadeguata. Ho così deciso di passare a MQTT, installando Mosquitto sul mio NAS Synology casalingo, che uso come broker.

Bastano anche poche righe di Python e la libreria client MQTT per ricevere i dati relativi alla qualità dell’aria di casa:

#!/usr/bin/env python
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
     print("Connected with result code "+str(rc))
     client.subscribe("#")

def on_message(client, userdata, msg):
     print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("[MQTT broker]", 1883, 60)

client.loop_forever()

Usando un gateway MQTT-MySQL sarà anche possibile visualizzare i dati usando una piattaforma come Grafana.

Hai trovato utile questo articolo?

Questo articolo è stato visto 271 volte (Oggi 1 visite)
6 comments
  1. Salve Michele, bellissimo progetto innanzitutto, sarebbe disposto ad aiutarmi ,dato che sono un principiante, nella crazione di tre schede nodemcu esp8266 con il suo codice….io avrei tutto il materiale a disposizione.
    Grazie in anticipo.
    Saluti

  2. ho installato manualmente tutte le librerie richieste e dopo aver compilato il progetto con arduino ottengo questo messaggio : exit status 1
    Error compiling for board NodeMCU 1.0 (ESP-12E Module)

  3. Salve Michele, grazie per l’interessante articolo;
    premessa: da programmatore mi è chiara la parte di codice ma con la parte di elettrotecnica… non sono ancora ferrato, stò studiando, ma le chiedo un aiuto per continuare a “giocare”
    non mi è chiaro un solo passaggio: lei scrive: 1. “ulteriore resistenza da 270KOhm sulla porta dell’ADC A0” ma io nella schema vedo un 180k… quindi la somma con la 220k interna al Wemos farebbe 400k e mi salta tutto il ragionamento successivo…
    dove sbaglio/non capisco ?
    GRAZIE!!!

  4. Ciao Michele, dato che per la comunicazione dati utilizzi MQTT Mosquitto il tuo progetto dovrebbe essere perfetto e già completo anche per l’utilizzo in Home Assistant o sbaglio?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.