Второй экран показывает загрузку ОЗУ крупной цифрой и её график со шкалой 0-100 - у памяти она естественная, подбирать нечего. В углу свой значок, планка памяти вместо микросхемы: он же и говорит, какой экран открыт. Тревога в приоритете: при перегреве плата принудительно возвращается на экран процессора и кнопка не работает, пока температура не упадёт. Смысл тревоги в том, что её нельзя прощёлкать. Экран памяти выпадает из листания, если агент не шлёт ключ M - со старым агентом кнопка просто ничего не делает. То же решение подойдёт машинам без дискретной видеокарты. Выбранный экран не запоминается при перезагрузке: хранить негде. Тревоги по памяти нет намеренно - загрузка ОЗУ под 100% здесь обычное рабочее состояние. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
72 lines
4.2 KiB
C
72 lines
4.2 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;
|
|
|
|
// --- Кнопка переключения экранов -------------------------------------------
|
|
|
|
// Кнопка BOOT. Это пин начальной загрузки: если держать его нажатым в момент
|
|
// сброса, плата уйдёт в режим прошивки - штатное поведение кнопки, а не наша
|
|
// беда. В работе читается как обычный вход с подтяжкой.
|
|
static const uint8_t PIN_BUTTON = 9;
|
|
|
|
// Порог защиты от дребезга контактов.
|
|
static const uint32_t BUTTON_DEBOUNCE_MS = 50;
|
|
|
|
// --- Сглаживание показаний -------------------------------------------------
|
|
|
|
// Скользящее среднее температуры: цифра не должна мельтешить на +-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; // период перерисовки экрана
|