Messasure CO2 particles in to the air. Warns when you should ventilate the room.
You find an video documentary (in german) on my Youtube channel: https://www.youtube.com/watch?v=MKK0GAGxzaE
- Measure CO2 concentration in room
- MQTT support (for Node-Red or Home Assistant)
- easy integration in own WiFi network (Hotspot settings-page)
- OLED display: can used independently thanks to the measured values shown on the display
* Affiliate Links - help to support my projects
| Pin on Sensor | description | Pin on ESP32 | 
|---|---|---|
| 16 | GND | GND | 
| 17 | Power (5V) | VIN (can also used as 5V output) | 
| 18 | UART RXD | GPIO17 (UART 2 TX) | 
| 19 | UART TXD | GPIO16 (UART 2 RX) | 
| Pin on Sensor | description | Pin on ESP32 | 
|---|---|---|
| GND | GND | GND | 
| VCC | Power (3.3V) | 3V3 | 
| SCL | GPIO22 (I2C SCL) | |
| SDA | GPIO21 (I2C SDA) | 
- connect all parts to the ESP32
- connect power
- the ESP32 starting an own Wifi access point named "co2-meter-{device ID}"
- connect to this Wifi with your smartphone
- use waaateringfor Wifi password
- you will redirected to a config page
- insert your Wifi and MQTT broker credentials
- click on "save"
- the ESP32 will restarting and connect to your MQTT broker
- after about 60 seconds should you should see a new topic in your MQTT broker co2-meter/{device ID}/out/infowith a lot of information in the payload
The whole module is controllable via MQTT protocol. So it's easy to integrate in existing SmartHome systems (like Home Assistant or Node-Red).
Topic: co2-meter/{device ID}/in/{command}
| command | description | payload | 
|---|---|---|
| sleep | Start deep-sleep for specific duration (in seconds!) | { duration: number } | 
| info | Send info via MQTT topic co2-meter/out/infopackage | - | 
| display | turn display on/off | { on: boolean } | 
| hard-reset | Reset config with WiFi and MQTT settings and start internal hotspot to reconfigure device. | - | 
Topic: co2-meter/{device ID}/out/{command}
| command | description | payload | 
|---|---|---|
| info | status info | complex JSON. See "info-state" chapter | 
| sleep | was send if sytem enter deep-sleep | { duration: number } | 
| wakeup | was send if sytem wakeup from deep-sleep | reason "timer" | 
| field | description | type | 
|---|---|---|
| version | version number of module firmware | string | 
| system.deviceId | Unique ID of the device. Will used also in MQTT topics. | string | 
| system.freeHeap | free heap memory of CPU | number | 
| network.wifiRssi | wifi signal strength (RSSI) | number | 
| network.wifiQuality | quality of signal strength (value between 0 and 100%) | number | 
| network.wifiSsid | SSID of connected wifi | string | 
| network.ip | ip address of the module | string | 
| network.mac | MAC address of the device | string | 
| co2.isPreheating | TRUE if the sensor is preheated | boolean | 
| co2.temperature | temperature from sensor (in °C) | number | 
| co2.ppm | CO2 concentration in the air (in ppm) | number | 
You can create a robust housing with a 3D printer or at the workbench.
I decided to make one out of plywood. It didn't turn out perfect, but it protects the components.
- buy sensor and ESP32
- soldering first prototype
- add WifiManager to easy setup
- create sketch
- test firmware
- test OTA updates
- add part list
- add video doc
- create housing (from wood)

