Some hardware links on this page are affiliate links. As an Amazon Associate I earn from qualifying purchases. We may earn a commission if you buy through them, at no extra cost to you. See the affiliate disclosure.
A Cheap Yellow Display next to a monitor can show the numbers a hardware tool already reads on that PC. This pack sends them down the same USB cable that powers the board. CPU and GPU temperature, load, and watts, RAM and VRAM, and the two fan speeds update about once a second. Nothing in that path uses Wi-Fi, Home Assistant, or an account.
The desk companion on this board shows a line Home Assistant pushed. The 12-button panel and the touch thermostat are controls. This one is a gauge cluster for the computer it is plugged into.
What problem it solves
You want live PC temperatures and load on a small screen on the desk, including when the PC is not on the network and when Home Assistant is down.
How it works
The PC side is a Python feeder the pack includes. Once a second it writes one text line to the CYD’s USB serial port at 115200 baud:
PCS,<cpu °C>,<cpu %>,<cpu W>,<gpu °C>,<gpu %>,<gpu W>,<ram used GB>,<ram total GB>,<vram used GB>,<vram total GB>,<cpu fan rpm>,<gpu fan rpm>
An empty field means unknown. The screen shows that cell as --.
- Where the numbers come from — LibreHardwareMonitor, running on that Windows PC, supplies CPU temperature, CPU power, and fan speed. The feeder reads CPU load and RAM from the operating system. GPU temperature, load, power, and VRAM come from LibreHardwareMonitor, and from
nvidia-smiwhen the GPU is not in that tool. The pack’s install notes cover Windows 10 and 11. - The cable is the data path — ESPHome’s logger baud rate is 0, because UART0 (GPIO1 and GPIO3) is the USB serial chip. Logging and the gauge stream cannot share that port. The feeder finds the CYD by its USB serial chip (CH340, CH9102, or CP210x), so moving the plug to another USB port still works.
- The screen — two cards (CPU and GPU), each with load, temperature, and watts, plus RAM and VRAM bars and the two fan speeds. Temperature text goes amber at 70 °C on the CPU and 80 °C on the GPU, and red at 85 °C. Those thresholds are substitutions in the pack.
- When the PC stops talking — if lines stop, the pack draws a waiting state and dims the backlight after one minute. Plugging the feeder back in restores the gauges and the backlight.
- Home Assistant is optional — the default YAML has no Wi-Fi block. A second file in the pack adds Wi-Fi, the native API, and template sensors for the same twelve numbers, so a dashboard can show them. Serial logging stays off in that file too. Credentials for that file stay in
secrets.yaml.
LibreHardwareMonitor’s local reader listens on port 8085 on the PC. Leave it reachable from that PC only. Do not forward the port.
Hardware notes
- Board. ESP32-2432S028, any USB rev, 2.8″ 320×240. The controller is ILI9341, ILI9342, or ST7789, and the number of USB ports does not tell you which. The pack ships three YAML files. Flash the ILI9341 file first.
- Cable. A USB data cable, USB-A on the PC end. The original one-port CYD takes micro-USB. The linked cable is a 6 ft USB 2.0 A-to-micro-B cable rated for data, not charge-only. A dual-port board can use USB-A to USB-C instead. A C-to-C cable often fails to enumerate on these boards. The PC’s USB port powers the display. A separate supply is for when you are flashing at a desk with no PC.
- Pins. Display SPI stays on the stock CYD map in the pack (clock GPIO14, data GPIO13, backlight GPIO21). Do not move the UART off GPIO1 and GPIO3. That pair is the USB chip.
- PC. Windows 10 or 11, Python 3.9 or newer, and LibreHardwareMonitor. The feeder is a login task the install notes set up. It is not a Home Assistant add-on.
Snippet
Shared by all three display files. display_model is the only line that changes between them. The gauge layout and the line parser are in the pack.
substitutions:
device_name: pc_monitor
display_model: ILI9341
cpu_amber: "70"
cpu_red: "85"
gpu_amber: "80"
gpu_red: "85"
esp32:
board: esp32dev
framework:
type: esp-idf
logger:
baud_rate: 0
uart:
id: pc_uart
tx_pin: GPIO1
rx_pin: GPIO3
baud_rate: 115200
rx_buffer_size: 1024
display:
- platform: mipi_spi
model: ${display_model}
update_interval: never
A line that does not start with PCS, is ignored. Twelve fields update the gauges. The waiting state is a flag the pack sets when the last good line is older than a couple of seconds.
The feeder prints one line a second. A truncated example of the shape, with empty GPU fan:
PCS,56.5,10.8,63.0,59.0,3.0,35.9,28.9,31.1,7.2,12.0,1134.0,
Setup outline
- Flash
cyd-ili9341. If the screen stays white or scrambled, flashcyd-ili9342, thencyd-st7789. Hold BOOT on the back while the flasher connects if the port never starts writing. - You should see the waiting state. Serial logs will be silent. That is the
baud_rate: 0setting, not a dead board. - On the PC, install LibreHardwareMonitor and the feeder using the pack notes. Within a few seconds the waiting state clears and the gauges move.
- Unplug the CYD. The feeder should retry. Plug it into a different USB port. The gauges should return without editing a COM port number.
- Skip the Home Assistant YAML unless you want those sensors in a dashboard. That file is the same parser plus Wi-Fi and the native API.
Troubleshooting
- White or scrambled screen. Wrong display controller. Flash the next variant. The USB-port count is not the controller name.
- Waiting state forever. The feeder is not running, or another program holds the COM port. The pack log path is in the install notes. Close anything else that scans serial ports, then start the feeder again.
- CPU temperature and power stay
--, fans stay--. LibreHardwareMonitor is not running, or its local reader is off. Re-run the install notes. Load and RAM can still be right, because those do not come from that tool. - GPU stays
--. The GPU is not exposed by LibreHardwareMonitor andnvidia-smidid not answer. Integrated graphics often have no discrete GPU block. Empty fields are the feeder’s way of saying so. - Flashing works once, then the port vanishes while the feeder runs. The feeder owns the port. Stop it before you flash again. Logging was turned off so the two would not fight. Do not turn the logger baud rate back up while the feeder is running.
- You wanted a character or buttons. Those are the desk companion, the 12-button panel, and the touch thermostat. This UART is busy with the PC stream.
Credits
Based on esphome-cyd-pc-monitor (ESPHome and LVGL on a Cheap Yellow Display, USB serial frames, a Windows feeder, LibreHardwareMonitor). This write-up is an original overview of that path: the PCS line, three display variants, the waiting state, and an optional native API file. The CYD pin map is the one documented by ESP32-Cheap-Yellow-Display.