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

108 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).