系统设置逐项说明 - hongligongsi/Consumables-storage-temperature-and-humidity GitHub Wiki

系统设置逐项说明

设置页共 32 项,顺序与屏幕显示一致,枚举定义在 include/ui_model.h 的 SystemSettingField。

渲染时在 7 个分区起点插入标题行(基础 / 显示与声音 / 输入与联动 / 热控 / 外观 / 时钟 / 维护,定义在 tft_ui.cpp 的 SECTIONS 表)。标题行仅作视觉分组、不可聚焦, 导航与页码计数仍按 32 个条目走,交互逻辑零改动。

真机每屏只显示 5 行(分区标题行占一行),超出部分靠旋转滚动查看。

操作方式

操作 作用
旋转 移动光标;在编辑态下改值
单击 开关类:直接取反数值类:进入编辑,再旋转改值日期/时间:切到下一段
长按 保存到 NVS 并返回主界面

开关类即使进入编辑态也无意义,单击即切换、不区分旋转方向。数值类需先单击进入 编辑态,之后旋转才改值;日间/夜间时刻、日期/时间等多段项靠单击在段间跳转。

设置项总数由枚举的 Count 哨兵推导,页码与滚动窗口都动态计算,增删条目无需改 渲染代码。

联网开关

这四项在长按保存后经 network.onSettingsChanged() 即时生效,无需重启。 字段定义见 include/settings.h。

# 条目 英文 默认 说明
2 WiFi联网 WIFI 开 关闭后设备断开网络,Web 与 MQTT 均不可用。本地关闭后可在本页重新打开;远程 POST /api/settings 传 wifiEnabled=0 会被拒绝并返回 400。联网时本项右侧显示当前连接的 SSID(超长截断)与迷你信号格,方便确认连的是哪张网
3 MQTT上报 MQTT 关 打开后向 broker 上报状态。需先经 Web 接口配置 mqttBroker,broker 为空时打开也不会有流量
4 NTP校时 NTP 开 关闭则调用 esp_sntp_stop(),沿用上次时钟;已同步的时间在断电前保持有效
5 OTA升级 OTA 开 关闭则 ArduinoOTA.end(),设备不再出现在 OTA 端口列表。关闭后无法远程重新打开,只能回设置页或重启

