1. 项目概述
这个基于STM32F103C8T6单片机的智能热水器控制系统是我去年完成的一个毕业设计项目。作为一个嵌入式系统开发的实践案例,它完美融合了传感器技术、自动控制原理和人机交互设计。系统通过多传感器协同工作,实现了热水器的智能化控制,相比传统热水器具有更高的安全性和能源利用效率。
核心功能包括:
- 水温自动调节(DS18B20温度传感器监测)
- 水位自动控制(双水位触发检测)
- 智能供电切换(光敏电阻检测光照强度)
- 多重安全保护机制
- 用户可配置参数界面
- 实时数据显示
这个项目特别适合作为电子类专业学生的课程设计或毕业设计选题,因为它涵盖了嵌入式系统开发的完整流程:从需求分析、硬件设计、PCB制作到软件编程和系统调试。
2. 系统设计与架构解析
2.1 整体系统框图
系统采用经典的"传感器-控制器-执行器"架构,分为三大模块:
code复制[输入模块] --> [STM32主控] --> [输出模块]
输入部分包括:
- 温度传感器(DS18B20)
- 水位检测模块(双触发式)
- 光照传感器(光敏电阻+ADC)
- 按键输入(5个功能键)
输出部分包括:
- LCD显示屏(12864或1602)
- 继电器组(5路控制)
- 状态指示灯
2.2 主控芯片选型
选用STM32F103C8T6作为主控芯片主要基于以下考虑:
- 性能足够:72MHz主频,20KB RAM,64KB Flash
- 外设丰富:多个ADC通道、定时器、GPIO
- 开发便捷:完善的生态系统和文档支持
- 成本优势:价格适中,适合学生项目
- 封装合适:LQFP48封装便于手工焊接
提示:对于初学者,建议使用带调试接口的开发板先进行功能验证,再转移到自制PCB上。
2.3 关键传感器选型
2.3.1 DS18B20水温传感器
- 防水型封装,可直接浸入水中
- 数字信号输出,抗干扰能力强
- ±0.5℃精度满足热水器需求
- 单总线协议节省IO资源
2.3.2 水位检测模块
采用双浮球开关设计,实现三级水位检测:
- 高水位触发(水箱满)
- 低水位触发(需要加水)
- 无水状态(安全保护)
这种设计比连续式水位传感器更可靠且成本更低。
2.3.3 光照检测电路
使用GL5528光敏电阻配合STM32内置ADC:
- 分压电路简单可靠
- 软件可校准灵敏度
- 成本低廉
- 响应速度快
3. 硬件设计详解
3.1 原理图设计要点
使用Altium Designer 2013绘制原理图时,特别注意了以下几个关键点:
-
电源部分:
- TYPE-C接口输入5V
- AMS1117-3.3提供MCU电源
- 100μF+0.1μF滤波电容组合
- 反接保护二极管
-
传感器接口:
- DS18B20加上拉电阻(4.7K)
- 光敏电阻分压电路(10K固定电阻)
- 水位开关防抖电路(0.1μF电容)
-
继电器驱动:
- ULN2003驱动芯片
- 继电器线圈反并联二极管
- 指示灯LED+限流电阻
-
显示接口:
- 预留1602和12864兼容接口
- 对比度调节电位器
- 背光控制电路
3.2 PCB布局经验
-
层叠设计:
- 两层板
- 顶层和底层均覆铜接地
- 板厚1.6mm(实际制作1.2mm)
-
布局原则:
- 电源模块靠近接口
- MCU居中布置
- 传感器接口靠近板边
- 继电器远离模拟电路
-
布线技巧:
- 电源线加粗到20mil
- 模拟信号线包地处理
- 高频信号短线布置
- 避免直角走线
-
制作细节:
- 所有插针式元件
- 关键测试点引出
- 板号隐藏于MCU底座下
- 丝印清晰标注
注意:手工焊接STM32时,建议先焊对角两个引脚固定位置,再依次焊接其余引脚。使用刀头烙铁和优质焊锡丝会更轻松。
4. 软件设计与实现
4.1 程序架构设计
采用前后台系统架构:
code复制主循环(后台):
按键扫描
显示刷新
状态监测
定时中断(前台):
传感器数据采集
控制逻辑处理
安全保护检查
这种架构保证了:
- 实时性要求高的任务由中断处理
- 人机交互任务在主循环执行
- 系统响应及时且不阻塞
4.2 关键算法实现
4.2.1 温度采集处理
c复制float Ds18b20_Read_Temp(void)
{
uint8_t temp[2];
DS18B20_Start(); // 启动转换
DS18B20_Read_Byte(temp); // 读取温度值
float temperature = (temp[1]<<8)|temp[0];
return temperature/16.0; // 转换为实际温度
}
- 每100ms采集一次
- 软件滤波:连续3次采样取中值
- 温度变化率限制保护
4.2.2 光照强度计算
c复制light_value = 500 - 151*(ADC_Get_Value(ADC_CHANNEL_0) / 4096.0 * 3.3);
- 基于实验数据线性拟合
- ADC参考电压3.3V
- 12位分辨率(0-4095)
- 定期自动校准
4.2.3 水位状态判断
c复制if(CHECK_WH == 0)
water_value = 2; // 高水位
else if(CHECK_WL == 0)
water_value = 1; // 低水位
else
water_value = 0; // 无水
- 双开关消抖处理
- 状态变化延时确认
- 异常状态自动恢复
4.3 控制逻辑实现
4.3.1 水温控制
c复制if(temp_value < temp_min && water_value > 0)
{
HEAT_RELAY = ON; // 启动加热
}
else if(temp_value >= temp_max)
{
HEAT_RELAY = OFF; // 停止加热
}
- 水位不足时禁止加热
- 加热滞后控制防震荡
- 加热超时保护
4.3.2 水位控制
c复制if(water_value == 0 && time_water < 300)
{
WATER_RELAY = ON; // 加水10秒
time_water++;
}
- 脉冲式加水控制
- 防溢流保护
- 加水超时报警
4.3.3 供电切换
c复制if(light_value > light_min)
{
SOLAR_RELAY = ON; // 太阳能供电
CITY_RELAY = OFF;
}
else
{
SOLAR_RELAY = OFF;
CITY_RELAY = ON; // 市电供电
}
- 切换延时防抖动
- 异常状态回退
- 供电状态指示
5. 系统调试与优化
5.1 硬件调试技巧
-
上电前必查:
- 电源对地电阻
- 芯片供电电压
- 短路情况
-
分模块调试:
- 先调通电源
- 再验证MCU最小系统
- 最后接外设
-
常见问题处理:
- DS18B20不响应:检查上拉电阻和时序
- 继电器不动作:测量驱动芯片输出
- 显示异常:调整对比度电压
5.2 软件调试方法
-
调试工具:
- ST-Link V2调试器
- 串口打印日志
- 逻辑分析仪
-
调试技巧:
- 关键变量实时监测
- 状态指示灯辅助调试
- 分段屏蔽代码定位问题
-
典型问题:
- 按键抖动:增加软件消抖
- ADC波动:多次采样平均
- 控制震荡:调整阈值滞后
5.3 性能优化记录
-
功耗优化:
- 空闲时进入睡眠模式
- LED亮度降低
- 显示刷新率调整
-
响应速度优化:
- 中断优先级调整
- 算法简化
- 非关键任务延迟执行
-
稳定性增强:
- 看门狗定时器
- 参数EEPROM存储
- 异常状态恢复机制
6. 项目总结与扩展
6.1 实际测试数据
经过72小时连续运行测试:
- 温度控制精度:±1℃
- 水位检测准确率:100%
- 供电切换响应时间:<2s
- 系统平均功耗:3.5W
6.2 可改进方向
-
硬件方面:
- 增加WiFi/蓝牙模块
- 改用贴片元件缩小体积
- 添加水流传感器
-
软件方面:
- 实现PID温度控制
- 增加手机APP控制
- 添加能耗统计功能
-
安全方面:
- 漏电保护
- 干烧保护
- 防冻功能
6.3 项目心得
这个项目让我深刻理解了嵌入式系统开发的完整流程。几个特别有价值的经验:
- 传感器校准非常关键,实际环境下的性能往往与手册有差异
- 继电器控制大功率设备时,隔离和防护必不可少
- 状态机编程模式非常适合这种多条件控制的场景
- 调试阶段分模块验证能大幅提高效率
对于想尝试类似项目的同学,建议先从现成开发板开始,功能验证完成后再设计自己的PCB。同时,合理规划IO资源和中断优先级,这些前期工作能避免后期的很多麻烦。