Files
Arduino/CPU_temp/README.md
T
oskarvitaliiandClaude Opus 5 bd0a87ea49 feat(ui): тревога по перегреву и config.h со всеми настройками
Настройки собраны в 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>
2026-09-14 22:32:31 +07:00

5.6 KiB
Raw Blame History

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.