1. 项目背景与需求分析
作为一名嵌入式开发工程师,我最近完成了一个基于STM32的智能药盒项目。这个项目的灵感来源于家中老人经常忘记按时服药的问题。传统药盒虽然能分装药物,但缺乏提醒和监督功能,导致漏服、错服的情况时有发生。
智能药盒的核心需求可以归纳为以下几点:
- 定时提醒功能:在预设时间发出声光提醒
- 服药记录功能:记录每次服药情况
- 远程监控功能:家属可通过手机查看服药情况
- 防误服设计:避免重复取药或错误取药
2. 硬件系统设计
2.1 主控芯片选型
经过对比STM32系列多款芯片,最终选择了STM32F103C8T6作为主控芯片,主要基于以下考虑:
- 72MHz主频足够处理本项目需求
- 64KB Flash和20KB SRAM满足程序存储需求
- 丰富的外设接口(USART、SPI、I2C等)
- 低功耗特性适合电池供电场景
- 性价比高,开发资源丰富
2.2 外围电路设计
2.2.1 电源管理模块
采用TP4056锂电池充电管理芯片,支持5V USB输入,搭配18650锂电池供电。实测在正常使用情况下,2000mAh电池可维持约2周续航。
2.2.2 显示模块
选用0.96寸OLED显示屏(SSD1306驱动),分辨率128x64,通过I2C接口与主控通信。相比LCD屏,OLED具有更低的功耗和更好的显示效果。
2.2.3 时钟模块
使用DS3231高精度RTC模块,确保时间精准。实测月误差小于1分钟,完全满足日常使用需求。
2.2.4 提醒模块
包含蜂鸣器和LED指示灯。蜂鸣器采用有源蜂鸣器,驱动简单;LED使用RGB LED,可通过不同颜色表示不同状态。
2.2.5 通信模块
采用ESP8266 WiFi模块实现联网功能,通过AT指令与主控通信,将服药数据上传至云平台。
2.2.6 药盒机械结构
设计为7格旋转式结构,每格对应一天的不同时段。通过步进电机驱动旋转,配合光电传感器检测药格位置。
3. 软件系统设计
3.1 系统架构
软件系统采用分层设计:
- 硬件驱动层:负责各外设的底层驱动
- 中间件层:提供RTOS、文件系统等支持
- 应用层:实现业务逻辑
3.2 关键功能实现
3.2.1 定时提醒功能
c复制void alarm_check(void)
{
RTC_TimeTypeDef current_time;
HAL_RTC_GetTime(&hrtc, ¤t_time, RTC_FORMAT_BIN);
for(int i=0; i<MAX_ALARMS; i++){
if(alarms[i].enabled &&
alarms[i].hour == current_time.Hours &&
alarms[i].min == current_time.Minutes){
trigger_alarm();
break;
}
}
}
3.2.2 服药记录功能
采用SPI Flash存储服药记录,使用FATFS文件系统管理。每条记录包含:
- 服药时间
- 药格编号
- 服药状态(已服/未服)
3.2.3 远程监控功能
通过MQTT协议将数据上传至云平台,数据结构如下:
json复制{
"device_id": "123456",
"timestamp": "2023-07-20T08:00:00",
"compartment": 1,
"status": "taken"
}
3.2.4 防误服设计
实现逻辑:
- 当前药格未服药时,锁定其他药格
- 检测到当前药格打开后,启动5分钟倒计时
- 倒计时结束后如未检测到关闭动作,发送提醒通知
3.3 用户界面设计
采用状态机模式管理界面流转:
- 主界面:显示时间、下次服药时间
- 设置界面:设置闹钟时间、WiFi等
- 记录界面:查看服药历史
- 通知界面:显示提醒信息
4. 系统调试与优化
4.1 低功耗优化
通过以下措施降低功耗:
- 主频动态调整:非活跃时段降至32MHz
- 外设电源管理:不使用时关闭外设电源
- 睡眠模式:无操作5分钟后进入STOP模式
实测优化后待机电流从15mA降至2mA。
4.2 机械结构调试
遇到的主要问题及解决方案:
- 药格定位不准 → 增加霍尔传感器辅助定位
- 电机堵转 → 加入电流检测和保护机制
- 药格卡死 → 优化机械结构公差
4.3 无线通信稳定性
针对ESP8266断连问题,采取以下措施:
- 增加心跳包机制(30秒间隔)
- 实现断线自动重连
- 重要数据本地缓存,网络恢复后补传
5. 项目成果与改进方向
最终实现的智能药盒具有以下特点:
- 7个独立药格,支持不同时段服药
- 精准的定时提醒功能
- 完整的服药记录系统
- 远程监控能力
- 平均续航时间10天
可能的改进方向:
- 增加语音提醒功能
- 实现药品库存管理
- 开发配套手机APP
- 支持多用户配置
在实际开发过程中,最大的挑战是机械结构与电子系统的协同设计。通过多次迭代和测试,最终实现了稳定可靠的系统。对于想要复现项目的开发者,建议先从电子部分入手,待功能验证完成后再进行机械结构的设计和调试。
