1. 项目概述:基于STM32的智能药盒设计
作为一名嵌入式开发工程师,我最近完成了一个针对老年人和慢性病患者的智能药盒项目。这个药盒不仅能定时提醒服药,还能实时监测药量,并通过无线方式将数据同步到手机APP。在实际开发过程中,我发现市面上很多类似产品要么功能单一,要么价格昂贵,于是决定自己设计一套高性价比的解决方案。
这个项目最核心的价值在于解决了三个实际问题:一是避免漏服药物,二是实时掌握药品存量,三是建立服药记录档案。通过STM32单片机作为主控,配合各类传感器和通信模块,我们实现了这些功能的同时,还将成本控制在200元以内。
2. 硬件系统设计
2.1 主控芯片选型
经过对比测试,我最终选择了STM32F103C8T6作为主控芯片,这款芯片在性价比方面表现突出:
- 72MHz主频的Cortex-M3内核,处理性能足够
- 64KB Flash + 20KB SRAM,满足程序存储需求
- 丰富的GPIO和外设接口(3个USART、2个SPI、2个I2C)
- 内置12位ADC,可直接连接传感器
- 低功耗模式支持,适合电池供电场景
提示:如果预算充足,可以考虑STM32L系列的低功耗型号,但F103已经能满足大部分需求。
2.2 传感器选型与电路设计
药量检测是项目的核心功能,我们测试了两种主流方案:
方案一:HX711称重模块
- 24位高精度ADC
- 最大支持5kg量程
- 分辨率可达0.01g
- 需要配合应变片使用
电路连接方式:
code复制HX711_DOUT -> PA0 (STM32)
HX711_SCK -> PA1 (STM32)
方案二:红外对管计数
- TCRT5000红外反射传感器
- 通过药品通过时的遮挡计数
- 适合颗粒状药品
- 成本更低但精度较差
实际测试发现,对于片剂药品,称重方案更准确可靠。我们在PCB上设计了专门的传感器接口,方便两种方案切换使用。
2.3 外围模块配置
完整的硬件系统包含以下模块:
| 模块类型 | 具体型号 | 主要参数 | 接口方式 |
|---|---|---|---|
| 显示模块 | 0.96寸OLED | 128x64分辨率 | I2C |
| 时钟模块 | DS3231 | ±2ppm精度 | I2C |
| 无线模块 | ESP-01S | 802.11 b/g/n | UART |
| 电源管理 | TP4056 | 1A充电电流 | - |
| 提醒装置 | 有源蜂鸣器 | 3-5V工作电压 | GPIO |
3. 软件系统实现
3.1 系统架构设计
整个软件系统采用分层架构:
- 硬件驱动层:负责各外设的初始化和基础操作
- 功能模块层:实现药量检测、定时提醒等核心功能
- 应用逻辑层:处理用户交互和业务逻辑
- 通信协议层:管理无线数据传输
3.2 关键算法实现
药量检测算法:
c复制#define SAMPLE_COUNT 10 // 采样次数
float get_medicine_weight() {
float sum = 0;
for(int i=0; i<SAMPLE_COUNT; i++){
sum += HX711_Read();
delay_ms(10);
}
float avg = sum/SAMPLE_COUNT;
return (avg - zero_offset) * scale_factor; // 校准计算
}
定时提醒处理:
c复制void check_alarm() {
RTC_TimeTypeDef current_time;
HAL_RTC_GetTime(&hrtc, ¤t_time, RTC_FORMAT_BIN);
for(int i=0; i<MAX_ALARMS; i++){
if(alarms[i].enabled &&
alarms[i].hour == current_time.Hours &&
alarms[i].min == current_time.Minutes){
trigger_alarm();
break;
}
}
}
3.3 低功耗优化
通过以下措施显著降低功耗:
- 主循环中加入休眠处理:
c复制void main_loop() {
while(1) {
if(need_process){
// 处理业务逻辑
need_process = 0;
} else {
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}
}
}
- 外设电源管理:
- 显示屏在不操作时关闭
- 无线模块仅在数据传输时唤醒
- 传感器采用间歇工作模式
- 时钟配置优化:
- 降低主频至48MHz
- 关闭不用的外设时钟
4. 通信协议设计
4.1 数据帧格式
我们设计了简单的通信协议与手机APP交互:
code复制[HEADER][LEN][CMD][DATA][CRC]
0x55AA 1B 1B N 2B
典型数据包示例:
- 同步时间:55 AA 06 01 20 23 05 15 30 00 XX XX
- 上报药量:55 AA 05 02 03 E8 00 XX XX
4.2 ESP8266固件配置
使用AT指令配置WiFi模块:
bash复制AT+CWMODE=1 // Station模式
AT+CWJAP="SSID","PASSWORD" // 连接WiFi
AT+CIPSTART="TCP","192.168.1.100",8080 // 连接服务器
AT+CIPMODE=1 // 透传模式
AT+CIPSEND // 开始发送
5. 实际应用中的问题与解决方案
5.1 传感器校准问题
初期测试发现称重数据波动较大,通过以下改进解决:
- 硬件方面:
- 增加传感器固定稳定性
- 添加滤波电容
- 使用屏蔽线连接
- 软件方面:
- 采用滑动平均滤波算法
- 自动零位跟踪
- 温度补偿算法
5.2 无线连接稳定性
在复杂环境中,WiFi连接容易中断,我们采取以下措施:
- 增加重连机制:
c复制void wifi_reconnect() {
static uint32_t last_try = 0;
if(HAL_GetTick() - last_try > 30000) {
ESP8266_Init();
last_try = HAL_GetTick();
}
}
- 优化天线设计:
- 采用PCB天线替代贴片天线
- 调整天线匹配电路
- 避免金属外壳屏蔽
5.3 电源管理优化
实测发现电池续航不足预期,通过以下改进提升:
- 电流消耗分析:
- 正常工作:15mA
- 无线传输:80mA
- 休眠状态:0.5mA
- 改进措施:
- 优化休眠策略(延长休眠时间)
- 降低无线传输频率
- 添加太阳能充电接口
6. 产品化考虑
6.1 外壳设计要点
经过多次迭代,我们确定了以下设计原则:
- 人体工程学:
- 大字体显示
- 易按的物理按键
- 防滑底座设计
- 结构设计:
- 药盒分格设计
- 防潮密封处理
- 易开合结构
6.2 生产工艺建议
小批量生产时需要注意:
- PCB设计:
- 增加测试点
- 优化元件布局
- 考虑组装便利性
- 质量控制:
- 传感器校准流程
- 老化测试方案
- 防水防尘测试
7. 扩展功能实现
7.1 多用户支持
通过APP可以管理多个药盒:
- 设备绑定机制:
- 每个药盒有唯一ID
- 扫码快速绑定
- 权限分级管理
- 数据同步:
- 云端存储服药记录
- 异常情况提醒
- 长期趋势分析
7.2 语音交互集成
添加SYN6288语音模块实现:
- 语音提示内容:
- 服药提醒
- 药量不足警告
- 操作反馈
- 实现代码:
c复制void speak(const char *text) {
UART_Send("5A A5 [长度] 01 [文本]");
// 等待语音播放完成
while(!voice_idle);
}
在实际开发中,我发现智能药盒的设计需要特别注重用户体验。比如,提醒音量要足够大但又不能太刺耳,药盒开合要方便老年人操作,显示信息要简洁明了。这些细节往往比技术实现更具挑战性。
硬件设计上最大的教训是不要低估环境因素的影响。我们第一版产品在潮湿环境下传感器读数严重漂移,后来不得不重新设计密封结构和改进算法。另一个重要经验是低功耗设计要尽早考虑,等硬件定型后再优化往往事倍功半。