Мгновенное значение плавает на +-1 градус, и цифра мельтешила каждую секунду при полном покое. На экран теперь идёт среднее за TEMP_AVG_SAMPLES последних замеров; агент шлёт раз в секунду, так что это ровно 5 секунд. Сумма пересчитывается заново на каждом шаге, а не копится: на пяти числах это бесплатно, зато нет накопления ошибки округления за сутки непрерывной работы. Окно сбрасывается при обрыве связи, иначе после паузы среднее считалось бы по значениям до обрыва. Тревога переведена на усреднённое значение: иначе экран показывал бы 84, когда мигание уже идёт. Загрузка и график намеренно остались сырыми. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
62 lines
3.6 KiB
C
62 lines
3.6 KiB
C
// Все настройки проекта в одном месте: пины, пороги, шкалы, периоды.
|
|
// Менять поведение прошивки здесь, а не по коду модулей.
|
|
|
|
#pragma once
|
|
|
|
#include <Arduino.h>
|
|
|
|
// --- Дисплей ---------------------------------------------------------------
|
|
|
|
// Пины I2C встроенного OLED. Подтверждены сканером tools/i2c_scan:
|
|
// подписи GPIO8/GPIO9 на шелкографии - это дефолтные Wire-пины чипа,
|
|
// а не разводка экрана.
|
|
static const uint8_t PIN_SDA = 5;
|
|
static const uint8_t PIN_SCL = 6;
|
|
|
|
// Ориентация: U8G2_R0 - как разведено на плате, U8G2_R2 - поворот на 180.
|
|
#define DISPLAY_ROTATION U8G2_R2
|
|
|
|
// --- Тревога по перегреву --------------------------------------------------
|
|
|
|
// Два порога, а не один: с одним тревога дёргалась бы каждую секунду,
|
|
// пока температура топчется на границе.
|
|
static const float ALARM_ON_C = 85.0f; // включить тревогу при этой температуре
|
|
static const float ALARM_OFF_C = 82.0f; // выключить, только опустившись до этой
|
|
|
|
// Период полуфазы мигания: экран и светодиод моргают синхронно.
|
|
static const uint32_t ALARM_BLINK_MS = 500;
|
|
|
|
// --- Светодиод -------------------------------------------------------------
|
|
|
|
// Тревога - мигает, нет данных - горит ровно, норма - погашен.
|
|
static const uint8_t PIN_LED = 8;
|
|
|
|
// Уровень, при котором светодиод горит. Определено опытом: светодиод на GPIO8
|
|
// зажигается НИЗКИМ уровнем. Побочно это удобно - в обычном режиме пин стоит
|
|
// в высоком уровне, а GPIO8 является пином начальной загрузки, которому
|
|
// высокий уровень и нужен.
|
|
static const uint8_t LED_ACTIVE_LEVEL = LOW;
|
|
|
|
// --- Сглаживание показаний -------------------------------------------------
|
|
|
|
// Скользящее среднее температуры: цифра не должна мельтешить на +-1 градус,
|
|
// пока ничего не происходит. Единица - один принятый замер, а агент шлёт раз
|
|
// в секунду, поэтому 5 означает "среднее за последние 5 секунд".
|
|
// Загрузка сознательно не сглаживается: её скачки настоящие, ради них на неё
|
|
// и смотрят.
|
|
static const uint8_t TEMP_AVG_SAMPLES = 5;
|
|
|
|
// --- График ----------------------------------------------------------------
|
|
|
|
// Шкала фиксированная: при автомасштабе шум +-1 градус в простое
|
|
// рисовался бы горами и создавал ложную тревогу.
|
|
static const float SCALE_MIN = 30.0f;
|
|
static const float SCALE_MAX = 90.0f;
|
|
|
|
// --- Связь и тайминги ------------------------------------------------------
|
|
|
|
static const uint32_t SERIAL_BAUD = 115200;
|
|
static const uint32_t STALE_MS = 5000; // после этого молчания показываем NO DATA
|
|
static const uint32_t SAMPLE_MS = 1000; // шаг истории графика
|
|
static const uint32_t DRAW_MS = 200; // период перерисовки экрана
|