Skip to content
← All posts

#002EN

DeskMate Air: a desk companion for the air you breathe

A battery-powered CO₂, temperature and humidity monitor on ESP32-P4, with a touch screen, history charts, gentle ventilation reminders and Home Assistant built in. CO₂ rises slowly in a closed room. By the time you notice a heavy head or lost focus, the air has been stale for a while. DeskMate Air sits next to the keyboard and makes that invisible number visible: at a glance, with colour, and with a reminder when it is time to open the window.

  • DeskMate, ESP32-P4, Sensirion, SCD30, Air Quality, Home Assistant, LVGL, Product
DeskMate Air in the dark, with its amber LED bar lit and the home screen showing clock, CO₂, temperature and humidity
What’s inside

The brain is an ESP32 with a 4.3-inch 480 × 800 touch screen in portrait. The measuring is done by a Sensirion SCD30, which reports CO₂, temperature and humidity. I talk to it over Modbus on a UART rather than I²C. Around them sit a small speaker, a strip of six WS2812 LEDs along the top edge, a microSD card and a flat LiPo cell, all in a 3D-printed enclosure.

The ESP32-P4 board, the LED strip along the top, the speaker on the right and the SCD30 sensor at the bottom

The sensor sits at the bottom of the case, below the board.

mounted at the bottom of the enclosure, below the ESP32-P4 module

The screen

The home screen borrows from a phone launcher: a clock and date, a CO₂ card with a short trend, temperature and humidity tiles, an energy and trash-pickup card, and a dock with Home, Energy, Calendar and Settings.

DeskMate Air home screen

The Air page shows the current CO₂ level as a ring and charts CO₂, temperature and humidity over 15 minutes, 1 hour, 12 hours, 1 day or 7 days. The history comes from the daily CSV logs on the microSD card. Short gaps, for example while the device was switched off, are bridged so the charts stay readable.

Reminders that escalate

When the air gets worse, DeskMate Air speaks up through its speaker, gently at first and then more often: every 30 minutes from 1200 ppm, up to every minute above 2000 ppm. Quiet hours keep it silent at night. When the screen is off, the light strip keeps showing the CO₂ colour, and starts blink past 2000ppm.

Calibration on the device

A CO₂ sensor is only as good as its calibration, so I put all of it on the device. From the Settings screen you can set a temperature offset, run a guided fresh-air recalibration (FRC), switch automatic self-calibration (ASC) on or off and set the altitude. No laptop, no serial console.

Ready for the smart home

Home Assistant

Over MQTT, with auto-discovery, the device shows up in Home Assistant with CO₂, temperature, humidity and battery sensors. It also works the other way round: Home Assistant sends (in my use-case) solar production, grid use and home-battery state for the Energy page, plus calendar events and trash pickup days.

Making it mobile

The current draw sits around 200mA with the backlight at 70%, so it’s not exactly efficient, to that end I haven’t spent a lot of time diving intro power saving options since the display is the biggest consumer and having that off defeats the purpose of the device; I did however integrate a small LiPo cell that makes it easy to carry from room to room and even operate in low power mode (screen off) for a whole night without it being plugged in. The firmware is managing the charge level and implements a protective shutdown when the battery falls too low.

DeskMate Air opened from the back

For debugging there is a capped system log on the SD card and a /logs web page on the device, including a live view.

What’s next

Addressing LCD retention

LCD Retention

This I will do by using an 8 position pixel shit every 120-180 seconds, but not having the display always on should also help.

The firmware is at version 0.9, and everything above already works. I picked the name DeskMate Air on purpose, to leave room for an “Air Plus” or “Air Pro”. The next generation will swap the colour screen for e-paper on an ESP32-S3 and move to a Sensirion SCD41, possibly with an SGP41 for VOC and NOx. Same idea, longer battery life, smaller footprint.