设置页只暴露这四个开关。其余联网参数都在 Web 管理页(浏览器访问 http://chamber.local/)或经 POST /api/settings 配置,保存后即时生效:

  • MQTT:broker 地址 / 端口 / 主题前缀(mqttBroker / mqttPort / mqttTopicPrefix)
  • NTP:时区(timezone,POSIX TZ 语法,默认 CST-8 即 UTC+8)、两个 NTP 服务器(ntpServer1 / ntpServer2)
  • 网络:静态 IPv4(staticIpEnabled 及地址 / 网关 / 掩码 / 两组 DNS),关闭即走 DHCP
  • OTA:每台设备按芯片 MAC 生成独立密码 CH-XXXXXXXXXXXX,只在 Web 管理页查看与串口日志打印,屏幕上不能改

字段含义、取值约束与 curl 示例见 联网功能。

完整列表

# 条目 英文 取值 步长
1 系统语言 LANGUAGE 中文 / English —
2 WiFi联网 WIFI 开 / 关 —
3 MQTT上报 MQTT 开 / 关 —
4 NTP校时 NTP 开 / 关 —
5 OTA升级 OTA 开 / 关 —
6 按键声音 KEY SOUND 开 / 关 —
7 屏幕亮度 BRIGHTNESS 1–100 % 5
8 屏幕休眠时间 SCREEN SLEEP 0–3600 s(0 = 不休眠) 15
9 RGB最大亮度 RGB BRIGHTNESS 1–100 % 5
10 RGB跟随屏幕休眠 RGB SLEEP SYNC 开 / 关 —
11 打印时保持屏幕开启 KEEP ON PRINTING 开 / 关 —
12 编码器方向 ENCODER DIRECTION 正向 / 反向 —
13 PIR启动延时 PIR START DELAY 1–300 s 1
14 PIR关闭延时 PIR STOP DELAY 10–900 s 5
15 启动后自动开灯 LIGHT ON START 开 / 关 —
16 关闭后自动关灯 LIGHT OFF STOP 开 / 关 —
17 启动后蜂鸣提示 BEEP ON START 开 / 关 —
18 关闭后蜂鸣提示 BEEP ON STOP 开 / 关 —
19 发热板限流 HEATER CURRENT 1–12 A 1
20 发热板风扇风速 HEATER FAN 20–100 % 5
21 发热板温度保护 HEATER PROTECTION 40–180 °C(默认 150) 1
22 界面主题 THEME 默认 / IOS / 蓝白 —
23 日间开始时刻 DAY START 00:00–23:45 15 min
24 夜间开始时刻 NIGHT START 00:00–23:45 15 min
25 日期 DATE 年 / 月 / 日 三段 见下
26 时间 TIME 时 / 分 两段 见下
27 触摸模式 TOUCH MODE 自动 / 开 / 关 —
28 触摸屏校准 TOUCH CALIBRATION 已关闭 / 不支持 / 未校准 / 已校准 —
29 恢复出厂配置 FACTORY RESET 执行 / 确认? —
30 注册码 REGISTRATION 已注册 / 未注册 见下
31 固件版本 FIRMWARE VERSION 只读 —
32 芯片ID CHIP ID 只读(CH- + 12 位十六进制) —

取值范围由 src/ui_model.cpp 的 adjustSystemSetting 限制,并在 src/settings.cpp 的 sanitize() 中于载入和保存时二次夹取,即使 NVS 被写坏也不会越界。

重点条目说明

屏幕休眠时间

仅关闭背光,系统继续运行。设为 0 表示不休眠。若「打印时保持屏幕开启」为开, 则打印机工作时忽略此项。

RGB最大亮度 / RGB跟随屏幕休眠

RGB 状态灯带(GPIO18 单线 DIN 串 4 颗 WS2812,四颗同显一种状态色)的两个 亮度相关项:「RGB最大亮度」对所有状态色统一按比例缩放(1–100 %,夜间场景可调低); 「RGB跟随屏幕休眠」开启后,屏幕休眠时 RGB 灯同步熄灭,唤醒即恢复 —— 与背光共用 同一个休眠判定,状态机照常运行、只是灯不再亮。

正常(待机)状态下灯带显示绿色呼吸(3 s 三角波周期,亮度在 15 %~100 % 之间往返); 检测到打印机运行后按状态换色,排气/加热时另有配色,故障时红色提示。

界面主题与日/夜时刻

三档主题:默认(iOS 浅色原型)、IOS(深色 HMI)、蓝白(日间浅蓝白 + 夜间亮蓝)。「蓝白」下按两个时刻切换:到达「日间开始时刻」切日间配色,「夜间开始时刻」 切夜间配色。两者上限为 23:45 而非 23:59 —— 这样末次递增不会被夹到 23:59 从而 破坏 15 分钟步长。

日期 / 时间

手动校时,结果写入 RTC 与 NVS,重启后仍生效。系统时钟的取值优先级为: NTP → 手动校时值(manualClockEpoch)→ 占位串 ----/--/-- --:--:--。

因此断网环境下也能保持正确时间;一旦 NTP 恢复同步则以其为准。

触摸模式

三态选择触摸屏的启停方式,与「触摸屏校准」相邻(同属维护区)。硬件是否具备四线 触摸由 include/pins.h 的编译期常量 Pin::HAS_TOUCH_PANEL 决定(当前为 true);本项决定运行时是否 真的启用:

取值 行为
自动(出厂默认) 开机做电阻膜在位探测(detectTouchPanel),探到膜才启用轮询与校准
开 强制启用,用于探测不准或特殊排线;用户自负误触风险
关 强制关闭,只用编码器

判定合并在 main.cpp 的 touchEnabledNow()(编译期闸 × 本项取值 × 开机探测结果), 触摸轮询与校准入口都只问它。改完保存即时生效、无需重启,因为设置对象是共享的 全局实例;「自动」档的膜探测结果沿用开机那一次(电阻膜不支持热插拔)。

触摸屏校准

本项的显示随触摸当前是否生效而变:

显示 含义
已关闭 触摸模式被设为「关」
不支持 触摸模式为「自动」但开机没探到电阻膜(纯显示屏/排线未接)
未校准 / 已校准 触摸生效中,尚未 / 已经完成两点采点

仅在触摸生效时可以单击进入校准流程:按住左上角提示点,单击编码器采点;再按右下角 提示点重复一次即可完成(长按编码器随时取消)。校准的四角原始值与 touchCalibrated 一并写入 NVS,重启后仍有效。探测不到膜时此处显示「不支持」、触摸轮询保持关闭, 避免浮空线被误判成触点;确有膜但探测不准时,可把触摸模式改为「开」后校准。

恢复出厂配置

需二次确认(显示「确认?」)才执行。只删除本固件拥有的设置键与耗材键,未知键 会保留,例如预留的注册码数据不会丢失。删除后立即重启。

注册码

设备注册采用一机一码:注册码由本机芯片 ID(CH- + 12 位十六进制,即 NetworkManager::chipId(),eFuse MAC 双射而来)经固定算法派生,算法在 pure::regCodeFromChipId()( include/pure_logic.h):

h = FNV-1a-64(chipId 字符串 + "FilamentChamber-RG1")
注册码 = h 低 32 位的 8 位大写十六进制

厂商端可用同一算法离线生成(Python 参考实现):

def reg_code(chip_id, salt="FilamentChamber-RG1"):
    h = 14695981039346656037
    for c in chip_id + salt:
        h = ((h ^ ord(c)) * 1099511628211) & 0xFFFFFFFFFFFFFFFF
    return "%08X" % (h & 0xFFFFFFFF)

也可以直接用仓库里的 tools/regcode_generator.html(浏览器打开,纯离线):输入芯片 ID 生成 8 位注册码,并可反向核对「授权码与芯片 ID 是否匹配」;页面内置与主机端单测 相同的自检向量(CH-1A2B3C4D5E6F → 02812C46)。

行为约定:

  • 上电未注册 → 先弹注册页:旋转编码器在当前位循环 0-9/A-F,单击确认进位, 8 位输完即校验;长按编码器跳过(提示但不限制,功能不受限,下次上电再提示)。 校验通过写入 NVS 键 regCode 并提示成功;失败提示重输。注册页支持触摸 hex 键盘。
  • 设置页本项显示「已注册 / 未注册」,单击可随时重新进入注册页。
  • 恢复出厂不会清除注册码(regCode 不在出厂清除的键清单里)。
  • 这是轻量完整性校验,不是密码学保护;目标是防误输与防随手复用。

PIR 启动/关闭延时

PIR 判定打印机工作状态:

  • 检测到运动持续 PIR启动延时 秒 → 判定开始打印,启动仓温控制
  • 连续 PIR关闭延时 秒无运动 → 判定打印停止

默认 50 s。多色打印换色时 PIR 可能长时间无动作,建议调到 90 s 以免误判停止。

发热板温度保护

热板温度超过此值即暂停加热,默认 150 ℃(可调 40–180 ℃)。这是软件层的第二道 防线,硬件过温保护独立于此,不可互相替代。

固件版本

只读,取值来自 include/version.h 的 FW_VERSION,当前为 1.0.0。可用 build_flags 追加 -DFW_VERSION=\"x.y.z\" 覆盖, 无需改源码。

芯片ID

只读,展示本机逐台唯一的芯片 ID,格式 CH-XXXXXXXXXXXX(12 位十六进制)。 取值由 NetworkManager::chipId() 从 ESP32 eFuse 内的 48 位 MAC 生成:MAC 由 IEEE 逐颗分配、天然唯一,固件再对其做 48 位全宽异或(双射、不丢位),因此任意两颗芯片 的结果必然不同、不会重复。同一取值也用作 ArduinoOTA 接入密码(见 联网功能)。

批量部署时可在屏上直接核对本机 ID,与 Web 管理页「本机 OTA 密码(只读)」、开机串口 日志 [NET] chip id = CH-… 三处一致。

只读条目

「固件版本」与「芯片ID」同属系统设置页末端的只读条目:可被旋转选中、可被高亮, 但单击不进入编辑态、旋转不改值、也不会把设置标记为「有未保存修改」。

新增设置项的改法

设置页是枚举驱动的,新增一项需同步 4 处:

  1. include/ui_model.h — 在 SystemSettingField 中按显示顺序插入枚举项(功能项放在 Version 之前,只读的「关于本机」信息项放在 Version 之后、Count 之前)
  2. src/ui_model.cpp — 在 adjustSystemSetting 的 switch 中加 case;数值类用 constrain(..., min, max),开关类直接取反,只读项与 Version 并列进「直接 return」分组
  3. src/tft_ui.cpp — 在 zh[] / en[] 数组的同一位置插入文案,并在 value 格式化 switch 中加对应 case
  4. tools/ui_preview.html — 在 F 数组同一位置插入元数据(zh/en/type/key/desc/range)

若新条目是数值类且要支持单击进入编辑态,还需在 src/ui_model.cpp 的 numeric 白名单中加入它;开关类不需要。

跑 python tools/doc_check.py 会校验「枚举数 = README 内联表 = 本页表格 = 各处 N 项 字样」,漏改一处即报错,所以新增项时顺手跑一次最省事。

新增中文文案若用到字库外的汉字,需重跑 python tools/genvlw.py 重新生成 include/font_cn16.h / include/font_cn26.h。该脚本会自动扫描 src/ 与 include/ 中 字符串字面量里的汉字(注释中的不算;web_page.h / wifi_portal_page.h 属浏览器渲染 文案,已被脚本排除)。

预览页

tools/ui_preview.html 是可操作的真机模拟器,浏览器直接打开即可:

python -m http.server 8765 --directory tools

然后访问 http://localhost:8765/ui_preview.html。

真机每屏只显示 5 行,预览页因此在屏下把全部 32 项按分区逐条列出说明与取值范围,并随 屏内光标实时高亮。顶部快捷按钮中的「默认/IOS/蓝白」等价于修改「界面主题」这一项, 「信号强度」一组可直接预览 4 格/3 格/2 格/1 格与未联网四种主屏形态。