This is a small PC telemetry monitor built with a XIAO ESP32-S3 and a Seeed 240×240 GC9A01 LCD.
It displays PC stats over USB, gets weather and settings from an Android companion app via BLE, and grabs room temperature, humidity, and pressure from a separate ESP32 sensor node over ESP-NOW.
![]() Clock |
![]() PC Telemetry |
![]() Room Data |
![]() Weather |
![]() Settings |
![]() Mobile Companion |
- LVGL UI designed for the circular screen
- Touch input and brightness control via the CST816D controller
- 3D printed housing
- Linux daemon that uses
nvidia-smito push CPU/GPU stats over USB serial - React Native Android app (uses native BLE for settings, background weather sync, and status checks)
- PCF8563 RTC keeps time when disconnected
- Battery voltage monitoring via ADC divider
- Wireless room sensor: A separate ESP32 reads temp/humidity/pressure from a DHT11 and BME280, broadcasts via ESP-NOW, then drops into a 120-second deep sleep.
├── firmware/
│ ├── data/ # Display assets and fonts
│ ├── src/
│ │ ├── display/ # Main display firmware (PlatformIO)
│ │ └── sensor/ # ESP32 room sensor (PlatformIO)
│ └── platformio.ini
│
├── desktop/ # .NET 9 Linux telemetry service
├── mobile/ # Expo / React Native Android app
│
└── HARDWARE_GUIDE.md # Pinouts and assembly quirks
Main Display:
Room Sensor Node:
- Any standard ESP32 board (NodeMCU, WROOM, etc.)
- DHT11 sensor
- BME280 sensor
Build and upload the main display firmware:
cd firmware
pio run -e display -t uploadFor the room sensor node:
pio run -e sensor -t upload(Check
platformio.iniif you need to change your upload ports).
You need Linux, the .NET 9 SDK, and nvidia-smi.
cd desktop
dotnet restore
dotnet runThe daemon pings the display over serial (115200 baud) and pushes stats every second. You can set it up as a systemd service to run in the background.
You can't use Expo Go because of the native BLE modules. Build and run it locally:
cd mobile
npm install
npm run androidCheck HARDWARE_GUIDE.md before putting this together.
A few major quirks to watch out for:
- I2C init order is annoying. The display has to be initialized before I2C, and the CST816D touch controller needs a manual reset sequence.
- There's a 2-bit DIP switch on the back of the Seeed board. It must be flipped ON, or the RTC, touch, and battery monitor won't work at all.
Most of the main features are done:
- Basic UI and LVGL navigation
- PC telemetry over USB
- Android BLE connection and background weather sync
- Room sensor ESP-NOW integration
- Add more screens (e.g., detailed weather forecast)
- Implement settings sync from the phone






