1. 项目概述
这个基于STM32F103C8T6单片机的智能饮水机控制系统是我在毕业设计期间完成的一个实用项目。作为一名电子工程专业的学生,我选择这个课题是因为它完美结合了嵌入式系统开发与实际生活需求。整个系统从硬件选型到软件编写,再到PCB设计和组装调试,都由我独立完成。
系统最核心的功能是实现饮水机的智能化控制:通过DS18B20温度传感器实时监测水温,当温度低于设定下限时自动加热,达到上限则停止;同时利用水位检测模块防止干烧,在缺水时触发声光报警。所有状态信息都通过OLED屏幕直观显示,用户还可以通过按键切换工作模式、设置温度阈值等。
2. 系统整体设计
2.1 硬件架构设计
整个系统采用模块化设计思路,分为中控、输入和输出三大部分:
中控部分:
- 主控芯片选用STM32F103C8T6,这是一款性价比极高的Cortex-M3内核单片机
- 72MHz主频完全满足控制需求
- 内置的ADC和定时器资源为传感器数据采集提供了硬件支持
输入部分:
-
温度检测:采用防水型DS18B20数字温度传感器
- 测量范围:-55°C ~ +125°C
- 精度:±0.5°C(在0°C ~ +70°C范围内)
- 单总线接口,节省IO资源
-
水位检测:使用电容式水位传感器模块
- 检测高度:0-5cm可调
- 输出信号:数字开关量
- 工作电压:3.3V-5V
-
按键模块:包括5个轻触按键
- 功能分配:模式切换、温度设置、确认、出水控制
-
供电模块:
- 输入:5V/2A Type-C接口
- 采用AMS1117-3.3稳压芯片
- 为系统提供稳定的3.3V工作电压
输出部分:
-
显示模块:0.96寸OLED屏幕
- 分辨率:128x64
- 接口:I2C通信
- 显示内容:实时温度、水位状态、工作模式等
-
声光报警模块:
- 蜂鸣器:有源蜂鸣器,驱动电压3.3V
- LED指示灯:红绿双色LED
- 报警条件:缺水、温度异常
2.2 软件架构设计
软件部分采用分层设计,主要分为驱动层、应用层和用户界面层:
code复制┌───────────────────────┐
│ 用户界面层 │
│ (状态显示、按键处理) │
└───────────┬───────────┘
│
┌───────────▼───────────┐
│ 应用层 │
│ (温度控制、报警逻辑) │
└───────────┬───────────┘
│
┌───────────▼───────────┐
│ 驱动层 │
│ (传感器、外设驱动) │
└───────────────────────┘
开发环境使用Keil MDK-ARM V5,编程语言为C语言。代码采用模块化编写方式,每个功能模块都有对应的.c和.h文件,便于维护和升级。
3. 核心功能实现细节
3.1 温度检测与控制
温度检测是整个系统的核心功能之一,实现过程如下:
-
DS18B20传感器初始化
- 配置GPIO为开漏输出模式
- 实现单总线协议的复位、读写时序
- 读取传感器ROM编码进行设备验证
-
温度采集流程:
c复制void DS18B20_GetTemp(float *temp) {
DS18B20_Reset(); // 复位脉冲
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0x44); // 启动温度转换
delay_ms(750); // 等待转换完成
DS18B20_Reset();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE); // 读取暂存器
temp_l = DS18B20_ReadByte(); // 读取低字节
temp_h = DS18B20_ReadByte(); // 读取高字节
*temp = (temp_h<<8)|temp_l; // 合成16位数据
*temp = *temp * 0.0625; // 转换为实际温度值
}
- 加热控制逻辑:
- 当检测到水温低于temp_min(默认45°C)时,开启继电器控制加热管
- 当水温高于temp_max(默认60°C)时,关闭加热管
- 在加热过程中,OLED显示加热图标和实时温度
注意事项:DS18B20对时序要求严格,必须按照数据手册精确实现微秒级延时。在实际调试中发现,如果时序偏差超过15%,会导致读取失败。
3.2 水位检测与保护
水位检测是安全保护的关键,实现方案如下:
-
硬件连接:
- 水位传感器输出端接单片机GPIO
- 配置为上拉输入模式
- 增加RC滤波电路消除抖动
-
检测逻辑:
c复制void Check_Water_Level(void) {
if(HAL_GPIO_ReadPin(WATER_GPIO_Port, WATER_Pin) == 0) {
// 检测到有水
water_status = 1;
} else {
// 检测到无水
water_status = 0;
if(heating_status == 1) {
// 如果正在加热,立即停止
HAL_GPIO_WritePin(HEATER_GPIO_Port, HEATER_Pin, GPIO_PIN_RESET);
// 触发报警
Trigger_Alarm();
}
}
}
- 报警处理:
- 蜂鸣器以1Hz频率鸣响
- 红色LED闪烁
- OLED显示"缺水"提示
- 锁定加热功能直到水位恢复
3.3 用户交互设计
用户界面设计考虑了操作的便捷性和信息显示的直观性:
-
按键功能分配:
- KEY1:模式切换(加热/常温)
- KEY2:温度设置(进入设置界面)
- KEY3:数值增加
- KEY4:数值减少
- KEY5:确认/出水控制
-
界面布局:
code复制┌───────────────────────┐
│ 当前模式:[加热] │
│ 当前温度:52.3°C │
│ 水位状态:[正常] │
│ 设置温度:45-60°C │
└───────────────────────┘
- 设置流程:
- 按下KEY2进入温度设置界面
- 使用KEY3/KEY4调整上下限温度
- 按下KEY5保存设置并返回主界面
4. 硬件设计要点
4.1 PCB设计经验
-
布局原则:
- 电源模块靠近Type-C接口
- 单片机位于板子中央
- 传感器接口靠近板边便于接线
- 继电器与MCU保持适当距离防止干扰
-
布线技巧:
- 电源线宽0.5mm以上
- 数字信号线宽0.2-0.3mm
- 敏感信号线(如I2C)尽量短
- 避免直角走线,使用45°或圆弧转角
-
接地处理:
- 采用星型接地拓扑
- 数字地和模拟地通过0Ω电阻单点连接
- 大面积覆铜并增加过孔
实际调试中发现的问题:最初版本没有在继电器线圈两端并联续流二极管,导致开关瞬间产生的高压脉冲偶尔会使单片机复位。后来增加了1N4148二极管解决了这个问题。
4.2 元件选型建议
-
主控芯片:
- STM32F103C8T6(性价比高,资源丰富)
- 备选:GD32F103C8T6(国产替代)
-
温度传感器:
- 防水型DS18B20(需注意密封性)
- 备选:PT100+ADC(高精度方案)
-
显示模块:
- 0.96寸OLED(SSD1306驱动)
- 备选:LCD1602(成本更低)
-
继电器:
- 5V单路继电器模块(负载能力10A)
- 带光耦隔离保护
5. 软件实现关键点
5.1 主程序流程
c复制int main(void) {
// 硬件初始化
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C_Init();
// 外设初始化
OLED_Init();
DS18B20_Init();
// 主循环
while (1) {
// 温度检测
DS18B20_GetTemp(¤t_temp);
// 水位检测
Check_Water_Level();
// 加热控制
Heating_Control();
// 界面更新
OLED_Refresh();
// 按键处理
Key_Process();
// 延时50ms
HAL_Delay(50);
}
}
5.2 状态机设计
系统采用有限状态机(FSM)模型管理不同工作模式:
mermaid复制stateDiagram
[*] --> Idle
Idle --> Heating: 按下加热键
Heating --> Idle: 达到设定温度
Idle --> Setting: 按下设置键
Setting --> Idle: 设置完成
Heating --> Alarm: 检测到缺水
Alarm --> Idle: 水位恢复
实际代码实现:
c复制typedef enum {
MODE_IDLE,
MODE_HEATING,
MODE_SETTING,
MODE_ALARM
} SystemMode;
SystemMode current_mode = MODE_IDLE;
void System_State_Machine(void) {
switch(current_mode) {
case MODE_IDLE:
// 空闲状态处理
break;
case MODE_HEATING:
// 加热状态处理
break;
case MODE_SETTING:
// 设置状态处理
break;
case MODE_ALARM:
// 报警状态处理
break;
}
}
5.3 低功耗优化
虽然本设计对功耗要求不高,但仍做了一些优化:
-
外设电源管理:
- 不使用的传感器可关闭电源
- OLED支持局部刷新减少功耗
-
运行模式:
- 正常模式:72MHz主频
- 空闲模式:CPU暂停,外设保持运行
- 睡眠模式:通过按键唤醒
-
代码优化:
- 避免忙等待,使用中断和DMA
- 合理设置任务执行周期
6. 调试与问题解决
6.1 常见问题及解决方法
-
DS18B20读取失败:
- 检查接线是否正确(数据线需上拉4.7kΩ电阻)
- 确认时序精度,特别是复位脉冲宽度
- 尝试降低总线速度
-
OLED显示异常:
- 检查I2C地址是否正确(通常0x78或0x7A)
- 确认初始化序列完整
- 排查电源稳定性(3.3V要干净)
-
继电器误动作:
- 增加光耦隔离
- 线圈两端并联续流二极管
- 确保驱动电流足够(约20mA)
-
水位检测不稳定:
- 调整传感器灵敏度电位器
- 增加软件去抖(连续3次检测确认)
- 检查传感器安装位置是否合适
6.2 调试工具推荐
-
逻辑分析仪:
- 用于分析I2C、单总线等数字信号
- 推荐Saleae Logic或DSView
-
万用表:
- 测量各点电压
- 检查短路/断路
-
ST-Link调试器:
- 支持在线调试和程序下载
- 可查看变量、设置断点
-
串口调试助手:
- 打印调试信息
- 实时监控系统状态
7. 项目扩展方向
在实际开发过程中,我发现这个系统还有多个可以改进和扩展的方向:
-
无线功能扩展:
- 增加ESP8266模块实现WiFi连接
- 开发手机APP远程监控和控制
- 支持云端数据存储和分析
-
多段温度控制:
- 实现泡茶、咖啡等不同饮品的温度预设
- 增加温度曲线控制功能
-
水量统计:
- 记录每日用水量
- 提供饮水提醒功能
-
节能优化:
- 增加定时开关机功能
- 根据使用习惯学习优化加热策略
-
外观设计:
- 3D打印定制外壳
- 增加触摸屏替代按键
这个项目从构思到完成大约花费了两个月时间,期间遇到了不少挑战,但也收获了很多实践经验。最大的体会是:嵌入式开发需要同时考虑硬件和软件的协同工作,任何一个细节的疏忽都可能导致系统不稳定。建议初学者从这样的实际项目入手,逐步积累经验。