Why another sensor station?
I've been into IoT and home/office automation for quite a while, but the hobby went on a fairly deep pause for the last few years — a job change, a temporary move to another country, the usual life reasons. Lately the desire to get back into it came back, even if the free time hasn't necessarily followed. I wanted to properly equip my current place with something similar to what I used to run.
So I dug up two old projects, SensorStation and SensorStation2. Both had their place, but each fell short in its own way — rough edges specific to how they were built that made them not quite worth resurrecting as-is. Rather than patch old code, I decided to build something new: something affordable, and — this time — public and open source from the start.
The result runs on hardware anyone can order for about $10. The ESP32-2432S028, better known in the community as the Cheap Yellow Display (CYD), is an ESP32 with an integrated 2.8" ILI9341 TFT touchscreen and an onboard light sensor. All you add is one I2C sensor.
What it does
The touchscreen dashboard shows:
- Current temperature and humidity, each with a 24-hour graph, trend arrow, and rate of change
- Calculated dew point
- Atmospheric pressure
- CO2-equivalent / IAQ when a BME680 with Bosch BSEC is connected
- Date, time (NTP-synced, timezone configurable), and Wi-Fi signal strength
Beyond the screen:
- MQTT telemetry to ThingsBoard and Domoticz, plus Home Assistant MQTT Autodiscovery — flash it, connect it to your broker, and the station announces its own sensors to Home Assistant with zero manual configuration
- OTA updates — the device checks for new firmware, shows an on-screen notification, and can install automatically
- Auto-dimming backlight driven by the CYD's onboard light sensor, so it doesn't glow like a beacon at night
- On-device settings — Wi-Fi, MQTT broker, timezone, temperature offset — all configured from the touchscreen with an on-screen keyboard. No config files, no recompiling.
Hardware
The bill of materials is refreshingly short:
- ESP32 CYD (ESP32-2432S028) — the whole computer, display, touch, and light sensor in one board
- One I2C sensor, connected to the board's I2C header:
| Sensor | Measures |
|---|---|
| BMP280 | temperature, pressure |
| BME280 | temperature, humidity, pressure |
| BME680 | + IAQ / CO2-equivalent (with Bosch BSEC) |
Sensors are detected automatically on the I2C bus — no menuconfig flags, no code changes. Plug in a BME280, get temperature/humidity/pressure; swap in a BME680 and the CO2 panel appears.
One honest caveat: the BME680's CO2 figure is an IAQ-derived CO2-equivalent, not a direct measurement. Direct NDIR CO2 via SCD40/41 is on the roadmap.
Firmware
The firmware is written in C on ESP-IDF v6.0.2 with LVGL (v9.5) for the UI. A few design decisions worth calling out:
You don't need a toolchain to try it. Releases ship a merged binary (bootloader + partition table + app in one file), so flashing is a single esptool command:
esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash 0x0 SensorStation3-esp32.bin
Web-based flashing straight from the browser is on the roadmap, which will drop the barrier even further.
Everything is runtime-configured. All settings live in NVS and are managed from the on-device Settings screen (PIN-protected). You can hand a flashed device to someone who has never seen a compiler and they can get it on their Wi-Fi and connected to their broker entirely from the touchscreen.
BSEC is optional and cleanly separated. Bosch's BSEC library (which turns BME680 gas readings into IAQ and CO2-equivalent) is proprietary and can't be redistributed, so the build doesn't include it. If you want IAQ, you download BSEC from Bosch yourself and drop it into components/bsec/algo/ — the build system picks it up. If you don't, a menuconfig switch disables it and the BME680 still reports temperature,...
Viacheslav
Juan Albanell
Turo Heikkinen
Neil McNeight
Mukesh Sankhla