1. 项目概述:当STM32遇上恒温水壶
去年冬天,我窝在工作室调试电路板时,总想喝口温水却总被忽冷忽热的水温困扰。这个痛点催生了这个智能恒温水壶项目——用STM32F103C8T6为主控,配合DS18B20温度传感器和固态继电器,实现±1℃的精准控温。不同于普通保温壶的被动隔热,这套系统能主动调节加热功率,像给水壶装上了"智能大脑"。
市场上大多数恒温设备采用机械式温控器,控温精度差且无法远程交互。而我们的方案通过PID算法动态调节PWM占空比,配合OLED屏幕和WiFi模块(ESP-01S),既实现了本地触控操作,又支持手机APP远程监控。实测在环境温度20℃下,将500ml水从25℃加热至60℃仅需3分42秒,持续保温8小时耗电约0.15度。
2. 硬件架构设计解析
2.1 核心控制器选型
选用STM32F103C8T6(Cortex-M3内核)主要基于三点考量:
- 72MHz主频足够运行PID算法(计算周期<1ms)
- 内置12位ADC可精准读取NTC模拟信号
- 多达3个USART接口方便同时连接WiFi模块和调试终端
注意:若需更节能可选STM32L系列,但需注意L系列PWM输出通道较少的问题
2.2 温度传感方案对比
测试了三种方案后最终选择DS18B20数字传感器:
code复制| 传感器类型 | 精度 | 响应时间 | 接线复杂度 | 成本 |
|--------------|-------|----------|------------|-------|
| NTC热敏电阻 | ±0.5℃ | 慢 | 简单 | 低 |
| PT100 | ±0.1℃ | 中等 | 复杂 | 高 |
| DS18B20 | ±0.3℃ | 快 | 单总线 | 中等 |
DS18B20的单总线协议虽然需要严格时序控制,但节省了ADC资源且抗干扰能力强。实际使用时要特别注意:
- 总线必须接4.7K上拉电阻
- 每次读取间隔不得小于750ms
- 建议用CRC校验数据完整性
2.3 加热执行机构
采用SSR-40DA固态继电器控制800W加热管,相比机械继电器优势明显:
- 无触点磨损(寿命>500万次)
- 零噪音运行
- 支持PWM调功(建议频率1-10Hz)
关键参数计算示例:
c复制// 假设目标功率300W,电网电压220V
float target_current = 300 / 220 = 1.36A
float resistance_needed = 220 / 1.36 = 161.8Ω
因此选用800W/220V规格的加热管,实际通过PWM调节有效功率。
3. 软件控制逻辑实现
3.1 PID算法调参实战
在pid.c中实现位置式PID控制器:
c复制typedef struct {
float Kp, Ki, Kd;
float integral;
float prev_error;
} PID_Controller;
float PID_Update(PID_Controller* pid, float setpoint, float measured) {
float error = setpoint - measured;
pid->integral += error * dt;
float derivative = (error - pid->prev_error) / dt;
pid->prev_error = error;
return pid->Kp*error + pid->Ki*pid->integral + pid->Kd*derivative;
}
调参经验:
- 先设Ki=Kd=0,增大Kp至出现小幅振荡
- 取振荡时Kp值的50%作为基准
- Ki设为Kp/100逐步增加至消除静差
- Kd设为Kp*10抑制超调
3.2 多任务调度设计
使用FreeRTOS创建三个任务:
- 温度采集任务(优先级3,周期1s)
- PID计算任务(优先级4,周期100ms)
- 人机交互任务(优先级2)
关键点在于通过消息队列传递温度数据:
c复制xQueueSend(tempQueue, ¤tTemp, portMAX_DELAY);
4. 人机交互界面开发
4.1 OLED显示优化
使用UGUI库绘制界面时发现刷新闪烁问题,解决方案:
- 采用双缓冲机制
- 局部刷新代替全屏刷新
- 将128x64屏幕分区为:
- 顶部状态栏(20px)
- 主显示区(实时温度曲线)
- 底部控制区(44px)
4.2 手机APP通信协议
自定义轻量级协议帧格式:
code复制[HEAD][LEN][CMD][DATA][CRC]
0x55 0x06 0xA1 0x3C 0xXX
通过ESP-01S的AT指令实现透传:
bash复制AT+CIPSTART="TCP","api.xxx.com",80
AT+CIPSEND=48
5. 安全防护机制
5.1 多重温度保护
- 软件看门狗(独立线程监控主循环)
- 硬件过温保护(KSD9700温控开关)
- 干烧检测(通过加热速率判断)
5.2 异常处理流程
当检测到异常时立即:
- 关闭PWM输出
- 触发蜂鸣器报警
- OLED显示错误代码
- 通过WiFi推送告警通知
6. 实测性能数据
在25℃环境温度下测试:
code复制| 目标温度 | 到达时间 | 稳态波动 | 功耗 |
|----------|----------|----------|--------|
| 45℃ | 2'18" | ±0.7℃ | 85W |
| 60℃ | 3'42" | ±0.9℃ | 120W |
| 85℃ | 5'55" | ±1.2℃ | 210W |
发现高温段波动较大,通过增加PID微分项改善。
7. 常见问题排查指南
7.1 温度读数跳变
可能原因:
- DS18B20电源不稳(建议在VDD与GND间加104电容)
- 单总线被干扰(缩短导线长度,加磁珠)
- 时序不准确(用示波器检查复位脉冲)
7.2 WiFi频繁断开
解决方法:
- 检查AT指令响应时间(应<300ms)
- 在ESP-01S的VCC串接100μF电容
- 修改TCP心跳包间隔为60秒
7.3 加热速度慢
排查步骤:
- 测量加热管两端电压(应≈220V)
- 检查PWM占空比是否达到100%
- 清理水垢(导热系数降低60%)
这个项目最让我意外的是PID参数对不同水量非常敏感,后来增加了水位检测模块,根据水量自动切换参数表。现在每天早上用手机预约烧水,到工作室正好能喝到55℃的温水,这种精确控制带来的体验提升,正是嵌入式开发的魅力所在。
