Настройки собраны в 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>
108 lines
5.6 KiB
Markdown
108 lines
5.6 KiB
Markdown
# 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).
|