Настройки собраны в config.h: пины, ориентация, пороги тревоги, шкала графика, тайминги и скорость Serial. Раньше они были раскиданы по модулям, и подстройка требовала лазить по коду. Тревога включается на ALARM_ON_C и отпускает только на ALARM_OFF_C (85 и 82 градуса). Один порог заставлял бы её дёргаться каждую секунду, пока температура топчется на границе. В тревоге экран мигает негативом (инверсия буфера, а не команда контроллера - не зависит от микросхемы дисплея), светодиод GPIO8 мигает с ним в общей фазе. Без данных светодиод горит ровно, в норме погашен. Зажигается низким уровнем: проверено опытом, заодно в простое пин стоит высоким, что безопасно для GPIO8 как пина начальной загрузки. Переменная alarm переименована в alarmActive: имя alarm занято функцией из unistd.h, которая попадает в сборку ESP32. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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 |
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.