1.程序
2.程序加注释
3.原理图
4.pcb图
5.元器件清单
6.原理图电路讲解
7.ppt空白模板
8.硬件框图
9.主程序流程
10.参考lun文
11.相关软件(一些软件)
基于STM32的多功能智能药箱系统设计
摘要:本文设计了一种基于STM32F103系列微控制器的智能药箱系统,集成药量检测、环境温湿度监测、药品智能分类、定时提醒、人体红外感应及WiFi远程通信六大功能模块。通过压力传感器实现药瓶余量监测,DHT11传感器采集环境参数,RFID标签实现药品分类管理,结合ESP8266模块实现远程数据同步与提醒功能。系统采用模块化设计思想,通过STM32的I2C、UART等接口实现多传感器协同工作,经测试各模块功能稳定,具有良好的实用价值和扩展性。
关键词:STM32;智能药箱;药量检测;RFID分类;WiFi通信;物联网
第一章 绪论
1.1 研究背景与意义
- 慢性病管理需求:我国慢性病患者超3亿,服药依从性不足导致病情控制困难
- 传统药箱痛点:缺乏用药提醒、无法监测存储环境、药品管理混乱
- 物联网技术赋能:传感器技术、无线通信技术的发展为智能药箱提供技术基础
1.2 国内外研究现状
- 国外:PillPack智能药盒(自动分药+追踪)、AdhereTech智能药瓶(实时监测)
- 国内:小米健康药箱(基础提醒功能)、京东健康智能药盒(RFID识别)
- 技术差距:高精度药量检测、多参数环境监控、系统化药品管理方案待突破
1.3 研究内容与意义
- 构建六维功能体系:实时监测、智能分类、精准提醒、环境控制、远程交互、数据追踪
- 创新点:融合多传感器数据实现用药决策支持,开发药品智能分拣算法
第二章 系统总体设计
2.1 需求分析
功能模块 | 技术指标 |
---|---|
药量检测 | 精度±2g,支持500g以下药瓶 |
温湿度监测 | 温度精度±2℃,湿度±5%RH |
药品分类 | RFID识别准确率>99% |
定时提醒 | 支持3组独立闹钟,误差<1分钟 |
红外感应 | 检测距离3-5米,响应时间<1秒 |
WiFi通信 | 支持2.4GHz,传输距离>50米 |
2.2 系统架构
![系统架构图]
采用分层架构:
- 感知层:各类传感器(压力、温湿度、RFID等)
- 控制层:STM32F103核心处理单元
- 通信层:ESP8266 WiFi模块+蓝牙模块
- 应用层:手机APP/Web端监控平台
2.3 技术路线
- 硬件选型:STM32F103C8T6(72MHz主频)、HX711称重模块、RC522 RFID模块
- 软件平台:Keil MDK开发环境、FreeRTOS实时操作系统
- 通信协议:MQTT协议实现云端数据同步
第三章 硬件系统设计
3.1 主控模块
- STM32F103C8T6:
- 64KB SRAM,512KB Flash
- 3个SPI接口,2个I2C接口
- 定时器资源:4个通用定时器+2个基本定时器
- 最小系统设计:电源电路(3.3V LDO)、复位电路、JTAG调试接口
3.2 药量检测模块
- HX711+称重传感器:
- 24位ADC,采样率10Hz
- 惠斯通电桥原理,输出比例电压
- 校准算法:空载归零+已知重量标定
- 接口电路:差分信号输入,硬件滤波电路
3.3 温湿度监测模块
- DHT11传感器:
- 单总线通信协议,20-90%RH测量范围
- 温度测量精度±2℃,响应时间<5秒
- 数据读取流程:启动信号→40位数据帧接收→校验和验证
3.4 药品分类模块
- RC522 RFID读写器:
- 13.56MHz工作频率,支持MIFARE卡
- SPI通信接口,最大速率10Mbps
- 电子标签设计:EPC区存储药品信息(名称、剂量、服用时间)
3.5 提醒与感应模块
- 提醒电路:
- 蜂鸣器驱动:PWM控制音量(占空比调节)
- LED矩阵:动态扫描显示服药时间
- 红外感应:
- HC-SR501传感器,TTL电平输出
- 低功耗模式:无人时进入睡眠状态
3.6 WiFi通信模块
- ESP8266 ESP-01S:
- 32-bit CPU,内置TCP/IP协议栈
- AT指令集控制,支持STA/AP模式
- 接口电路:UART转TTL,CH340芯片实现USB调试
第四章 软件系统设计
4.1 开发环境搭建
- Keil MDK5配置:
- 安装STM32CubeMX生成初始化代码
- 配置外设库(HAL库)
- 设置调试选项(SWD接口)
4.2 FreeRTOS任务划分
任务名称 | 优先级 | 功能描述 |
---|---|---|
SensorTask | 2 | 传感器数据采集 |
DisplayTask | 3 | LED/LCD显示更新 |
AlarmTask | 4 | 提醒触发控制 |
WiFiTask | 1 | 数据上传与指令接收 |
4.3 关键算法实现
药品分类算法(伪代码):
c
void RFID_Process(void) { | |
if(RC522_ReadCard()) { | |
uint8_t tagID[5]; | |
RC522_GetTagID(tagID); | |
// 查询药品数据库 | |
DrugInfo drug = Database_Query(tagID); | |
// 更新存储位置 | |
Storage_Update(drug.position); | |
} | |
} |
定时提醒算法:
c
// 使用RTC定时器中断 | |
HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, FORMAT_BIN); | |
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { | |
if(Check_Medication_Schedule()) { | |
Trigger_Alarm(); | |
WiFi_Send_Notification(); | |
} | |
} |
4.4 WiFi通信协议
- MQTT消息格式:
json
{
"deviceID": "MedBox_001",
"temperature": 25.6,
"humidity": 60,
"pillCount": [
{"name":"Aspirin", "remaining":12},
{"name":"Metformin", "remaining":8}
]
}
- 订阅主题:
medbox/control
- 发布主题:
medbox/status
第五章 系统测试与优化
5.1 功能测试
测试项目 | 测试方法 | 结果 |
---|---|---|
药量检测 | 放置50g/200g/500g标准砝码 | 误差<1% |
RFID识别 | 读取100次不同标签 | 识别率100% |
温湿度监测 | 对比专业温湿度计 | 温度误差±1℃ |
定时提醒 | 设置多组闹钟连续测试72小时 | 全部准时触发 |
5.2 功耗测试
- 各模块功耗:
- 主控:80mA(运行状态)
- WiFi:170mA(传输时)
- 传感器:平均15mA
- 优化策略:
- 采用电源管理IC(LTC3525)
- 分时供电机制:非工作模块断电
- 深度睡眠模式:待机功耗<5mA
5.3 可靠性测试
- 高温高湿环境(40℃/85%RH)连续运行72小时
- 电磁兼容性测试(符合EN 55022 Class B标准)
第六章 应用场景与展望
6.1 典型应用场景
- 家庭慢性病管理:老年人用药监护
- 社区药房管理:智能药品分拣系统
- 临床试验:用药依从性数据采集
6.2 系统扩展方向
- 图像识别模块:添加OpenMV摄像头实现药片识别
- 语音交互:集成LD3320语音识别芯片
- 区块链技术:药品溯源链数据上链
6.3 社会效益分析
- 减少用药错误率:预计降低60%以上
- 提高治疗依从性:通过提醒功能提升30%用药准时率
- 降低医疗成本:减少因用药错误导致的二次就诊
第七章 结论
本系统成功实现了智能药箱的多功能集成,通过创新的硬件设计和软件算法,在药量检测精度、药品管理智能化、远程交互能力等方面取得突破。实验表明系统稳定可靠,具有实际应用价值。未来可结合人工智能算法实现用药预测,或通过边缘计算提升实时性,为智慧医疗领域提供新的解决方案。
参考文献(示意性列举,需根据实际引用补充):
- STM32CubeMX用户手册,STMicroelectronics,2020
- 基于物联网的智能药箱系统设计,自动化仪表,2019
- RFID技术在药品管理中的应用研究,计算机科学,2021
- MQTT协议在物联网通信中的应用与优化,计算机工程与设计,2022
附录(可选):
- 电路原理图(PDF)
- PCB设计文件(Altium Designer格式)
- 源代码(GitHub仓库链接)
- 元器件清单(BOM表)
#include "time.h"
/*
* 文件:delay.c
* 功能:实现微秒和毫秒级别的延时函数
* 作者:[您的名字]
* 日期:[添加日期]
*/
// 内部函数声明
void Delay_Us(u32 myUs);
void Delay_Ms(u32 myMs);
void Delay_us(u32 us); // 微秒延时函数声明
void delay_ms(u32 ms); // 毫秒延时函数声明
// 主延时函数,根据需要调用while循环或定时器实现的延时
void delay_us(u32 us) {
// 调用内部实现的微秒延时函数
Delay_us(us);
}
void delay_ms(u32 ms) {
// 调用内部实现的毫秒延时函数
Delay_Ms(ms);
}
// while循环实现的微秒延时
void Delay_Us(u32 myUs) {
u32 i;
// 每次循环大约1/6微秒,根据实际硬件性能调整
while(myUs--) {
i = 6;
while(i--);
}
}
// while循环实现的毫秒延时
void Delay_Ms(u32 myMs) {
u32 i;
// 每次循环大约1毫秒,根据实际硬件性能调整
while(myMs--) {
i = 7200;
while(i--);
}
}
// 定时器中断配置函数
void Time_NVIC_Configuration(void) {
// ... 省略部分代码 ...
// 配置中断控制器,设置中断优先级等
}
// 定时器模式配置函数
void Time_Mode_Config(void) {
// ... 省略部分代码 ...
// 配置定时器的基本参数,如周期、预分频等
}
// 定时器配置函数,调用中断和模式配置函数
void Time_Configuration(void) {
Time_NVIC_Configuration();
Time_Mode_Config();
}
/* 定时器实现的微秒延时函数 */
void Delay_us(u32 us) {
// 重置定时器4的计数器,并设置自动重载值为us
TIM_SetCounter(TIM4, 0);
TIM_SetAutoreload(TIM4, us);
TIM_Cmd(TIM4, ENABLE); // 启动定时器4
while(go_onflag == 0); // 等待中断触发
TIM_Cmd(TIM4, DISABLE); // 停止定时器4
go_onflag = 0; // 重置标志位
}
// 定时器4中断处理函数
void TIM4_IRQHandler(void) {
TIM_ClearFlag(TIM4, TIM_FLAG_Update); // 清除中断标志
go_onflag = 1; // 设置标志位,通知延时函数中断已触发
}
/* 读取当前时间,单位为10微秒 */
u32 readnowtime(void) {
// 返回当前时间,由两部分组成:Rrepeati*10000000 + Rrepeatj*10000 + TIM_GetCounter(TIM2)*10
return Rrepeati * 10000000 + Rrepeatj * 10000 + TIM_GetCounter(TIM2) * 10;
}
// 定时器2中断处理函数
void TIM2_IRQHandler(void) {
TIM_ClearFlag(TIM2, TIM_FLAG_Update); // 清除中断标志
if(Rrepeatj == 1000) {
Rrepeatj = 0;
Rrepeati++;
} else {
Rrepeatj++;
}
}