硬件验收流程 - hongligongsi/Consumables-storage-temperature-and-humidity GitHub Wiki

硬件验收流程

仓库 README 里那 12 项待验证项,每一项都需要实物 / 仪器才能闭环,固件改不出结论。 本页把 12 项拆成 6 个阶段,每项给出:要什么工具 → 怎么做 → 通过判据 → 不通过改哪一行。 按顺序走,前一项不过就不要往后走。

对应源码文档:docs/hardware-acceptance.md


三条红线(先读)

  1. HEATER_ENABLED 改 true 的前置条件:NTC、AHT20、INA226 三者读数同时有效。 任一无效时控制器在预热 / 打印态连续 3 秒会锁 Fault;更危险的是 NTC 报错时热板已经 没有温度反馈,等于开着电热板盲跑。
  2. GPIO45(BOARD_FAN)上电必须为低。它是 strapping 脚,上电被读成高会按 1.8 V 配置 VDD_SPI,与 3.3 V 的内置 flash 不匹配,芯片直接起不来。详见 硬件接线与注意事项。不要为"保险"给它加上拉。
  3. 首次加热必须有人值守:先把「发热板最大电流」设 1 A、「加热板过温保护」设 60 ℃, 手边备好断电手段,用红外测温枪盯热板温度,确认受控后再放开。

已经不用你确认的部分(已按原理图逐格核对)

仓库里的 hardware/sch-p1-2026-01-30.png(SCH_1-P1,2026-01-30 版,3172×3172,可放大阅读) 已逐格读出,与 include/pins.h 完全一致,这些不必再怀疑:

图纸位置 核对结果
MCU U3 引脚 IO3=ADC_NTC · IO4=TFT_YD · IO5=TFT_XR · IO6=TFT_YU · IO7=TFT_XL · IO8=状态输出 · IO15=EC_D · IO16=EC_B · IO17=EC_A · IO18=RGB · IO35=PIR · IO36=HOT_FAN · IO37=LED · IO38=AIR_FAN_DC · IO39=AIR_FAN_PWM · IO40=HOT_PWM · IO41=SCL · IO42=SDA · IO45=BOARD_FAN · IO47=状态输出;下排 15–23 依次 ADC_NTC / TFT_RES(9) / TFT_SDO(10) / TFT_SDI(11) / TFT_SCK(12) / TFT_DC(13) / TFT_CS(14) / TFT_BL(21)
热板 NTC R14 = 10 kΩ 为分压上臂;板上 R17 标 10 kΩ / 3950K 但画叉未贴,NTC 经 CN3(ZX-MX1.25-2PZZ)外接 —— β = 3950 有图纸依据
I²C 上拉 R2 / R3 = 5.1 kΩ 到 3V3 ——"上拉缺失"基本可排除,先查供电与接线
直流加热 U6 = INA226AIDGSR,图纸注明 Addr: 0x40(A1:GND、A0:GND);R15 = 5 mΩ;U9 = JSM27517 隔离驱动(VDD=12 V)驱动 Q3 → HOT_PWM 高电平有效
排气扇 AIR_FAN_DC → Q4 低边 MOS(高电平导通),R21 100 kΩ 下拉;CN5 = 2 线 DC 调速、CN6 = 4 线 PWM 调速;风扇电源由 U12 / U13 短路点选 24 V 或 12 V
主板风扇 IO45 → BOARD_FAN MOS;图纸注释原文:"使用 IO45 时确保模组上电时外部电路不会将 IO45 拉高"
显示 FPC-05FB-40PH20,3.5 寸 ST7796 320×480,版型"不带触摸 / 带触摸"两种;TFT_BL → Q1(S8050) 低边开关,高占空比 = 亮;触摸四线 XL/XU/YD/YU 已引出
状态输出 IO8 / IO47 只引到 H2 / H3 排针,没有任何驱动电路(必须外接光耦)
电源 24 V 主输入;板内 24→12 V(XL4015E1)、24→5 V(ME3116AM6G)、5→3.3 V(AMS1117)
发光 LOGO 4 颗 XL-5050RGBC-2812B 串联(DOU→DIN 级联),5 V 供电

结论:12 项里剩下的只有"实物是否与图纸一致"和"标定"两类。第 3、9 项若屏能正常显示 即可判通过;第 1、7、8、11 项用串口 d 自检 + 目视即可;真正离不开万用表的只有第 2 项 (NTC 的 25 ℃ 阻值)与第 4 项(量一次 R15 证实是 5 mΩ)。

⚠️ 核对中发现并已修正一处真实错误:代码原按 R15 = 10 mΩ 换算,而图纸是 5 mΩ。 校准寄存器 = 0.00512 / (LSB × Rshunt),写错会让电流读数只有真实值的一半,于是 "限流 8 A"要到 16 A 才动作、硬过流保护(1.5 倍)整体延后一倍。现已改为 5 mΩ (include/ina226_sensor.h 的 kShuntOhms)。若实物真是 10 mΩ(BOM 变更),把 kShuntOhms 改回 0.01f 即可 —— 该方向是偏保守(读数偏大、保护提前),不会造成 保护失效。

