MICAMonitor for Indoor Climate & Air

CO₂VOCtemperaturehumiditypressure on a friendly 1.69″ screen, and in Home Assistant over Zigbee. Built on the ESP32-C6, powered over USB-C or an optional LiPo, in a 3D-printable case with open-source firmware under the Apache 2.0 license.

Software

The dashboard on a green border: temperature 18.7 °C, CO₂ 468 ppm, VOC 17 ppb, gas 180 kOhm, humidity 47.5 %, pressure 1013 hPa, each with an hour's sparkline
Fresh air
Printing
The dashboard on an orange border with a VOC warning tag, the VOC row highlighted at 3517 ppb
VOC alert
The dashboard on an orange border with a CO₂ warning tag, the CO₂ row highlighted at 1598 ppm
CO₂ alert
The dashboard with a VOC index of 150 and a NOx index of 3
SGP41
The boot screen listing SCD41, SGP41, SGP30, SHT45 and BME680, each with a status dot
Boot

How to Flash

  1. Install Rust, then espflash:

    cargo install espflash --locked
  2. Download the firmware.

  3. Plug the board in over USB-C and write it:

    espflash write-bin --chip esp32c6 0x0 air-monitor-0.1.1-esp32c6.bin

Build from source

  1. Add the ESP32-C6 target and espflash:

    rustup target add riscv32imac-unknown-none-elf
    cargo install espflash --locked
  2. Download the source code (Apache 2.0) and unzip it:

    unzip air-monitor-0.1.1-source.zip && cd air-monitor-0.1.1
  3. Plug the board in, then build, flash and watch the log:

    make run

Buttons

KeyClickHold 2 s
BOOTWakeFan test
PWRScreen offPower off

Home Assistant, over Zigbee

SensorsTemperature, humidity, pressure, CO₂, VOC, battery
FanOn, timed
ChimeVolume, repeat
ScreenBrightness, timeout
CO₂ calibrationWrite the true CO₂

Assembly

Assembly diagram: the case exploded with every part, component and screw labelled, a parts and hardware list, and the case from the top, front and right with dimensions

Sensors

Cut one STEMMA QT cable and solder it to the board's header; chain the sensors in any order.

Red3V3
BlackG
BlueSDA
YellowSCL

Battery

It plugs into the board's BAT connector. Check the polarity first: many LiPo leads are wired the other way round for it.

Components

Everything to buy for one monitor, besides the printed parts.

#PartQtyFunctionSource
Board and power
01Waveshare ESP32-C6-LCD-1.691MCU, 1.69″ screen, LiPo charger, buttonsAmazon
02USB-C panel socket1Power and flashing through the bodyAmazon
03LiPo battery2000 mAh, 51.7 × 33.85 × 10.3 mm1Optional: runs it without USB
04STEMMA QT cable4Sensor chain; one is cut for the board
SensorsAdafruit breakouts, chained over I²C
05SCD410x621CO₂Adafruit
06SGP41 or SGP300x59 / 0x581VOC (SGP41: and NOx)SGP41SGP30
07SHT450x441High Precision Temperature, HumidityAdafruit
08BME6800x771Pressure, gasAdafruit
Fan driverOptional, soldered
09Fan30 × 30 × 10 mm, 5 V1Draws air past the sensors
10BC337NPN transistor, TO-921Switches the fan from the board's PWM
11STPS5H100BSchottky diode, DPAK1Absorbs the fan's turn-off spike
12Resistor330 Ω1Transistor base
13Electrolytic capacitor220–470 µF1Fan supply, close to the fan
14Ceramic capacitor100 nF–1 µF1Fan supply, close to the fan
Hardware
15ScrewM2 × 619
16ScrewM2 × 104
17ScrewM2 × 164
18ScrewM3 × 64
19ScrewM3 × 84
20ScrewM5 × 82
21Heat-set insertM2 × 3, short23
22Heat-set insertM3 × 3, short8
23Heat-set insertM5 × 5.8, short2
24WasherM2, Ø5 / Ø2.2 × 0.513
25MagnetØ6 × 316

Fan Driver

Solder it yourself: a transistor lets the board's PWM switch the 5 V fan; a diode absorbs its turn-off spike.

Fan driver wiring and soldering: the board's TX, G and 5V header pins, a 330 ohm resistor to the BC337's base, the fan between 5V and the collector, the STPS5H100B diode across the fan, a 220–470 µF and a 100 nF–1 µF capacitor from 5V to G, the seven joints in order, and how to tell each part's legs apart