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" TFT touchscreen (ILI9341 or ST7789, depending on the batch — the firmware detects which) 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.
The display controller is auto-detected too — CYD boards ship with either an ILI9341 or an ST7789 panel, and the same binary handles both.
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:
# first flash, blank board
esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash 0x0 SensorStation3-v1.5.10-merged.bin
# updating an existing install
esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash 0x20000 SensorStation3-v1.5.10.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...
Read more »
Viacheslav


Minimum Effective Dose
Vishnu Mohanan