ESP32 智能温控系统调试记:一次温度 & 风扇策略的优化分析
前言
最近在调试基于 ESP32-S3 的智能温控系统(项目:PetBoxX),系统需要根据 温度传感器(SHT30) 的实时数据动态控制 PTC 加热器 与 风扇转速,以确保设定温度(SP)稳定,同时避免风扇频繁抖动和噪音问题。
上图是一次运行的温度 & 风扇速度记录曲线,通过新增的 状态位日志(STATE: …) 以及自定义绘图脚本,我们得以精准分析系统在不同阶段的工作模式。
⸻
曲线解读
- 温度变化(上图)
• 橙色虚线:目标温度 SP(ramp),采用缓升方式避免初期冲击过大。
• 蓝色实线:实际温度(SHT30 采集)。
• 背景色:
• 浅橙色:HEAT 模式
• 浅蓝色:HOLD 模式(接近目标温度,主要靠微调维持)
• 顶部细条带:
• BOOST(黄色):短时间内强力加热
• SILENT(绿色):风扇降速,噪音优先
• FREEZE(蓝色):到点即静音/快速积分泄放
• STALL(红色):检测到风扇转速异常或低于安全阈值
可以看到,在初期 HEAT 模式下,温度快速爬升,接近目标值后系统进入 HOLD,并且伴随 FREEZE 状态,完全关闭加热并快速泄掉 PID 积分,防止过冲。
⸻
- 风扇转速变化(下图)
• 蓝线:风扇占空比(%)
• 彩色圆点:量化档位切换(Q=0、25、35)
• 量化 + 停留(Dwell)机制:
• 避免风扇在 18%/25%/35% 档位频繁抖动
• 最小停留时间 FAN_DWELL_MIN_S = 2.0s,跨档才重置
• 低于 20% 自动归零(静音)
可以看到,风扇在低档和中档之间切换非常平稳,没有了之前的“针尖”跳动问题。
⸻
核心技术点
到点即静音 & 积分快速泄放
bool in_freeze = (fabsf(err) <= FREEZE_ERR_C) && (fabsf(dtemp_f) <= FREEZE_DTD_C); if (in_freeze) { u_target = 0.0f; // 彻底停火 g_int *= 0.80f; // 快速释放积分,防止回弹 }
这样一旦温度误差和变化率都很小,就立即关闭加热并降低风扇噪音。
⸻
风扇量化 & 停留时间(Dwell)
static float g_fan_dwell_s = 0.f; static float g_fan_last_quant = 0.f; static const float FAN_DWELL_MIN_S = 2.0f; static inline float fan_quantize_local(float fan_pct){ if (fan_pct < 20.f) return 0.f; if (fan_pct < 30.f) return 25.f; return 35.f; } float quant = fan_quantize_local(fan_target); if (quant != g_fan_last_quant) { if (g_fan_dwell_s > 0.f) { fan_target = g_fan_last_quant; } else { g_fan_last_quant = quant; g_fan_dwell_s = FAN_DWELL_MIN_S; } } g_fan_dwell_s = fmaxf(0.f, g_fan_dwell_s - dt_s);
保证风扇在同一档位至少维持 2s,避免频繁切换。
⸻
- 状态位日志 & 可视化分析
运行时打印状态:
STATE: t=692.6s MODE=HEAT BOOST=0 SILENT=0 FREEZE=0 STALL=1 | SP=40.00 T=39.39 dTdt=0.005 | Fan=18.0% (Q=0) Heat=28.0%
绘图脚本(plot_log_state.py)可解析这些状态,并在曲线上上色,快速定位问题阶段。
⸻
总结
通过这次调试:
• 温度控制 从传统 PID 调整为带 FREEZE 的抗过冲策略
• 风扇控制 从线性映射改为 量化 + 停留时间,显著降低噪音
• 可视化 结合状态位日志,分析效率提升数倍
接下来还可以尝试:
• 按室温与目标温差自适应调整风扇基础档位
• 在 HOLD 模式下进一步优化风扇功耗
• 引入环境湿度对加热功率的补偿
⸻
评论 (0)