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 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 basato su Bosch BME280 (su Aliexpress);
  • 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

Passando al software, che potete scaricate liberamente da github.com/michelep/IndoorAIQStation, il funzionamento è piuttosto semplice. Ho usato, per lo sviluppo, l’SDK di Arduino con le librerie ESP8266. 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“.

Tra le altre cose, è possibile far inviare i messaggi di debug ad un server syslog remoto.

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

Per compilare, il codice dipende dalle seguenti librerie:

Humidex

L’indice humidex, sviluppato dai metereologi 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. A questo punto, 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()
   

che mi restituisce un array JSON del tipo:

thaq-sensor {"t":29.61,"h":40.7207,"p":985.4027,"alt":234.4712,"hdex":33.41935,"ts":1562300000,"aq":0.278696}

(Visitato in totale 582 volte, oggi 1 visite)
3 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)

Lascia un commento

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