1. 项目背景与需求分析
作为一名长期从事嵌入式开发的工程师,我注意到身边不少老年亲属和慢性病患者经常面临忘记服药或重复服药的困扰。传统药盒功能单一,无法满足现代健康管理的需求。基于这个痛点,我决定开发一款多功能智能药盒系统。
这个项目需要解决几个核心问题:
- 如何准确监测药品存量(避免断药)
- 如何实现可靠的服药提醒(包括本地和远程)
- 如何确保药品存储环境适宜
- 如何设计用户友好的交互界面
经过市场调研,我将系统功能需求明确为以下6个方面:
- 环境监测:实时检测药盒内温湿度
- 存量监测:精确测量药品剩余量
- 定时提醒:支持多组独立定时设置
- 交互界面:OLED显示+语音播报
- 远程控制:通过蓝牙连接手机APP
- 报警功能:缺药和服药提醒报警
2. 硬件系统设计
2.1 核心控制器选型
选择STM32F103C8T6作为主控芯片主要基于以下考量:
- 72MHz主频满足实时性要求
- 丰富的外设接口(3个UART、2个I2C、1个SPI)
- 64KB Flash+20KB RAM的存储配置
- 广泛的社区支持和开发资源
- 成本控制在20元以内
实际开发中发现,该型号的GPIO数量刚好满足本项目需求,且内置硬件I2C和USART能显著降低软件开发难度。
2.2 传感器模块设计
2.2.1 温湿度监测
选用DHT11数字温湿度传感器:
- 单总线接口节省GPIO资源
- 0-50℃测量范围(精度±2℃)
- 20-90%RH湿度测量范围
- 典型应用电路仅需1个上拉电阻
硬件连接:
code复制DHT11 STM32
VCC -> 3.3V
DATA -> PA0
GND -> GND
(需在DATA线加10kΩ上拉电阻)
2.2.2 药品余量检测
采用HX711+称重传感器的方案:
- 24位高精度ADC
- 支持差分输入
- 内置可编程增益放大器
- 典型精度可达0.1g
称重传感器选用5kg量程的悬臂梁式传感器,灵敏度2.0mV/V。实际测试发现,在500g量程内能达到0.5g的测量精度,完全满足药量监测需求。
接线方式:
code复制HX711 STM32
VCC -> 5V
DT -> PA1
SCK -> PA2
GND -> GND
2.2.3 服药动作检测
使用红外反射传感器:
- 检测距离2-30mm可调
- 数字量输出
- 响应时间<1ms
- 工作电流<20mA
安装时将其对准药盒取药口,当用户伸手取药时会遮挡红外线,产生触发信号。
2.3 人机交互模块
2.3.1 OLED显示
选用0.96寸I2C接口OLED:
- 128x64分辨率
- 自发光无需背光
- 超低功耗(全亮时<20mA)
- 支持多种显示模式
实际开发中使用u8g2图形库,实现了以下界面元素:
- 实时时钟显示
- 温湿度曲线图
- 药品余量进度条
- 定时设置菜单
2.3.2 语音提醒
采用JR6001语音模块:
- 支持MP3/WAV格式
- 内置8Ω/1W扬声器
- UART控制接口
- 可存储多段语音
录制了以下提示音:
- "请按时服药"
- "药品存量不足"
- "温湿度异常"
2.4 通信模块
选择BT04A蓝牙4.0模块:
- 兼容Android/iOS
- 最大传输距离10m
- 默认波特率9600bps
- 低功耗设计
手机APP通过以下协议与设备通信:
code复制[HEAD][LEN][CMD][DATA][CRC]
HEAD: 0xAA
LEN: 数据长度
CMD: 指令码
DATA: 参数数据
CRC: 校验和
3. 软件系统实现
3.1 开发环境搭建
- 安装Keil MDK 5.25
- 导入STM32F1xx_DFP芯片支持包
- 配置工程选项:
- 使用CMSIS核心库
- 启用微库(MicroLib)
- 优化等级-O2
- 硬件调试工具:
- ST-Link V2编程器
- 逻辑分析仪(分析通信时序)
- 万用表(测量电源质量)
3.2 关键算法实现
3.2.1 称重数据处理
采用滑动窗口滤波算法:
c复制#define FILTER_SIZE 10
uint32_t weight_buffer[FILTER_SIZE];
uint8_t filter_index = 0;
uint32_t filter_weight(uint32_t raw_weight)
{
weight_buffer[filter_index] = raw_weight;
filter_index = (filter_index + 1) % FILTER_SIZE;
uint32_t sum = 0;
for(uint8_t i=0; i<FILTER_SIZE; i++){
sum += weight_buffer[i];
}
return sum / FILTER_SIZE;
}
3.2.2 定时提醒管理
使用RTC+定时器实现多组独立提醒:
c复制typedef struct {
uint8_t hour;
uint8_t minute;
uint8_t enable;
uint8_t triggered;
} TimerSetting;
TimerSetting timers[5];
void check_timers()
{
RTC_TimeTypeDef current_time;
HAL_RTC_GetTime(&hrtc, ¤t_time, RTC_FORMAT_BIN);
for(uint8_t i=0; i<5; i++){
if(timers[i].enable && !timers[i].triggered){
if(current_time.Hours == timers[i].hour &&
current_time.Minutes == timers[i].minute){
play_voice(REMIND_VOICE);
timers[i].triggered = 1;
}
}
}
}
3.3 低功耗优化
通过以下措施将待机功耗降至5mA以下:
- 动态调整CPU频率(72MHz→8MHz)
- 传感器间歇工作模式(DHT11每5分钟采样一次)
- OLED自动息屏(30秒无操作)
- 蓝牙广播间隔调整为2秒
4. 系统测试与优化
4.1 功能测试结果
| 测试项目 | 测试方法 | 预期结果 | 实际结果 |
|---|---|---|---|
| 温湿度监测 | 用温湿度校准箱验证 | ±2℃/±5%RH精度 | 达标 |
| 称重准确性 | 用标准砝码测试 | 误差<1g | 0.5g误差 |
| 定时提醒 | 设置多组定时 | 准时触发 | 误差<1秒 |
| 蓝牙通信距离 | 在不同距离测试连接 | 10m内稳定 | 8m后偶发断开 |
| 语音播报清晰度 | 在不同环境噪声下测试 | 1米内清晰可辨 | 达标 |
4.2 遇到的问题及解决方案
-
问题:DHT11数据偶尔异常
- 原因:时序控制不严格
- 解决:改用硬件定时器生成精确延时
-
问题:称重数据漂移
- 原因:电源噪声干扰
- 解决:在HX711电源端增加LC滤波电路
-
问题:蓝牙连接不稳定
- 原因:天线布局不当
- 解决:重新设计PCB天线走线
5. 实际应用建议
-
安装要点:
- 称重传感器需水平安装
- 红外传感器要对准取药位置
- 避免阳光直射温湿度传感器
-
使用技巧:
- 首次使用前需进行称重校准
- 定期用干燥剂维护药盒湿度
- APP可设置服药记录提醒
-
扩展方向:
- 增加药品识别功能(RFID)
- 接入智能家居系统
- 开发微信小程序控制端
这个项目从构思到完成历时3个月,总成本控制在150元以内。在实际使用中,父母的服药依从性提高了约70%,证明这种智能药盒确实能有效解决忘记服药的问题。
