1. 项目概述与核心需求
作为一名嵌入式开发者,我最近完成了一个基于STM32的智能药盒项目。这个设备主要解决老年人用药管理中的三大痛点:忘记服药、错误服药和药品存储不当。整套系统以STM32F103C8T6为主控,集成了温湿度监测、药品称重、语音提醒和蓝牙通信等功能模块。
在实际开发过程中,我发现要实现一个真正实用的智能药盒,必须满足以下几个核心需求:
- 精准的用药识别(避免误判)
- 可靠的多重提醒机制
- 直观的老人友好交互
- 30天以上的续航能力
- 200元以内的成本控制
2. 硬件系统设计详解
2.1 主控与传感器选型
经过对比测试,最终选择STM32F103C8T6作为主控芯片,主要基于以下考虑:
- 性价比:Cortex-M3内核,72MHz主频,价格仅10元左右
- 外设资源:具备ADC、TIM、USART等必要外设
- 开发生态:STM32CubeMX+Keil开发环境成熟
传感器配置方案:
- 温湿度:DHT11(单总线接口,±2℃精度)
- 称重:HX711+应变片(24位ADC,±0.5g精度)
- 人体检测:TCRT5000红外传感器
- 实时时钟:DS1302(带备用电池)
特别注意:DHT11在读取间隔小于1秒时容易失败,建议设置2秒以上的读取间隔
2.2 电源管理系统
为达到30天续航目标,电源设计采用以下策略:
c复制// 低功耗模式配置示例
void Enter_Stop_Mode(void)
{
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config(); // 唤醒后需重新配置时钟
}
实测电流消耗:
- 运行模式:36mA @72MHz
- 睡眠模式:1.2mA @2MHz
- 停止模式:28μA(仅RTC运行)
- 待机模式:1.8μA
2.3 机械结构设计
药盒采用3D打印外壳,关键设计要点:
- 称重平台三点支撑结构,减少桌面不平影响
- 药仓分区设计(早/中/晚/备用)
- 红外传感器45度倾斜安装,扩大检测范围
- 底部硅胶防滑垫,防止称重干扰
3. 核心算法实现
3.1 多模态用药识别算法
c复制// 用药行为判断逻辑
uint8_t Check_Medication_Event(void)
{
float weight_diff = Get_Weight_Difference();
uint8_t ir_state = Get_IR_State();
uint32_t time_diff = Get_Time_Diff_From_Alarm();
if((weight_diff > 0.5f) &&
(ir_state == 1) &&
(time_diff <= 600)) // 10分钟内
{
if(weight_diff < (dose*0.8f))
return PARTIAL_MED;
else if(weight_diff > (dose*1.2f))
return OVER_MED;
else
return NORMAL_MED;
}
return NO_ACTION;
}
3.2 自适应提醒策略
提醒机制采用三级递进式:
- 第一级:语音播报+LED闪烁(持续30秒)
- 第二级:蜂鸣器报警(5分钟后触发)
- 第三级:蓝牙推送手机通知(10分钟后触发)
音量自适应算法:
c复制void Adjust_Volume(void)
{
float env_noise = Estimate_Env_Noise(); // 通过ADC采样估算
uint8_t volume = BASE_VOLUME * (1 + 0.2f * env_noise/NOISE_REF);
Set_Volume(volume);
}
4. 软件架构设计
4.1 分层架构实现
code复制应用层
├─ 用户界面
├─ 系统控制
└─ 安全监控
服务层
├─ 用药服务
├─ 蓝牙服务
└─ 电源服务
中间件层
├─ 数据处理
├─ 任务调度
└─ 存储管理
驱动层
├─ 传感器驱动
├─ 人机交互驱动
└─ 通信驱动
硬件抽象层
└─ STM32 HAL库
4.2 关键任务调度
使用时间片轮询方式:
c复制void Task_Scheduler(void)
{
static uint32_t tick = 0;
if(HAL_GetTick() - tick >= 10) // 10ms周期
{
tick = HAL_GetTick();
Key_Scan_Task();
Sensor_Update_Task();
UI_Refresh_Task();
Power_Monitor_Task();
}
}
5. 实测数据与优化
5.1 性能测试结果
| 测试项目 | 指标要求 | 实测结果 |
|---|---|---|
| 温度测量精度 | ±2℃ | ±1.2℃ |
| 称重精度 | ±0.5g | ±0.3g |
| 语音识别距离 | 3米 | 3.2米 |
| 蓝牙连接时间 | <8秒 | 5.2秒 |
| 系统续航 | 30天 | 32天 |
5.2 常见问题解决
- 称重数据波动大
- 解决方法:增加滑动平均滤波,采样5次取平均
c复制float Get_Filtered_Weight(void)
{
static float buffer[5] = {0};
static uint8_t index = 0;
float sum = 0;
buffer[index] = HX711_Read();
index = (index + 1) % 5;
for(uint8_t i=0; i<5; i++)
sum += buffer[i];
return sum / 5;
}
- 蓝牙连接不稳定
- 优化措施:
- 增加天线匹配电路
- 采用CRC8校验
- 添加重传机制(最多3次)
- 语音模块功耗高
- 解决方案:
- 播报完成后立即断电
- 使用MOSFET控制电源
- 优化播报内容长度
6. 生产优化建议
- PCB设计要点:
- 模拟与数字地分割
- 传感器信号走线远离高频部分
- 电源走线足够宽(至少20mil)
- 成本控制方案:
- 国产HX711替代进口芯片(节省40%成本)
- 选用JLINK OB代替正版调试器
- 批量生产时改用FR4板材
- 量产测试流程:
code复制上电测试 → 功能测试 → 老化测试 → 校准测试 → 包装
这个项目从设计到量产共耗时3个月,最终BOM成本控制在180元以内,性能指标全部达标。在实际使用测试中,30位老年用户的用药依从性从68%提升至93%,验证了设计的有效性。
