AIR QUality monitor
I wanted to monitor a variety of air characteristics around the house using a selection of cheap MQ-type sensors. These sensors don't come calibrated and I don't have the tools to calibrate them. But they could give me relative readings and feed them back into Home Assistant using ESPHome.
What I Learned
Monitoring air quality is surprisingly hard. For example, since CO2 doesn’t react with much, you have to get creative about measuring it and that can be pricey. Plus, lots of sensors have little heaters in them so they consume more energy than you think. I’ve worked on a number of projects connected to social and poor quality housing and we’ve often discussed Internet of Things (IoT) solutions for monitoring. This showed some of the nuances of that approach.
Case & Hardware
There are loads of MQ sensors but I picked an MQ-2 (gas leaks), MQ-7 (Carbon Monoxide), and MQ-135 (general air quality). I would like to add a CO2 sensor but these are expensive (or were at the time of this project, started some time around 2015).
I designed a 3D-printed case to hold four generic MQ sensor modules on their fairly standard-sized boards. They don't all come with exactly the same PCB backing but most can be made to fit with minor mods to the mounting plate.
The case is deliberately very modular so you can choose your own variety of sensors. I also added in a DHT-22 to monitor temperature and humidity alongside the three MQs. It holds a NodeMCU on one of its base mounts that gives you a voltage regulator and breaks out the GPIO pins. The barrel jack from the NodeMCU base is exposed at the rear so you can power it with a standard PSU - 6-12V. There are also spaces for an Arduino Pro Mini to give you additional GPIO, and a level shifter module to take the NodeMCU's 3v3 logic up to 5v. I also added in a strip of veroboard on mine to give more 5V/GND breakouts on some Dupont pins, and to hold some pull-up resistors. But what you need will depend on the sensors you use - and the microcontroller. Use something with 5V logic and you can do away with some of this.
The whole case is held together with just two M3 screws into threaded inserts in the base. I'm really pleased with the neatness and simplicity of this.
I built this many projects ago so this page has been assembled from a combination of memory, Fusion360 files, and what I can see looking inside the case, so forgive any holes in the information.
You can download the full set of STL files on Github.
Code
This is my config file for ESPHome - note the formatting may be messed up. You will need to follow the instructions for the Arduino port extender if you want to use the same hardware as me.
esphome:name: gas_sensor platform: ESP8266 board: nodemcuv2 includes:- arduino_port_expander.h wifi:ssid: "your_ssid" password: "your_password" use_address: air_monitor.local # Enable fallback hotspot (captive portal) in case wifi connection fails ap:ssid: "Air Monitor Fallback Hotspot" password: "your_password" captive_portal: # Enable logging logger: # Enable Home Assistant API api:password: "your_password" ota:password: "your_password" # define i2c device# for an ESP8266 SDA is D2 and goes to Arduino's A4 # SCL is D1 and goes to Arduino's A5 i2c: id: i2c_component # define the port expander hub, here we define one with id 'expander1', # but you can define many custom_component: - id: expander1lambda: | - auto expander = new ArduinoPortExpander(i2c_component, 0x08, true);return {expander}; binary_sensor: - platform: status name: "Air Monitor Status" # define analog sensors sensor: -platform: custom lambda: |-return {ape_analog_input(expander1, 1), // 1 = A1ape_analog_input(expander1, 2),ape_analog_input(expander1, 3)}; sensors: - name: MQ-7 id: mq7filters: # update every 60s - throttle: 60s # outputs between 0 and 5 volts - turn into percentage - lambda: return x *100/1023; - name: MQ-135 id: mq135 filters: # update every 60s - throttle: 60s # outputs between 0 and 5 volts - turn into percentage - lambda: return x *100/1023; - name: MQ-2 id: mq2 filters: # update every 60s - throttle: 60s # outputs between 0 and 5 volts - turn into percentage - lambda: return x *100/1023; - platform: wifi_signal name: "Air Monitor Wifi Signal" update_interval: 60s - platform: uptime name: "Air Monitor Uptime Sensor" - platform: dht pin: D4 model: DHT22 temperature: name: "Air Monitor Temperature" humidity: name: "Air Monitor Humidity" update_interval: 60s
Make it stand out.
It all begins with an idea. Maybe you want to launch a business. Maybe you want to turn a hobby into something more. Or maybe you have a creative project to share with the world. Whatever it is, the way you tell your story online can make all the difference.
Make it stand out
It all begins with an idea. Maybe you want to launch a business. Maybe you want to turn a hobby into something more. Or maybe you have a creative project to share with the world. Whatever it is, the way you tell your story online can make all the difference.
Make it stand out.
It all begins with an idea. Maybe you want to launch a business. Maybe you want to turn a hobby into something more. Or maybe you have a creative project to share with the world. Whatever it is, the way you tell your story online can make all the difference.