1. STM32智能饮水机项目概述
作为一名嵌入式开发工程师,我最近完成了一个基于STM32的智能饮水机项目。这个项目源于我对传统饮水机使用体验的不满——每次都要手动控制加热和加水,既不方便又存在安全隐患。通过这个项目,我成功实现了一个具备自动温控、水位监测、远程控制等功能的智能饮水系统。
1.1 项目核心功能
这个智能饮水机系统具备以下核心功能:
- 实时水温监测(0-100℃范围,±0.5℃精度)
- 自动加热控制(可设置温度上下限)
- 非接触式水位检测(无水/低水位/高水位三档)
- 自动补水功能(通过微型水泵)
- 双工作模式(自动/手动)
- OLED状态显示
- 蓝牙APP远程控制
- 异常报警系统(蜂鸣器+LED)
1.2 硬件选型考量
在硬件选型上,我主要考虑了以下几个因素:
- 主控芯片:STM32F103C8T6,72MHz主频,32KB Flash,6KB RAM,性价比高
- 温度传感器:DS18B20防水型,单总线接口,±0.5℃精度
- 水位传感器:电容式非接触传感器,避免与水直接接触
- 显示模块:0.96寸OLED,I2C接口,低功耗
- 通信模块:BT04A蓝牙4.0模块,10米通信距离
2. 硬件系统设计详解
2.1 主控电路设计
主控电路采用STM32F103C8T6最小系统板,包含以下关键部分:
- 电源电路:12V输入,通过AMS1117-3.3V稳压芯片输出3.3V
- 复位电路:10K上拉电阻+0.1uF电容
- 时钟电路:8MHz晶振+22pF负载电容
- 调试接口:SWD四线调试接口
特别注意:加热和水泵控制部分使用光耦隔离,避免大电流干扰主控电路。
2.2 传感器接口设计
2.2.1 温度传感器电路
DS18B20采用单总线接口设计:
code复制VCC -- 3.3V
DQ -- PA0 (4.7K上拉)
GND -- GND
为提高抗干扰能力,我在数据线上增加了0.1uF滤波电容。
2.2.2 水位传感器电路
采用电容式非接触传感器:
code复制VCC -- 5V
DO1 -- PA1 (低水位)
DO2 -- PA2 (高水位)
GND -- GND
传感器安装时需注意与水箱保持3-5mm距离,确保检测精度。
2.3 执行机构驱动电路
2.3.1 加热控制电路
采用继电器驱动50W加热片:
code复制MCU PA3 → 1K电阻 → NPN三极管 → 继电器线圈
继电器常开触点 → 加热片 → 12V电源
在继电器线圈两端并联续流二极管,保护三极管。
2.3.2 水泵控制电路
与加热控制类似:
code复制MCU PA4 → 1K电阻 → NPN三极管 → 继电器线圈
继电器常开触点 → 水泵 → 12V电源
水泵电源端串联2A自恢复保险丝,防止堵转烧毁。
3. 软件系统实现
3.1 系统软件架构
采用模块化设计,主要包含以下功能模块:
- 主控制模块
- 温度采集模块
- 水位检测模块
- 加热控制模块
- 水泵控制模块
- OLED显示模块
- 蓝牙通信模块
- 按键处理模块
- 报警处理模块
3.2 关键算法实现
3.2.1 温度采集算法
采用滑动平均滤波算法:
c复制#define SAMPLE_NUM 5
float get_filtered_temp(void) {
float sum = 0;
for(int i=0; i<SAMPLE_NUM; i++){
sum += DS18B20_ReadTemp();
delay_ms(10);
}
return sum/SAMPLE_NUM;
}
3.2.2 PID温度控制
使用位置式PID算法:
c复制typedef struct {
float Kp, Ki, Kd;
float err, last_err;
float integral;
} PID;
float pid_calc(PID* pid, float set, float actual) {
pid->err = set - actual;
pid->integral += pid->err;
float output = pid->Kp * pid->err
+ pid->Ki * pid->integral
+ pid->Kd * (pid->err - pid->last_err);
pid->last_err = pid->err;
return output;
}
3.3 蓝牙通信协议设计
自定义简单通信协议:
code复制帧头(0xAA) | 命令字 | 数据长度 | 数据 | 校验和
典型命令示例:
- 0x01:设置温度上限
- 0x02:设置温度下限
- 0x03:切换工作模式
- 0x04:手动控制加热
- 0x05:手动控制水泵
4. 系统调试与优化
4.1 硬件调试要点
-
电源测试:
- 测量3.3V和5V电压是否稳定
- 带载测试电压跌落情况
- 检查各模块供电电流是否正常
-
传感器校准:
- 温度传感器与标准温度计对比校准
- 水位传感器在不同水位状态下的响应测试
-
继电器测试:
- 测量触点接触电阻
- 测试开关寿命(至少10000次)
4.2 软件调试技巧
- 使用printf调试:
c复制// 重定向printf到串口
int fputc(int ch, FILE *f) {
USART_SendData(USART1, (uint8_t)ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
return ch;
}
-
逻辑分析仪使用:
- 抓取单总线时序
- 分析I2C通信数据
- 测量中断响应时间
-
功耗优化:
- 合理使用低功耗模式
- 动态调整CPU频率
- 外设时钟门控
5. 项目经验总结
5.1 遇到的典型问题及解决方案
-
问题:DS18B20读数不稳定
- 原因:上拉电阻值过大
- 解决:将上拉电阻从10K改为4.7K
-
问题:继电器频繁动作
- 原因:温度控制没有迟滞
- 解决:增加2℃的回差控制
-
问题:蓝牙连接不稳定
- 原因:天线附近有金属干扰
- 解决:调整蓝牙模块位置,增加屏蔽
5.2 实用建议
-
PCB设计:
- 将模拟和数字地分开
- 大电流走线加宽
- 关键信号线走等长
-
代码规范:
- 使用模块化编程
- 重要变量加volatile
- 关键操作加注释
-
安全考虑:
- 增加漏电保护
- 设置温度上限保护
- 干烧自动断电
这个项目从构思到完成历时两个月,期间遇到了不少挑战,但也收获了很多嵌入式系统开发的经验。特别是在实时控制、低功耗设计和无线通信方面有了更深入的理解。后续我计划增加WiFi连接和云端监控功能,让系统更加智能化。
