A hardware monitoring display project for ESP32-C3 that shows CPU and GPU metrics on a ST7789 TFT display using LVGL graphics library.
Real-time hardware monitor with three circular gauge widgets displaying:
- CPU Temperature (left gauge)
- CPU Load (center gauge)
- GPU Temperature (right gauge)
The gauges feature color-coded zones that change based on the monitored values, providing quick visual feedback on system status.
- ESP32-C3 SuperMini
- ST7789 TFT Display (76x284 pixels)
- Serial connection to host PC for data input
| Function | GPIO Pin |
|---|---|
| TFT CS | 10 |
| TFT RST | 8 |
| TFT DC | 9 |
| TFT MOSI | 7 |
| TFT SCLK | 6 |
| TFT BL | 20 |
- PlatformIO - Build system and IDE
- Arduino Framework - ESP32 Arduino core
- LVGL - Light and Versatile Graphics Library for embedded displays
- LovyanGFX - Fast graphics library for various display controllers
- π΅ Blue: < 35Β°C (Cool)
- π’ Green: 35-55Β°C (Normal)
- π Orange: 55-75Β°C (Warm)
- π΄ Red: 75-100Β°C (Hot)
- π΅ Blue: < 40% (Low)
- π’ Green: 40-60% (Normal)
- π Orange: 60-80% (High)
- π΄ Red: 80-100% (Critical)
ββββββββββββββββββββββββββββββββββββββββ
β [CPU Temp] [CPU Load] [GPU Temp] β
β Β°C % Β°C β
ββββββββββββββββββββββββββββββββββββββββ
The device expects data via serial port at 115200 baud in the following format:
<cpu_temp>,<cpu_load>,<gpu_temp>\n
45,60,55
This would set:
- CPU Temperature: 45Β°C
- CPU Load: 60%
- GPU Temperature: 55Β°C
# Build the project
pio run
# Upload to device
pio run --target upload
# Monitor serial output
pio device monitor- Open the project folder in VS Code
- Use the PlatformIO toolbar:
- Click "Build" to compile
- Click "Upload" to flash the device
- Click "Serial Monitor" to view output
The display is configured in include/display.hpp using LovyanGFX with the following settings:
- Resolution: 284x76 pixels
- SPI Mode: 0
- Write frequency: 40 MHz
- Read frequency: 16 MHz
Modify these values in src/main.cpp to adjust gauge ranges:
// Temperature scale
static int32_t scale_temperature_min = 20;
static int32_t scale_temperature_max = 100;
// Load scale
static int32_t scale_load_min = 0;
static int32_t scale_load_max = 100;Adjust color zone transitions:
// Temperature zones
static int32_t zone1_temperature = 35;
static int32_t zone2_temperature = 55;
static int32_t zone3_temperature = 75;
static int32_t zone4_temperature = 100;
// Load zones
static int32_t zone1_load = 40;
static int32_t zone2_load = 60;
static int32_t zone3_load = 80;
static int32_t zone4_load = 100;HW Monitor/
βββ platformio.ini # PlatformIO configuration
βββ include/
β βββ display.hpp # LovyanGFX display driver configuration
β βββ pin_config.h # Pin definitions for TFT display
β βββ lv_conf.h # LVGL configuration
βββ src/
βββ main.cpp # Main application code
see python-daemon dir
- Check pin connections match
pin_config.h - Verify backlight is connected to GPIO 20
- Ensure power supply is adequate (5V/1A minimum)
- Verify baud rate is set to 115200
- Check USB cable supports data (not charge-only)
- Confirm correct COM port is selected
- Check serial data format matches:
<int>,<int>,<int>\n - Ensure values are within configured ranges
- Monitor serial output for parsing errors
This project is provided as-is for educational and personal use.
- Built with PlatformIO
- Graphics powered by LVGL
- Display driver by LovyanGFX