阶段 0:先把应用日志抓出来(最容易卡住的一步)

固件开了 -DARDUINO_USB_CDC_ON_BOOT=1(见 platformio.ini),Arduino 的 Serial 走 ESP32-S3 原生 USB-CDC,也就是板载那个 USB 口;外接 FTDI 的 COM4(UART0) 只剩 ESP-ROM 与 ESP-IDF 日志。

所以在 COM4 上看不到 AHT20: detected、chamber= 周期上报、串口命令回显,是正常的, 不代表设备卡死。要交互:

  • 用板载 USB 口另开一个 COM 口,波特率 115200;
  • 或临时注释掉 platformio.ini 里的 -DARDUINO_USB_CDC_ON_BOOT=1,烧录,验完 务必恢复并重烧(否则 OTA / 联网行为与发布版不一致)。

批量判据用脚本,不用肉眼盯:

python tools/serial_regression.py --port COM5 --seconds 30
python tools/serial_regression.py --port COM5 --seconds 30 --require-sensors  # 要求两颗传感器在线

串口命令速查(串口助手发单字符):

命令 作用
d 硬件自检:一条命令打印 ADC 原始值/换算、AHT20 与 INA226 在线与读数、分流电阻与校准值、当前输出百分比、输出脚电平回读。只读,不改输出、不开加热
i I²C 总线扫描(0x08–0x77),判断"传感器 not detected"是总线级还是单器件级
W 打印联网状态(state / ip / time / mqtt)
p l s x 切换预热 / 灯光 / 系统总开关 / 手动排气
c h 编码器单击 / 长按

阶段 1:I²C 两颗传感器(第 4、5 项)—— 当前实机的卡点

实机现在报 AHT20: not detected、INA226: not detected,先解决它,否则仓温恒为 nan、 限流闭环也没有输入。

工具:串口(i 命令);可选万用表。

  1. 串口发 i,看回显:

    回显 含义 下一步
    一个 ACK 都没有 总线级故障:上拉缺失、3V3 没送到传感器、SDA/SCL 接反 量传感器 3V3 对 GND 是否为 3.3 V;量 SDA/SCL 空闲是否为高;对调 SDA/SCL 再试
    只有 0x38 INA226 没应答 查 INA226 供电与地址
    只有 0x40 AHT20 没应答 查 AHT20 供电 / 焊接
    0x38 + 0x40 都在 总线正常 进第 2 步
  2. 两颗都 ACK 后重启,开机日志应打印:

    AHT20: detected
    INA226 (0x40, 10mOhm): detected
    
  3. 看周期上报 chamber= 一行:温度应在室温 ±5 ℃、湿度 20–80 %RH。

判据:serial_regression.py --require-sensors 通过。

通过后改哪里(仅在参数与实物不符时)

情况 改动
地址不是 0x40 src/main.cpp 的 ina226.begin(Wire, 0x41);默认值在 include/ina226_sensor.h
实物 R15 不是 5 mΩ 改 include/ina226_sensor.h 的 kShuntOhms(唯一一处);校准值按 0.00512 / (LSB × Rshunt) 自动算,用 d 自检的 cal 复核
量程不合适 include/ina226_sensor.h 的 currentLsbA(现 0.001 A/LSB,即 1 mA/LSB)

第 5 项(安装位)是结构问题:AHT20 要在仓内、有代表性的位置,避开热板出风口直吹。 判据是加热时仓温平滑上升、不出现阶跃,且比热板温度滞后。


阶段 2:热板 NTC(第 2、3 项)

工具:万用表(电阻档)。

  1. 断电测 NTC 两芯在 25 ℃ 的阻值,记下 R25(现按 10 kΩ 建模)。
  2. 找原理图上分压上臂 R14,看丝印(103 = 10 kΩ)并实测。
  3. 通断档确认 NTC 一端真的走到 ADC_NTC(GPIO3)焊盘、另一端到 GND / 分压点, 对照 2026-01-30 原理图的网络名,别只看丝印。
  4. 上电看 heaterBoardTemp;用手捏住 NTC,读数应上升几度后回落。

判据:常温读数 ≈ 室温 ±2 ℃,且不是 --(-- 表示 raw 触到 ADC 端点 0 / 4095, 说明分压比例完全不对)。

不通过的情况 改动
引脚走错 include/pins.h 的 ADC_NTC(现 GPIO3;必须是 ADC1 的 GPIO1–10,GPIO35–40 不能做 ADC)
标称阻值 / β 不是 10 kΩ / B3950 src/main.cpp readSensors() 里 readNtcCelsius(Pin::ADC_NTC, 10000.0f, 10000.0f, 3950.0f) 的三个实参:分压上臂、NTC 25 ℃ 标称、β

曾有一次按 100 kΩ 建模导致整条温度曲线偏移,已回滚。改完务必用冰水(0 ℃)与室温 两点复核,不要只信 25 ℃ 一点。


阶段 3:低压执行器(第 8、11、7、9 项)—— 不开加热也能验

