Плата принимает по 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>
43 lines
1.3 KiB
Arduino
43 lines
1.3 KiB
Arduino
// Индикатор температуры 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);
|
|
}
|
|
}
|