1. 项目背景与需求分析
作为一名长期从事嵌入式系统开发的工程师,我最近完成了一个针对老年人和慢性病患者的智能药盒项目。这个项目的初衷源于我亲眼目睹家中长辈因记忆力衰退而频繁出现漏服药物的情况。市面上的普通药盒功能单一,而进口智能药盒价格昂贵且操作复杂,这促使我决定开发一款性价比高、操作简便的本地化解决方案。
在需求调研阶段,我走访了多家养老院和社区卫生中心,发现服药管理存在几个普遍痛点:首先是漏服问题,约68%的老年人每周至少漏服一次药物;其次是错服,特别是需要同时服用多种药物时;再者是家属无法实时掌握老人的服药情况。这些发现直接影响了我的设计方向,决定在基础提醒功能之外,加入药品存量监测和远程通知功能。
2. 硬件系统架构设计
2.1 核心控制器选型
经过对比STM32F1和F4系列,最终选择了STM32F103C8T6作为主控芯片。这款芯片的性价比极高(市场价约15元),具有72MHz主频、64KB Flash和20KB RAM,完全满足实时控制需求。更重要的是其丰富的外设接口:
- 3个USART(分别用于调试、WiFi模块和预留扩展)
- 2个SPI接口(连接显示屏和HX711)
- 1个I2C接口(备用)
- 16通道12位ADC(用于压力传感器)
实际开发中发现,F103的GPIO中断响应时间<1μs,这对实时检测取药动作至关重要。我曾尝试用软件轮询方式,但会导致系统响应延迟明显增加。
2.2 传感器模块实现细节
2.2.1 药品检测方案对比
测试了三种检测方案后,最终采用复合检测机制:
-
称重模块:HX711+5kg量程称重传感器(精度±0.1g)
- 需注意安装时要保持水平,我使用3D打印的支架固定
- 校准公式:实际重量 = (原始值 - 空载偏移) / 比例系数
-
红外对管:槽型光电开关(ITR9909)
- 安装位置距离药仓出口2cm处
- 实测抗环境光干扰能力达50000lux
-
薄膜压力传感器:FlexiForce A201(量程100lb)
- 粘贴在药仓底部,通过分压电路接入ADC
- 需做非线性补偿:Vout = 1.23*(R/R0)^0.85
2.2.2 环境监测模块
选用DHT22替代原计划的DHT11,虽然成本高3元但精度提升明显:
- 温度精度±0.5℃(DHT11为±2℃)
- 湿度精度±2%(DHT11为±5%)
- 特别重要对于硝酸甘油等温度敏感药物
2.3 执行机构设计
药仓门采用推拉式设计,由SG90舵机(9g扭矩)通过齿轮齿条驱动。经过20次开合测试发现:
- 普通舵机在连续工作3天后会出现扭矩下降
- 改用金属齿轮舵机(MG996R)后寿命提升至6个月以上
- 功耗优化:待机时PWM占空比降至5%仍能保持位置
3. 软件系统实现
3.1 系统状态机设计
采用分层状态机架构,核心状态包括:
c复制typedef enum {
STATE_IDLE, // 待机状态
STATE_ALERT, // 提醒状态
STATE_DISPENSING, // 取药中
STATE_UPDATING, // 数据上传
STATE_CONFIG // 配置模式
} SystemState;
每个状态下的关键处理:
-
IDLE状态:
- 每5分钟检查一次RTC时间
- 温度超过阈值时启动风扇(通过MOSFET控制)
-
ALERT状态:
- 蜂鸣器采用"三短一长"提醒模式(符合GB/T 191标准)
- 若10分钟未取药,通过ESP8266发送短信提醒
3.2 称重算法优化
原始采集数据存在明显抖动,采用三级滤波:
- 硬件RC滤波(截止频率10Hz)
- 软件滑动平均(窗口大小=8)
- 中值滤波(采样5次取中间值)
最终实现的稳定检测算法:
c复制float get_medicine_weight() {
static float history[8] = {0};
float raw = HX711_Read();
// 滑动平均计算
float sum = 0;
for(int i=7; i>0; i--) {
history[i] = history[i-1];
sum += history[i];
}
history[0] = raw;
sum += raw;
return sum/8 * calibration_factor;
}
3.3 WiFi通信协议
采用MQTT协议而非HTTP,优势在于:
- 功耗降低40%(实测数据)
- 断网自动重连
- 支持QoS1保证消息必达
关键配置参数:
ini复制# ESP8266 AT指令配置
AT+CWMODE=1
AT+CWJAP="SSID","password"
AT+MQTTUSERCFG=0,1,"clientID","","",0,0,""
AT+MQTTCONN=0,"broker.url",1883,1
4. 实测问题与解决方案
4.1 电磁干扰问题
初期测试发现称重数据在舵机动作时异常:
- 根源:电机反电动势干扰电源
- 解决方案:
- 在电机两端并联1N5819续流二极管
- 电源走线加磁珠滤波(BLM18PG221SN1)
- ADC基准源改用TL431独立供电
4.2 低功耗优化
原设计待机电流达35mA,通过以下措施降至8mA:
- 外设分时供电(使用MOSFET开关)
- STM32进入Stop模式(RTC保持运行)
- 显示屏改为按需刷新(从60Hz降至1Hz)
4.3 用户界面改进
老年人反馈字体太小,最终方案:
- OLED改用16x16点阵汉字(原为8x16)
- 增加高对比度模式(反色显示)
- 按键加大到15mm直径并带触觉反馈
5. 生产注意事项
经过小批量试产(50台),总结出以下经验:
- 外壳开模要预留0.3mm装配余量
- 红外对管需加遮光罩避免串扰
- 称重传感器固定要用弹性胶垫
- 电池仓设计要防反接(物理结构限制)
成本分析(1000台规模):
- BOM成本:¥87.5/台
- 生产测试耗时:12分钟/台
- 良品率:首次93%,优化后达98%
这个项目从原型到量产历时9个月,最深的体会是:医疗级设备必须考虑极端使用场景。比如我们模拟了10000次药仓开合测试,发现塑料齿轮在第8234次时出现磨损,这促使我们最终选择了金属齿轮方案。在嵌入式系统开发中,这种实打实的耐久性测试往往比代码优化更重要。
