1. 项目概述
这个智能保温杯项目是我去年为一个大学生创新比赛设计的作品,核心思路是通过单片机给传统保温杯加上"大脑",让它能感知水温、记录饮水量,甚至提醒用户按时喝水。当时市面上虽然已经有类似产品,但要么价格昂贵,要么功能单一,我们就想做个既实用又便宜的方案。
从技术实现来看,这个项目完美结合了硬件和软件:硬件上需要温度传感器、水量检测模块、显示器件和单片机控制核心;软件上则要处理传感器数据、设计交互逻辑、优化功耗管理。整个开发过程踩了不少坑,但也积累了很多嵌入式开发的经验,下面就把这个项目的完整实现过程分享给大家。
2. 核心功能设计
2.1 功能需求分析
这个智能保温杯主要解决三个实际问题:
- 水温实时监测:避免烫嘴或喝到凉水,特别适合办公室和户外场景
- 饮水提醒:通过震动或灯光提示,帮助用户建立规律饮水习惯
- 饮水量统计:记录每日摄入量,对健身和养生人群特别有用
我们选用了STM32F103C8T6作为主控,这款单片机性价比极高(淘宝10元左右),72MHz主频完全够用,而且自带ADC和多个定时器,非常适合这种低功耗物联网设备。
2.2 硬件选型对比
| 模块 | 候选方案 | 最终选择 | 选择理由 |
|---|---|---|---|
| 温度传感 | DS18B20 | NTC热敏电阻 | 成本低至0.5元,精度±0.5℃足够 |
| 水量检测 | 称重传感器 | 光电液位传感器 | 不受杯子移动影响,更稳定 |
| 显示模块 | OLED屏 | LED点阵 | 阳光下可视性好,功耗更低 |
| 供电方案 | 18650电池 | 软包锂电池 | 体积小,方便杯底集成 |
提示:光电液位传感器安装时要注意与杯壁成30°夹角,可以避免气泡干扰检测
3. 硬件实现细节
3.1 电路设计要点
主控电路采用典型的STM32最小系统设计,但有几个特殊处理:
- 为NTC传感器设计了分压电路,配合STM32的12位ADC,可以实现0.1℃分辨率
- 光电传感器信号经过LM393比较器整形,避免误触发
- 添加了TP4056充电管理芯片,支持MicroUSB充电
c复制// 温度读取示例代码
float read_temperature() {
uint16_t adc_value = ADC_Read(ADC_CHANNEL_0);
float voltage = adc_value * 3.3 / 4095.0;
float resistance = 10.0 * voltage / (3.3 - voltage); // 10kΩ上拉电阻
return 1.0 / (log(resistance/10000.0)/3950.0 + 1.0/298.15) - 273.15; // NTC公式转换
}
3.2 结构设计避坑
第一版原型我们犯了个低级错误 - 把传感器都装在杯盖上,结果发现:
- 开盖时温度读数剧烈波动
- 光电传感器被水蒸气干扰
改进方案:
- 温度传感器改到杯体内侧壁,距离底部3cm处
- 光电传感器加装硅胶防水圈
- 所有电子部件做三防漆处理
4. 软件系统实现
4.1 主程序逻辑
采用时间片轮询架构,关键任务分配如下:
- 10ms任务:按键扫描、LED动画刷新
- 100ms任务:传感器数据采集
- 1s任务:饮水逻辑判断、低功耗处理
c复制void main() {
hardware_init();
while(1) {
if(timer_10ms()) {
key_scan();
led_refresh();
}
if(timer_100ms()) {
read_sensors();
}
if(timer_1s()) {
water_reminder();
power_manage();
}
}
}
4.2 饮水检测算法
水量检测是最大难点,我们最终采用的方案:
- 光电传感器每100ms采样一次
- 当检测到水位连续下降超过3次,判定为一次饮水
- 根据下降速度估算饮水量(需预先标定)
c复制// 简易饮水检测逻辑
void check_drinking() {
static uint8_t drop_count = 0;
if(current_level < last_level) {
drop_count++;
if(drop_count >= 3) {
log_water(calculate_volume());
drop_count = 0;
}
} else {
drop_count = 0;
}
last_level = current_level;
}
5. 功耗优化技巧
5.1 实测功耗数据
| 工作模式 | 电流消耗 | 优化手段 |
|---|---|---|
| 正常显示 | 8.2mA | 动态调整LED亮度 |
| 仅传感器 | 1.5mA | 降低采样频率 |
| 休眠模式 | 12μA | 关闭外设时钟 |
5.2 实战省电策略
- 无操作30秒后进入休眠,按键唤醒
- 温度采样间隔从100ms改为1s(水温变化缓慢)
- LED采用PWM调光,白天亮度70%,夜间30%
- 禁用调试接口和未用外设时钟
注意:STM32进入STOP模式前必须保存RTC配置,否则唤醒后时钟会错乱
6. 生产测试方案
6.1 校准流程
每台设备出厂前需要完成:
- 温度校准:在0℃和100℃两点校准NTC曲线
- 水量标定:注入50/100/200ml水记录传感器值
- 功耗测试:验证待机电流<15μA
6.2 常见故障排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 温度显示异常 | NTC接触不良 | 检查焊点,重涂导热硅脂 |
| 误判饮水 | 杯子倾斜 | 调整传感器角度,加软件滤波 |
| 充电发热 | TP4056散热不足 | 增加铜箔散热面积 |
7. 项目升级方向
实际使用中我们还发现几个可改进点:
- 增加蓝牙模块连接手机APP(可用ESP32替代STM32)
- 加入水质TDS检测功能
- 改用电子墨水屏提升阳光下可视性
- 开发磁吸充电底座方案
这个项目最让我意外的是水量检测算法的复杂度 - 看似简单的"判断是否在喝水",实际上要考虑杯子倾斜、气泡干扰、喝水速度等各种情况。后来我们收集了20多种喝水动作数据才优化出稳定的算法。
