1. 项目概述:智能降温水杯的核心需求
最近在做一个挺有意思的小项目——用HC-05蓝牙模块和STM32单片机实现一个智能降温水杯的APP控制功能。这个水杯不仅能显示实时温度,还能通过手机APP设置目标温度,当水温过高时自动提醒用户。第一期主要完成了基础功能的演示和关键材料的选型工作。
做这个项目的初衷很简单:市面上很多所谓"智能水杯"要么功能单一,要么价格虚高。作为一个电子爱好者,我决定自己动手打造一个真正实用的智能水杯系统。整套方案成本控制在百元以内,但实现了温度监测、智能提醒、手机控制等核心功能,性价比相当不错。
2. 硬件选型与核心组件解析
2.1 主控芯片:STM32F103C8T6
选择STM32F103C8T6作为主控主要基于以下几点考虑:
- 72MHz主频完全足够处理温度数据和蓝牙通信
- 内置12位ADC,可以直接读取温度传感器的模拟信号
- 丰富的GPIO和串口资源,方便扩展其他功能
- 开发社区资源丰富,遇到问题容易找到解决方案
注意:市面上有些开发板标注的是STM32F103C8,实际使用的是C8T6芯片,购买时需要确认清楚。
2.2 蓝牙模块:HC-05
HC-05蓝牙模块是这个项目的关键组件之一,选型时我对比了几种常见方案:
| 模块型号 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| HC-05 | 成本低、稳定性好、AT指令丰富 | 功耗较高 | 固定供电设备 |
| HC-06 | 更便宜 | 功能简化、只能做从机 | 简单单向通信 |
| BLE4.0 | 低功耗 | 开发复杂度高 | 电池供电设备 |
最终选择HC-05是因为:
- 需要双向通信能力(手机发送指令,水杯返回温度数据)
- 开发板已有现成的串口转接电路
- 丰富的AT指令集方便调试和功能扩展
2.3 温度传感器:DS18B20
温度传感器选用了DS18B20,主要看中它的几个特点:
- 数字输出,不需要额外的ADC电路
- ±0.5℃的精度完全满足水杯需求
- 防水封装可以直接接触液体
- 单总线协议节省IO资源
实测中发现一个小技巧:长线传输时最好在数据线加一个4.7KΩ的上拉电阻,可以显著提高通信稳定性。
3. 系统架构与电路设计
3.1 整体系统框图
整个系统的工作流程如下:
code复制[DS18B20] → [STM32] ↔ [HC-05] ↔ [手机APP]
↓
[LED指示灯][蜂鸣器]
3.2 电源设计
考虑到水杯需要移动使用,电源部分特别设计了双供电方案:
- 主电源:18650锂电池(3.7V)
- 备用电源:Micro USB接口(5V)
使用TP4056充电管理芯片实现锂电池的充放电保护,再通过AMS1117-3.3稳压芯片为系统提供稳定的3.3V工作电压。
重要提示:DS18B20的工作电压范围是3.0V-5.5V,直接接3.3V没问题,但HC-05模块需要特别注意——虽然标称工作电压是3.3V,但实际测试发现有些模块在3.3V下通信不稳定。建议通过电平转换电路连接,或者直接使用5V供电。
3.3 PCB布局技巧
在设计PCB时有几个实用经验值得分享:
- 蓝牙天线区域要留出足够的净空区,周围不要走其他信号线
- 温度传感器走线要尽量短,避免引入干扰
- 电源部分电容要靠近芯片放置(我用的是10μF+0.1μF组合)
- 所有IO口最好都预留上拉/下拉电阻位置
4. 固件开发与关键代码解析
4.1 开发环境搭建
使用STM32CubeMX + Keil MDK开发环境:
- 用CubeMX配置时钟、GPIO、USART等外设
- 生成工程后导入Keil进行功能开发
- 调试使用ST-Link V2下载器
推荐安装的插件:
- STM32CubeMonitor(实时查看变量)
- SerialWire Viewer(低功耗调试)
4.2 DS18B20驱动实现
DS18B20使用单总线协议,时序要求严格。以下是读取温度的核心代码片段:
c复制float DS18B20_GetTemp(void) {
uint8_t tempL, tempH;
DS18B20_Start();
if(DS18B20_Check()) {
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0xBE); // 读取暂存器
tempL = DS18B20_ReadByte();
tempH = DS18B20_ReadByte();
return ((tempH<<8)|tempL)*0.0625;
}
return -999; // 错误值
}
调试时发现的问题:
- 时序延迟需要根据主频精确调整
- 读取间隔最好大于750ms
- 首次上电读取可能失败,需要重试机制
4.3 蓝牙通信协议设计
自定义了简单的通信协议格式:
code复制[起始符][长度][命令字][数据][校验和]
示例帧:
- 手机→水杯:设置目标温度
[0xAA][0x03][0x01][25][0x29] - 水杯→手机:上报当前温度
[0xAA][0x04][0x02][25][0][0xCB]
校验和采用简单的累加和方式,实际项目中可以根据需要改用CRC。
5. APP开发与功能实现
5.1 Android端开发要点
使用Android Studio开发,核心功能包括:
- 蓝牙设备扫描与连接
- 温度数据接收与显示
- 目标温度设置
- 高温报警设置
关键代码 - 蓝牙连接部分:
java复制private final BluetoothAdapter.LeScanCallback mLeScanCallback =
(device, rssi, scanRecord) -> {
if(device.getName() != null && device.getName().equals("HC-05")){
mBluetoothAdapter.stopLeScan(mLeScanCallback);
BluetoothDevice mDevice = device;
mGatt = mDevice.connectGatt(this, false, mGattCallback);
}
};
5.2 数据可视化实现
使用MPAndroidChart库实现温度曲线绘制:
java复制LineData data = new LineData();
LineDataSet set = new LineDataSet(entries, "温度变化");
set.setColor(Color.BLUE);
set.setValueTextColor(Color.RED);
data.addDataSet(set);
chart.setData(data);
chart.invalidate();
6. 系统集成与调试经验
6.1 蓝牙连接稳定性优化
实测中发现蓝牙连接容易中断,通过以下方法改善:
- 增加心跳包机制(每30秒一次)
- 添加自动重连功能
- 优化天线位置和走线
- 调整发射功率(AT+CLASS=1)
6.2 功耗优化技巧
虽然本项目主要使用电池供电,但功耗优化也很重要:
- 空闲时让STM32进入Stop模式
- DS18B20不采样时断电
- 调整蓝牙模块广播间隔
- 关闭未使用的LED指示灯
实测优化后待机电流从25mA降到了8mA左右。
6.3 常见问题排查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 蓝牙无法连接 | 模块未进入配对模式 | 长按KEY引脚进入AT模式检查状态 |
| 温度读数异常 | 传感器接触不良 | 检查防水封装是否完好,重新插拔 |
| APP显示断连 | 超出通信距离 | 确保在10米范围内,检查天线方向 |
| 水杯不响应 | 主控死机 | 检查看门狗是否启用,复位电路是否正常 |
7. 项目扩展与改进方向
目前实现的基础功能已经可以满足日常使用,但还有几个值得改进的方向:
- 增加水温预测功能:基于历史温度变化率预测合适饮用时间
- 多杯组网:通过蓝牙Mesh实现多个水杯的状态监控
- 云端同步:通过WiFi模块将饮水数据上传到健康管理平台
- 触控操作:在水杯外壳增加电容触摸区域实现快捷操作
硬件上也可以考虑升级到STM32G0系列,性价比更高,或者改用BLE蓝牙模块进一步降低功耗。
