feat(cpu_temp): индикатор температуры CPU на ESP32-C3 с OLED

Плата принимает по USB-CDC строки "T=67.0;L=34" от агента на ПК и рисует
крупную цифру, загрузку и график за последнюю минуту на экране 72x40.

Пины дисплея (SDA=5, SCL=6) определены сканером, а не по шелкографии:
подписи GPIO8/GPIO9 на плате - это дефолтные Wire-пины чипа.

Агент читает сенсоры через LibreHardwareMonitorLib. С версии 0.9.5 она
требует отдельно установленный драйвер PawnIO: без него загрузка CPU
читается, а температуры пусты даже под администратором.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
oskarvitaliiandClaude Opus 5 committed 2026-09-14 21:42:24 +07:00
1 parent ed4dad0a52
commit 59848698ff
12 files changed
+1473

No files matched your search

+42
View File
@@ -0,0 +1,42 @@
// Индикатор температуры CPU: плата принимает строки "T=67.0;L=34" по USB-COM
// от агента на ПК и рисует их на встроенном OLED 72x40. Сама ничего не меряет.
#include "link.h"
#include "ui.h"
static const uint32_t STALE_MS = 5000; // после этого молчания показываем NO DATA
static const uint32_t SAMPLE_MS = 1000; // шаг истории графика
static const uint32_t DRAW_MS = 200; // период перерисовки
static CpuStats stats = {0.0f, 0};
static uint32_t lastData = 0;
static uint32_t lastSample = 0;
static uint32_t lastDraw = 0;
static bool everGot = false;
void setup() {
linkBegin();
uiBegin();
}
void loop() {
CpuStats fresh;
if (linkPoll(fresh)) {
stats = fresh;
lastData = millis();
everGot = true;
}
const bool isFresh = everGot && (millis() - lastData < STALE_MS);
// Историю дописываем только при живой связи: пауза не должна рисоваться провалом.
if (isFresh && millis() - lastSample >= SAMPLE_MS) {
lastSample = millis();
uiPushSample(stats.tempC);
}
if (millis() - lastDraw >= DRAW_MS) {
lastDraw = millis();
uiRender(isFresh, stats.tempC, stats.loadPct);
}
}