工具:万用表电压档;可选示波器。这几项都不涉及加热,可放心逐路点动。先敲串口 d 自检看输出脚电平回读(P8/P47/P38/P45/P37),固件有没有把脚拉高一眼可见,再决定要不要拿表。

# 项 怎么点动 判据 位置
8 排气双路 主屏「手动排气」开(x 命令) AIR_FAN_DC(38) 变 3.3 V 且风扇转;AIR_FAN_PWM(39) 在 30 % / 100 % 时转速有区别(25 kHz、10 bit) src/main.cpp:368-371
11 主板风扇 MCU 升温或电流 > 0.05 A 触发 BOARD_FAN(45) 变高、风扇转;同时确认上电瞬间该脚为低 src/controller.cpp:432
7 状态输出 进入打印 / 加热态 GPIO8(打印中)与 GPIO47(加热中)分别变 3.3 V;外接负载必须经光耦或驱动器,这两脚只能给 mA 级信号 src/main.cpp:374-377
9 显示与背光 直接看屏 480×320 横屏正常显示即通过;花屏 / 白屏才去查 TFT_eSPI 的 ST7796_DRIVER、TFT_WIDTH=320 / TFT_HEIGHT=480 与 setRotation(1) platformio.ini、src/tft_ui.cpp:1325

第 11 项特别提示:GPIO45 是 strapping 脚。若量到上电瞬间被 Q7 栅极拉高,先断开 BOARD_FAN 那路再启动,确认能正常起来后接回,并给栅极加合适下拉。不要加上拉。


阶段 4:加热链与电源(第 1、10、12 项)—— 最后才做

前置:阶段 1、2、3 全部通过。

工具:钳形直流电流表(或串联万用表 10 A 档)、红外测温枪。

  1. 设置页先把「发热板最大电流」设为 1 A、「加热板过温保护」设为 60 ℃。
  2. 把 src/main.cpp 的 constexpr bool HEATER_ENABLED = false; 改成 true,编译烧录。
  3. 进入预热,用测温枪盯热板,用钳形表读加热回路电流。
  4. 比对钳形表与 INA226 读数:
    • 偏差 > 10 % → 实物 R15 与图纸值(5 mΩ)不符,改 kShuntOhms(第 10 项即此项);
    • 读数为负 → 电流方向接反(代码取绝对值,一般不影响,但最好把接线调正)。
  5. 确认升温受控(PID 不振荡、过温保护在 60 ℃ 处正确降功率)后,再按电源能力放开限流。

**第 12 项(环境总电流)**是算出来的:

总电流 ≈ 热板(24 V × 限流 A) / 24  +  热风扇 + 排风扇 + 主板风扇 + LED 灯带

与电源额定输出、线径对照,留 20 % 余量。热板全功率(限流上限 12 A,见 src/settings.cpp 的 1–12 A 钳制)时约 288 W,别按待机电流选电源。

硬过流保护是限流值的 1.5 倍(src/controller.cpp 的 HARD_OVER_CURRENT_FACTOR), 超过即锁 F-04;软降是 I_limit / I_measured 连续缩放。标定不准会让这两条都失灵。


阶段 5:触摸(第 6 项)—— 唯一不需要仪器的一项

固件已闭环,只差实机采点:

  1. 系统设置第 27 项「触摸模式」:自动(出厂默认,开机做电阻膜在位探测)/ 开 (强制启用)/ 关(只用编码器)。
  2. 若屏没贴膜或排线没接,自动模式会打印 Touch panel: NOT detected 并关闭触摸(防浮空线 幽灵触摸),此时该项显示"不支持"——不是故障。
  3. 确认是触摸屏后(必要时把模式设成 开),进第 28 项「触摸屏校准」做两点采点。
  4. 只有当硬件完全没有触摸走线时,才把 include/pins.h 的 HAS_TOUCH_PANEL 改成 false。

验收记录表(建议边做边填)

# 项目 实测值 判据 结论 日期
1 加热总开关 NTC / INA226 / AHT20 三路有效后才改 true
2 NTC 型号 / 分压 R25 = ___ Ω 常温读数 ≈ 室温 ±2 ℃
3 NTC 引脚 网络名 = ___ 与原理图一致、属 ADC1(GPIO1–10)
4 INA226 地址 / 分流 ACK = 0x__ / R15 = ___ mΩ i 扫描有 0x40;R15 实测与 kShuntOhms(图纸 5 mΩ)一致
5 AHT20 安装位 仓内、避开热风直吹,读数平滑
6 电阻触摸 模式 = ___ 校准后点击定位准确
7 状态输出 8 = __ V / 47 = __ V 态切换时 3.3 V,外接走光耦
8 排气双路 DC38 = __ V 风扇转且 PWM 调速有效
9 显示与背光 480×320 横屏正常
10 限流闭环 钳形表 __ A / INA226 __ A 偏差 < 10 %
11 主板风扇 45 = __ V 触发时转,且上电瞬间为低
12 环境总电流 计算 __ A 电源额定与线径留 20 % 余量

填完后把结果同步回仓库 README 的「待验证项清单」。