1. 项目背景与核心价值
去年帮家里老人整理药品时,发现过期药片和吃错的剂量比想象中严重得多。这个看似简单的智能药盒项目,实际上解决的是老年群体用药安全的刚需问题。传统分药盒最大的痛点在于:依赖人工记忆导致漏服/错服、无法远程监控用药情况、缺乏紧急提醒机制。
基于STM32的方案之所以合适,是因为它完美平衡了三个关键因素:足够的计算性能处理定时提醒和传感器数据、丰富的外设接口连接各类模块、超低功耗特性保障长时间待机。我实测下来,整套系统待机电流可以控制在200μA以下,用800mAh的锂电池能坚持3个月以上。
2. 硬件系统架构设计
2.1 主控选型要点
最终选择STM32F103C8T6这颗芯片主要基于三点考量:
- 72MHz主频足够处理多任务调度
- 内置RTC实时时钟模块(外加纽扣电池备份)
- 多达37个GPIO可扩展外设
注意:采购时要认准"LQFP48"封装版本,市面上有些兼容芯片的ADC精度不达标
2.2 关键外设模块选型
-
药仓检测方案:
- 方案A:红外对管(成本低但易受环境光干扰)
- 方案B:称重传感器(精度高但需要定期校准)
- 最终选择:在每个药仓底部安装微型轻触开关(成本0.3元/个),通过机械结构触发,实测可靠性最佳
-
提醒模块:
- 蜂鸣器:选用SMD贴片型(频率2.7kHz,声压85dB)
- 震动马达:手机同款扁平转子电机
- LED指示灯:RGB三色灯珠,不同颜色区分用药类型
-
通信模块:
- ESP-01S WiFi模块(用于连接家庭路由器)
- 可选配SIM800C GSM模块(无WiFi环境使用)
3. 机械结构设计要点
3.1 药仓分装机构
采用旋转式六格设计,每个药仓容积15ml(约装10片常规药片)。关键创新点在于:
- 3D打印的防潮结构:内层ABS+外层TPU双料打印
- 磁吸式仓盖设计(防止老人用力过猛损坏转轴)
- 倾斜15°的取药口设计(实测这个角度最方便倒出药片)
3.2 装配避坑指南
- 转盘轴承要选用不锈钢材质(塑料轴承三个月就会磨损)
- 所有螺丝必须加装防松弹簧垫片
- 电路板固定建议用尼龙柱+橡胶垫(避免震动导致虚焊)
4. 核心软件逻辑实现
4.1 定时提醒系统
c复制// 用药事件结构体
typedef struct {
uint8_t hour;
uint8_t minute;
uint8_t weekday_mask; // 位域表示周几生效
uint16_t alert_duration; // 提醒持续时间(秒)
} MedicationSchedule;
// 在RTC中断中处理
void RTC_IRQHandler() {
if(RTC_GetITStatus(RTC_IT_SEC) != RESET) {
time_struct current_time = Get_RTC_Time();
Check_Schedule(¤t_time);
RTC_ClearITPendingBit(RTC_IT_SEC);
}
}
关键点:使用RTC的秒中断而非软件定时器,确保时序精确
4.2 用药记录存储
采用循环存储策略,在STM32内部Flash开辟2KB专用区域(地址0x0801F800-0x0801FFFF),每个记录占16字节:
code复制| 日期(4) | 时间(2) | 药仓号(1) | 状态(1) | CRC(8) |
通过CRC校验防止数据异常,实测可存储128条记录,满足一个月追溯需求。
5. 低功耗优化实战
5.1 电源模式配置
c复制void Enter_LowPower_Mode() {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
// 唤醒后需要重新配置系统时钟
SystemInit();
}
5.2 实测功耗数据
| 工作模式 | 电流消耗 | 触发条件 |
|---|---|---|
| 正常运行 | 12mA | 提醒激活状态 |
| 浅睡眠 | 1.2mA | 无操作5分钟后 |
| 深度睡眠 | 200μA | 22:00-6:00时段 |
| 充电状态 | 450mA | 检测到5V电源接入 |
6. 云端交互方案
6.1 通信协议设计
采用MQTT+JSON格式上传数据,示例报文:
json复制{
"device_id": "MED_001",
"timestamp": 1659876543,
"event_type": "reminder",
"compartment": 2,
"status": "missed"
}
6.2 微信小程序关键代码
javascript复制Page({
data: {
medList: []
},
onLoad() {
this.mqttClient = new Paho.MQTT.Client(...);
this.mqttClient.onMessageArrived = (msg) => {
let payload = JSON.parse(msg.payloadString);
this.updateUI(payload);
};
},
updateUI(payload) {
// 更新用药状态显示
}
})
7. 生产测试要点
7.1 老化测试方案
- 转盘寿命测试:连续旋转5万次(约合3年使用)
- 按键测试:每个物理按键按压1万次
- 高低温测试:-20℃~60℃循环24小时
7.2 校准流程
- 称重校准:放入标准砝码记录ADC值
- 时间校准:与NTP服务器自动对时
- 蜂鸣器测试:用分贝计检测85cm距离处声压
这个项目最让我意外的是机械结构的复杂度远超电路设计。在第三版原型机中,我们不得不把药仓壁厚从1.2mm增加到1.8mm,因为测试发现老人经常用力过猛导致开裂。另一个实用技巧是在PCB上预留光电耦合器的位置,实际部署时发现有些养老院的WiFi信号需要中继增强。
