# 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 ``` Плата ничего не измеряет сама: она принимает готовые строки и рисует их. Всё чтение железа происходит на ПК. ## Состав | Путь | Что это | |---|---| | `config.h` | **все настройки**: пины, пороги тревоги, шкала графика, тайминги | | `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 в простое рисовался бы горами и создавал ложную тревогу. Ориентация задаётся константой `DISPLAY_ROTATION` в `config.h`: `U8G2_R0` — как разведено на плате, `U8G2_R2` — поворот на 180°. ## Тревога по перегреву Порогов два, `ALARM_ON_C` и `ALARM_OFF_C` (по умолчанию 85 и 82 °C). Тревога включается на верхнем и отпускает только на нижнем — с одним порогом она дёргалась бы каждую секунду, пока температура топчется на границе. В тревоге экран мигает негативом, а светодиод на GPIO8 мигает с ним в такт (общая фаза, период `ALARM_BLINK_MS`). Светодиод по состояниям: | Состояние | Светодиод | |---|---| | Норма | погашен | | Тревога | мигает синхронно с экраном | | `NO DATA` | горит ровно | Светодиод зажигается **низким** уровнем (`LED_ACTIVE_LEVEL = LOW`, определено опытом). Попутно это удобно: в обычном режиме пин удерживается высоким, а GPIO8 — пин начальной загрузки, которому высокий уровень и нужен. Проверять тревогу можно, не трогая пороги: остановить агента и подать значения вручную. ## Требования к ПК Windows, LibreHardwareMonitor и драйвер PawnIO — порядок установки и разбор подводных камней в [agent/README.md](agent/README.md).