硬件验收流程 - hongligongsi/Consumables-storage-temperature-and-humidity GitHub Wiki
硬件验收流程
仓库 README 里那 12 项待验证项,每一项都需要实物 / 仪器才能闭环,固件改不出结论。 本页把 12 项拆成 6 个阶段,每项给出:要什么工具 → 怎么做 → 通过判据 → 不通过改哪一行。 按顺序走,前一项不过就不要往后走。
对应源码文档:docs/hardware-acceptance.md
三条红线(先读)
HEATER_ENABLED改true的前置条件:NTC、AHT20、INA226 三者读数同时有效。 任一无效时控制器在预热 / 打印态连续 3 秒会锁Fault;更危险的是 NTC 报错时热板已经 没有温度反馈,等于开着电热板盲跑。- GPIO45(BOARD_FAN)上电必须为低。它是 strapping 脚,上电被读成高会按 1.8 V 配置 VDD_SPI,与 3.3 V 的内置 flash 不匹配,芯片直接起不来。详见 硬件接线与注意事项。不要为"保险"给它加上拉。
- 首次加热必须有人值守:先把「发热板最大电流」设 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 命令);可选万用表。
-
串口发
i,看回显:回显 含义 下一步 一个 ACK 都没有 总线级故障:上拉缺失、3V3 没送到传感器、SDA/SCL 接反 量传感器 3V3 对 GND 是否为 3.3 V;量 SDA/SCL 空闲是否为高;对调 SDA/SCL 再试 只有 0x38INA226 没应答 查 INA226 供电与地址 只有 0x40AHT20 没应答 查 AHT20 供电 / 焊接 0x38+0x40都在总线正常 进第 2 步 -
两颗都 ACK 后重启,开机日志应打印:
AHT20: detected INA226 (0x40, 10mOhm): detected -
看周期上报
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 项)
工具:万用表(电阻档)。
- 断电测 NTC 两芯在 25 ℃ 的阻值,记下
R25(现按 10 kΩ 建模)。 - 找原理图上分压上臂 R14,看丝印(
103= 10 kΩ)并实测。 - 通断档确认 NTC 一端真的走到
ADC_NTC(GPIO3)焊盘、另一端到 GND / 分压点, 对照 2026-01-30 原理图的网络名,别只看丝印。 - 上电看
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 A、「加热板过温保护」设为 60 ℃。
- 把
src/main.cpp的constexpr bool HEATER_ENABLED = false;改成true,编译烧录。 - 进入预热,用测温枪盯热板,用钳形表读加热回路电流。
- 比对钳形表与 INA226 读数:
- 偏差 > 10 % → 实物 R15 与图纸值(5 mΩ)不符,改
kShuntOhms(第 10 项即此项); - 读数为负 → 电流方向接反(代码取绝对值,一般不影响,但最好把接线调正)。
- 偏差 > 10 % → 实物 R15 与图纸值(5 mΩ)不符,改
- 确认升温受控(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 项)—— 唯一不需要仪器的一项
固件已闭环,只差实机采点:
- 系统设置第 27 项「触摸模式」:
自动(出厂默认,开机做电阻膜在位探测)/开(强制启用)/关(只用编码器)。 - 若屏没贴膜或排线没接,自动模式会打印
Touch panel: NOT detected并关闭触摸(防浮空线 幽灵触摸),此时该项显示"不支持"——不是故障。 - 确认是触摸屏后(必要时把模式设成
开),进第 28 项「触摸屏校准」做两点采点。 - 只有当硬件完全没有触摸走线时,才把
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 的「待验证项清单」。