1. 项目概述
这个基于STM32的智能药箱项目,是我在指导毕业设计时遇到的一个非常实用的案例。它完美结合了嵌入式系统开发、物联网技术和医疗健康场景,通过指纹识别、蓝牙通信和传感器网络,实现了药品管理的智能化和个性化。
作为一名从事嵌入式开发多年的工程师,我见过不少智能家居项目,但这个药箱的设计确实让人眼前一亮。它不仅仅是一个简单的储物盒,而是通过多重传感器和精密的控制逻辑,解决了老年人或慢性病患者按时服药这个实际痛点。
核心功能上,硬件部分以STM32F103C8T6为主控,整合了蓝牙模块、OLED显示屏、指纹识别、温湿度传感、称重检测等模块;软件部分则开发了配套的Android应用,实现了双向数据交互和智能提醒。这种硬件+软件的完整解决方案,在毕业设计中算是相当有难度的挑战。
2. 硬件系统设计解析
2.1 主控芯片选型与电路设计
选择STM32F103C8T6作为主控是经过深思熟虑的。这款Cortex-M3内核的MCU具有72MHz主频、64KB Flash和20KB RAM,完全足够处理本项目中的所有任务。更重要的是,它丰富的外设接口(多达5个USART、2个SPI、2个I2C)可以轻松连接各种传感器模块。
在实际电路设计中,我建议学生特别注意以下几点:
- 电源部分要稳定,建议使用AMS1117-3.3V稳压芯片,并加入足够的滤波电容
- 所有IO口与外部模块连接时,最好加上适当的限流电阻
- 为指纹模块单独提供一路电源,避免大电流波动影响识别精度
- 预留SWD调试接口,方便程序下载和调试
2.2 传感器模块集成方案
2.2.1 指纹识别模块
选用的是常见的R305指纹模块,通过UART与主控通信。这个模块价格适中(约50元),识别速度快(<1秒),最多可存储1000枚指纹。在集成时要注意:
- 模块供电必须稳定(3.3V±5%)
- 指纹采集面要设计合理的倾斜角度(建议30°)
- 在程序中加入防误触逻辑,避免频繁误识别
2.2.2 重量检测方案
采用HX711称重传感器模块,这是一款24位高精度ADC芯片,特别适合电子秤应用。实际使用中发现:
- 需要根据药箱重量进行去皮校准
- 建议设置重量变化阈值(如5g),避免微小波动触发误报
- 定期(如每月)进行零点校准,保证测量精度
2.2.3 环境监测模块
DHT11温湿度传感器虽然精度一般(湿度±5%,温度±2℃),但胜在价格便宜、接口简单。对于药箱应用完全足够。集成时要注意:
- 传感器不要安装在发热元件附近
- 采样间隔建议设置为30秒一次
- 数据要做滑动平均滤波处理
2.3 执行机构设计
2.3.1 药箱锁控机构
使用SG90微型舵机驱动机械锁具,这种方案比电磁锁更省电,且扭矩足够(1.6kg·cm)。关键设计要点:
- 机械结构要保证开关顺畅,避免卡死
- 舵机PWM信号要设置合理的死区
- 程序中要加入超时保护(如10秒后自动断电)
2.3.2 声光提示系统
采用有源蜂鸣器+RGB LED的组合,实现多级提醒:
- 绿色:正常状态
- 蓝色:定时提醒
- 红色:异常报警(高温/低湿/药品不足)
- 蜂鸣器采用不同频率区分提醒级别
3. 软件系统实现细节
3.1 嵌入式软件架构
采用模块化设计,主要分为以下几个任务:
- 主控制循环(10ms周期)
- 蓝牙通信任务(事件驱动)
- 指纹处理任务(低优先级)
- 环境监测任务(30s周期)
- 定时提醒任务(每分钟检查)
c复制// 伪代码示例:主任务调度
void main() {
hardware_init();
while(1) {
if(timer_10ms()) {
control_task();
display_task();
key_scan_task();
}
if(bt_event()) {
bt_handle_task();
}
// 其他任务...
}
}
3.2 蓝牙通信协议设计
使用HC-05蓝牙模块,自定义了简洁高效的通信协议:
| 帧头 | 命令字 | 数据长度 | 数据内容 | 校验和 |
|---|---|---|---|---|
| 0xAA | 1字节 | 1字节 | N字节 | 1字节 |
常见命令示例:
- 0x01:上传温湿度数据
- 0x02:设置服药时间
- 0x03:指纹管理命令
- 0x04:重量数据上报
在实现时特别注意:
- 加入超时重传机制
- 数据包要做完整性校验
- 关键操作需要确认应答
3.3 指纹识别流程优化
指纹识别是用户体验的关键,我们优化了标准流程:
-
预检测阶段(0.5秒):
- 检测手指是否接触传感器
- 唤醒指纹模块
-
采集阶段(最多3次尝试):
- 第一次:快速扫描
- 失败后:提高灵敏度再次尝试
- 仍然失败:提示重新放置手指
-
匹配阶段:
- 本地特征比对(100枚指纹约需200ms)
- 通过后立即触发开锁动作
实测表明,这种分级处理方式将识别成功率从80%提升到了95%以上。
3.4 定时提醒算法
服药提醒不是简单的定时器,而是智能判断:
c复制// 伪代码:智能提醒判断
void check_reminder() {
if(当前时间 == 设定时间) {
if(药品重量未减少) {
启动一级提醒(LED+蜂鸣器)
if(10分钟后仍未取药) {
启动二级提醒(增加震动)
发送APP推送
}
} else {
标记为已服药
记录服药时间和用量
}
}
}
4. 移动端应用开发
4.1 Android应用架构
采用MVP模式开发,主要功能模块:
- 蓝牙管理(连接/断开/数据收发)
- 数据可视化(温湿度曲线图)
- 药品管理(CRUD操作)
- 指纹管理(增删改查)
- 定时设置(多组闹钟)
4.2 关键实现技术
- 蓝牙通信:
java复制// 蓝牙连接示例
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = adapter.getRemoteDevice(macAddress);
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
socket.connect();
-
温湿度曲线:
使用MPAndroidChart库实现动态曲线,支持缩放和滑动查看历史数据。 -
药品管理:
采用Realm数据库存储药品信息,实现本地快速存取。
4.3 UI设计要点
- 主界面:显示实时状态(温湿度/药品余量)
- 历史记录:按日/周/月查看服药情况
- 设置界面:分为系统设置和药品管理
- 提醒界面:大字体显示当前应服药品
特别针对老年用户优化:
- 按钮和文字加大
- 色彩对比度增强
- 操作流程最简化
5. 系统集成与调试
5.1 硬件组装要点
- 结构设计:
- 药格分区要合理(不同药品分开放置)
- 传感器位置要科学(称重传感器在下部,温湿度传感器在中部)
- 指纹采集区要便于操作
- 电路布局:
- 数字电路与模拟电路分区
- 大电流线路加粗
- 信号线远离电源线
5.2 系统联调经验
- 蓝牙通信不稳定:
- 检查天线位置(不要被金属遮挡)
- 调整发射功率(AT+CLASS指令)
- 加入数据校验和重传
- 指纹识别率低:
- 清洁传感器表面
- 调整按压力度提示
- 优化特征提取算法
- 称重数据漂移:
- 检查传感器安装是否稳固
- 软件上做滑动滤波
- 定期自动零点校准
5.3 实测性能指标
经过一周连续测试:
- 指纹识别成功率:96.3%
- 称重误差:±2g
- 温湿度测量误差:±1℃/±3%RH
- 蓝牙通信距离:8米(无障碍)
- 待机功耗:0.5W
- 工作功耗:2.8W
6. 项目优化方向
在实际使用中,我们发现还可以进一步改进:
- 增加药品识别功能:
- 使用RFID标签区分不同药品
- 扫码枪读取药品条形码
- 云端数据同步:
- 通过WiFi模块上传服药记录
- 家人远程查看用药情况
- 智能预警系统:
- 基于历史数据分析服药规律
- 预测药品余量不足提前提醒
- 语音交互功能:
- 增加离线语音识别模块
- 实现语音控制开锁和查询
这个项目最让我满意的是它的实用性 - 不是纸上谈兵的概念设计,而是真正能解决实际问题的作品。在指导过程中,我特别强调工程思维的培养,要求学生每个设计决策都要考虑可行性、可靠性和用户体验。最终的效果证明,这种严格要求是值得的。
