This is rework of Dmytro Panin's project https://github.com/dr-mod/tiny-system-monitor
An external system performance monitor for your computer, built with a Raspberry Pi Pico and a 320x240 ST7789 display. The Windows host streams metrics over USB CDC, and the Pico renders a live dashboard.
Hardware
- Raspberry Pi Pico (or compatible RP2040 board)
- ST7789 320x240 SPI display
- USB cable
Wiring
Defaults in Client/code.py:
GP9= CSGP8= DCGP10= SCKGP11= MOSIGP12= RST
Software The device firmware is CircuitPython. The host is Python and currently targets Windows with OpenHardwareMonitor/LibreHardwareMonitor DLLs.
Installing CircuitPython
- Download the CircuitPython UF2 for your Pico from circuitpython.org.
- Hold BOOTSEL, plug the Pico into USB, then release BOOTSEL.
- The Pico mounts as
RPI-RP2. - Drag and drop the UF2 onto
RPI-RP2.
Software Installation
- Copy the Pico client code to the CIRCUITPY drive:
Client/boot.py->CIRCUITPY/boot.pyClient/code.py->CIRCUITPY/code.pyClient/lib/->CIRCUITPY/lib/- Install host dependencies:
pip install pyserial pyserial-asyncio psutil requests pythonnet - Run the host app from
Host/:python main.py
Host Part
The host gathers metrics with psutil and hardware sensor DLLs, then sends a compact JSON payload once per second. The Pico reads the USB CDC data channel and updates the UI.
How Device Discovery Works
Client/code.pycontains a# MONITOR_DEVICE_IDmarker.- The host scans drives for that marker, reads
boot_out.txt, and uses the UID to find the matching COM port. - It resets the Pico once per OS boot via REPL, then reconnects to the data CDC port.
Repo Layout
Host/Host/main.py- Windows host app that streams JSON.Host/OpenHardwareMonitorLib/andHost/LibreHardwareMonitorLib/- sensor DLLs.Client/Client/code.py- CircuitPython UI and serial parser.Client/boot.py- USB CDC setup.Client/lib/- CircuitPython libraries.
Troubleshooting
- No COM port found. Ensure the Pico is mounted and
boot_out.txtexists. - No COM port found. Confirm USB CDC data is enabled in
Client/boot.py. - UI not updating. Confirm host JSON is printing to console.
- UI not updating. Verify wiring and pin mapping in
Client/code.py. - Missing sensors. Not all systems expose GPU or CPU temperature via the DLLs.
