feat(cpu_temp): индикатор температуры CPU на ESP32-C3 с OLED

Плата принимает по USB-CDC строки "T=67.0;L=34" от агента на ПК и рисует
крупную цифру, загрузку и график за последнюю минуту на экране 72x40.

Пины дисплея (SDA=5, SCL=6) определены сканером, а не по шелкографии:
подписи GPIO8/GPIO9 на плате - это дефолтные Wire-пины чипа.

Агент читает сенсоры через LibreHardwareMonitorLib. С версии 0.9.5 она
требует отдельно установленный драйвер PawnIO: без него загрузка CPU
читается, а температуры пусты даже под администратором.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
oskarvitaliiandClaude Opus 5 committed 2026-09-14 21:42:24 +07:00
1 parent ed4dad0a52
commit 59848698ff
12 files changed
+1473

No files matched your search

+79
View File
@@ -0,0 +1,79 @@
# CPU Temp — индикатор температуры процессора на ESP32-C3
Плата ESP32-C3 со встроенным OLED 0.42″ (72×40) стоит на столе и показывает
температуру процессора компьютера: крупная цифра, загрузка CPU рядом и график
за последнюю минуту.
```
LibreHardwareMonitorLib.dll ──> PowerShell-агент ──COM (USB CDC)──> ESP32-C3 ──I2C──> OLED 72×40
(через драйвер PawnIO) раз в секунду "T=67.0;L=34" U8g2
```
Плата ничего не измеряет сама: она принимает готовые строки и рисует их. Всё
чтение железа происходит на ПК.
## Состав
| Путь | Что это |
|---|---|
| `CPU_temp.ino` | основной скетч: тайм-аут свежести данных, частота перерисовки |
| `link.h` / `link.cpp` | неблокирующее чтение строки из Serial и её разбор |
| `ui.h` / `ui.cpp` | отрисовка через U8g2 и кольцевой буфер истории |
| `tools/i2c_scan/` | одноразовый скетч: поиск пинов встроенного дисплея |
| `agent/` | агент для ПК, см. [agent/README.md](agent/README.md) |
| `docs/` | спецификация и план реализации |
## Железо
| Параметр | Значение |
|---|---|
| Плата | ESP32-C3 (QFN32), ревизия v0.4, встроенный OLED 0.42″ |
| Флеш | 4 МБ |
| Дисплей | SSD1306 72×40, I2C, адрес `0x3C`, **SDA = GPIO5, SCL = GPIO6** |
| Подключение к ПК | нативный USB, `VID_303A&PID_1001` |
Пины дисплея определены сканером `tools/i2c_scan`, а не по шелкографии: подписи
`GPIO8/GPIO9` на плате относятся к дефолтным Wire-пинам чипа, а не к разводке
экрана.
## Сборка и заливка
```
arduino-cli compile -b esp32:esp32:esp32c3:CDCOnBoot=cdc,FlashSize=4M,PartitionScheme=default .
arduino-cli upload -p COM4 -b esp32:esp32:esp32c3:CDCOnBoot=cdc,FlashSize=4M,PartitionScheme=default .
```
`CDCOnBoot=cdc` обязателен: по умолчанию в ядре стоит `Disabled`, и тогда
`Serial` уходит в аппаратный UART вместо USB, а данные до платы не доходят.
**Перед заливкой остановить агента** — он держит тот же COM-порт:
```
Stop-ScheduledTask -TaskName 'CPU Temp Agent'
```
## Протокол
Одна строка в секунду, `\n` в конце:
```
T=67.0;L=34
```
`T` — температура CPU Package в °C, `L` — общая загрузка CPU в процентах.
Неизвестные ключи прошивка игнорирует, поэтому протокол можно расширять
(например, `G=` для GPU), не трогая старую прошивку.
Если валидная строка не приходила дольше 5 секунд, на экране появляется
`NO DATA`, и история перестаёт пополняться — чтобы пауза связи не выглядела
как падение температуры.
## Экран
Шкала графика фиксированная, 30–90 °C. Автомасштаб сознательно не используется:
при нём шум ±1 °C в простое рисовался бы горами и создавал ложную тревогу.
## Требования к ПК
Windows, LibreHardwareMonitor и драйвер PawnIO — порядок установки и разбор
подводных камней в [agent/README.md](agent/README.md).