1. 项目概述:当传统药盒遇上智能科技
作为一名电子爱好者,我最近帮家里老人改造了一个普通药盒,让它具备了药量检测和定时提醒功能。这个基于51单片机的智能药盒,核心解决了两个痛点:一是忘记按时吃药的问题,二是无法直观掌握剩余药量。传统方案要么只有简单闹钟功能,要么采用昂贵的传感器,而我的方案成本控制在50元以内,实测提醒准确率达到100%,药量检测误差小于5%。
这个项目特别适合两类人群:一是需要长期服药的慢性病患者(如高血压、糖尿病患者),二是工作繁忙容易忘记吃药的上班族。整个系统由STC89C52RC单片机作为控制核心,配合压力传感器、LCD显示屏和蜂鸣器模块组成。当到达预设服药时间时,系统会通过声光提醒;每次取药后,压力传感器会自动检测剩余药量,并在存量不足时提前预警。
提示:选择51单片机不仅因为其价格低廉(通常不到10元),更重要的是其成熟的开发环境和丰富的学习资源,特别适合电子入门者练手。
2. 硬件设计与核心元件选型
2.1 主控芯片:为什么还是选择51单片机?
在这个ARM Cortex-M系列大行其道的时代,我依然选择了经典的STC89C52RC单片机,主要基于三点考虑:
- 成本控制:整套系统BOM成本可以控制在50元以内,其中单片机仅需6-8元
- 开发效率:51架构的Keil开发环境成熟稳定,烧录程序只需一根USB转TTL线
- 资源足够:药盒功能逻辑简单,8K Flash和512B RAM完全够用
具体电路设计中,特别注意了以下几点:
- 在P0口接10K上拉电阻保证IO驱动能力
- 晶振选用11.0592MHz,方便串口通信波特率计算
- 复位电路采用10uF电容+10K电阻的经典组合
2.2 药量检测模块的选型对比
药量检测是本项目的核心难点,我测试了三种常见方案:
| 方案类型 | 代表型号 | 精度 | 成本 | 适用性 |
|---|---|---|---|---|
| 压力传感器 | HX711+应变片 | ±1g | 15元 | 最佳 |
| 红外对管 | TCRT5000 | ±5g | 5元 | 较差 |
| 称重模块 | 5kg量程 | ±0.1g | 30元 | 过度 |
最终选择HX711+铝合金应变片的组合,原因在于:
- 应变片粘贴在药盒底部,对原有结构改动最小
- HX711自带24位ADC,无需额外模数转换电路
- 通过软件校准可以消除容器自重影响
注意:应变片安装时要使用专用胶水,并且等待24小时完全固化后再校准,否则会出现零点漂移问题。
2.3 人机交互设计细节
为了让老年人也能轻松使用,人机交互做了特殊优化:
- 采用12864液晶屏(带中文字库),避免数码管需要记忆编码的问题
- 设置三个物理按键(功能、加、减),按键直径做到12mm便于操作
- 蜂鸣器增加脉冲调制功能,既能保证提醒效果又不会太刺耳
- 加入LED呼吸灯效果,通过视觉强化提醒
电源部分选用18650锂电池(配TP4056充电模块),实测待机电流仅1.2mA,充满后可连续工作30天以上。在PCB布局时,特别注意将高频元件(晶振)远离模拟信号走线(HX711),避免相互干扰。
3. 软件系统设计与关键算法
3.1 主程序流程图设计
系统软件采用时间片轮询架构,确保各功能模块都能及时响应。下面是核心逻辑流程:
c复制void main() {
init_all(); // 硬件初始化
load_config(); // 读取存储的服药时间
while(1) {
check_time(); // 检测是否到达服药时间
check_weight(); // 检测当前药量
handle_key(); // 处理按键输入
update_display(); // 刷新屏幕显示
delay_ms(100); // 适当延时防止CPU过载
}
}
定时检测采用单片机内置定时器中断实现,设置1秒触发一次,在中断服务程序中更新时间变量。这里特别注意要声明时间变量为volatile类型,避免编译器优化导致时间不准。
3.2 药量检测的软件校准算法
药量检测的准确性直接影响用户体验,我开发了三级校准机制:
- 去皮校准:空盒时按下功能键3秒,系统记录当前AD值作为零点
- 满量程校准:放入已知重量(如100g砝码),记录AD差值
- 线性补偿:通过最小二乘法拟合AD-重量曲线,存储在EEPROM
实际测量时的重量计算公式:
code复制实际重量 = (当前AD值 - 零点AD值) * 系数K + 温度补偿
其中系数K通过满量程校准获得,温度补偿值则根据环境温度动态调整(DS18B20采集)。实测表明,这套算法可将误差控制在3%以内,完全满足日常用药需求。
3.3 服药提醒的状态机设计
提醒逻辑采用有限状态机实现,包含以下几个状态:
- 待机状态:正常显示时间/药量
- 预提醒:提前5分钟闪烁LED
- 主提醒:蜂鸣器响+屏幕高亮
- 延时状态:若10分钟内未取药,提醒强度升级
- 跳过状态:手动跳过后记录异常事件
状态转换通过事件驱动,主要事件包括:时间到达、按键操作、药量变化等。在代码实现上,每个状态对应一个处理函数,通过全局变量current_state指示当前状态。
4. 制作过程与调试技巧
4.1 PCB设计与装配要点
我采用双层板设计,关键布局策略:
- 数字区域(单片机、晶振)与模拟区域(HX711、传感器)分居PCB两侧
- 电源走线宽度不小于0.5mm,数字地模拟地单点连接
- 所有IO口预留排针,方便后期功能扩展
装配顺序建议:
- 先焊接最小系统(单片机+晶振+复位)
- 然后焊接电源模块(稳压芯片+滤波电容)
- 接着安装显示接口和按键
- 最后连接传感器模块
重要提示:HX711的DVDD引脚需要接0.1uF去耦电容,否则可能出现AD值跳动大的问题。
4.2 传感器安装的实用技巧
药盒结构改造是项目实施的关键,分享几个实测有效的技巧:
- 应变片粘贴:使用AB胶先薄涂一层,用热风枪60℃预热30秒后再贴合
- 导线固定:传感器引线要用热熔胶分段固定,避免拉扯导致接触不良
- 机械保护:在应变片上方加装1mm厚亚克力板,分散压力避免过载
- 环境隔离:在药盒内衬食品级硅胶垫,既卫生又能缓冲震动干扰
调试时发现,药片取出时的振动会导致AD值短暂突变。通过软件加入50ms延迟检测和滑动平均滤波后,成功解决了误检测问题。
4.3 系统校准的标准化流程
为确保测量一致性,建议按以下步骤校准:
- 空盒状态下,执行"去皮"操作(长按功能键)
- 放入标准砝码(如100g),输入实际值进行满量程校准
- 在不同温度下(10℃、25℃、40℃)重复上述过程,建立温度补偿表
- 用不同重量(20g、50g、80g)验证线性度,必要时调整拟合参数
校准数据保存在单片机的EEPROM中,即使断电也不会丢失。为方便用户,我在程序中设置了校准向导模式,通过屏幕提示引导完成整个过程。
5. 常见问题与解决方案
5.1 药量检测不准确的排查方法
根据实战经验,整理出以下排查清单:
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 显示重量为0 | 应变片开路 | 检查焊点,更换传感器 |
| 数值跳动大 | 电源干扰 | 加强滤波,缩短传感器引线 |
| 线性度差 | 机械结构变形 | 加固支撑点,重新粘贴应变片 |
| 温度漂移 | 未启用温补 | 连接DS18B20,开启温度补偿 |
特别提醒:当环境温度变化超过10℃时,建议重新执行去皮操作,避免累积误差。
5.2 定时不准的深度优化
如果发现每天有超过10秒的时间误差,可以尝试以下方法:
-
硬件层面:
- 更换更高精度的晶振(如±10ppm)
- 在晶振引脚添加30pF匹配电容
- 远离发热源(如LDO稳压芯片)
-
软件层面:
- 启用定时器自动重装载模式
- 加入闰秒补偿算法
- 定期与RTC模块(如DS1302)同步
我实测发现,通过软件补偿可以将月误差控制在30秒以内,完全满足用药提醒的需求。
5.3 低功耗设计的实践心得
为延长电池续航,我采取了以下措施:
- 平时让单片机工作在空闲模式(IDLE),仅定时器保持运行
- LCD背光采用PWM控制,非操作状态调至30%亮度
- 按键唤醒采用下降沿中断,避免轮询耗电
- 将未使用的IO口设置为输出低电平
通过上述优化,系统平均工作电流从8mA降至1.5mA。配合2000mAh的18650电池,理论待机时间从10天提升至55天。实际测试中,连续工作一个月后仍有35%电量。
6. 功能扩展与改进方向
目前的原型机已经稳定运行三个月,根据实际使用反馈,下一步计划加入以下功能:
- 蓝牙连接:通过HC-05模块同步用药记录到手机
- 语音提醒:添加WT588D芯片支持语音播报
- 多舱室管理:扩展为4个独立检测舱,满足复方药剂需求
- 云端备份:通过ESP8266上传数据到私有服务器
一个意外的收获是,压力传感器数据可以反映用户的取药习惯。通过分析这些数据,能够发现如"经常跳过晚餐后用药"等行为模式,为后续的健康管理功能打下基础。
在材料选择上,正在测试医用级ABS塑料外壳,相比现在的3D打印结构,具有更好的密封性和抗老化性能。同时也在评估电容式触摸按键替代物理按键的可能性,进一步提升产品的防水等级。