在这里插入图片描述

一、项目介绍

智能药盒SoC系统的设计与用药依从性监测实现
摘 要
针对慢性病患者居家用药依从性不足、用药过程缺乏监管、药品储存环境无法实时监测等问题,本文设计并实现了一种以STM32F411CEU6为控制核心的智能药盒SoC系统。系统选用SHT30数字温湿度传感器采集药盒环境参数,HX711称重传感器检测服药重量,声光报警器实现服药提醒,按键模块完成服药确认,TFTLCD液晶显示屏实现本地数据显示,ESP8266 WIFI模块将监测数据实时上报至物联网云平台。论文依次完成系统总体方案设计、硬件电路设计、软件程序设计,采用模块化思路开发各功能模块,通过硬件测试、软件测试和系统整体测试验证系统性能。测试结果表明,该系统能精准采集温湿度、服药重量数据,稳定实现服药提醒、数据上传与本地显示功能,服药数据记录准确,可有效提升患者用药依从性,满足慢性病患者居家用药监测需求,具有良好的实用性和应用价值。

关键词:智能药盒;STM32F411CEU6;用药依从性;物联网;数据监测

研究内容与技术路线
本次研究的核心内容,是完成以 STM32F411CEU6 为控制核心的智能药盒 SoC 系统的设计与实现,一是系统总体方案的设计,结合项目的需求,完成了系统的总体架构和功能模块的划分,明确了主控单元、传感器模块、通信模块和显示模块的功能和连接方式,二是硬件电路的设计,完成了 STM32 主控电路、SHT30 温湿度传感器电路、HX711 称重传感器电路、ESP8266 通信电路、TFTLCD 显示电路和声光报警电路的设计与调试,三是软件程序的设计,完成了主控单元的程序编写,实现了传感器数据的采集与处理、服药提醒的触发与控制、按键确认与数据上传、本地显示与云端数据交互等功能,四是系统的整体测试,对系统的硬件电路、软件模块和整体功能进行了测试,验证了系统的稳定性和可靠性。
本次研究的技术路线,是从需求分析出发,先完成系统的总体方案设计和器件选型,再分别开展硬件电路的设计与制作、软件程序的编写与调试,最后进行系统的整体测试和优化,具体来说,首先通过需求分析明确了系统需要实现的功能,然后完成了系统的总体架构设计和核心器件的选型,接着分别进行了硬件电路的原理图设计和 PCB 绘制,以及软件程序的模块化编写与调试,之后将硬件和软件进行了联合调试,完成了系统的整体功能测试,最后对系统的不足进行了分析,并提出了后续的优化方向。

系统需求分析
本次智能药盒 SoC 系统的设计,是围绕慢性病患者居家用药场景的实际痛点来开展的,整体需求可以分为功能需求、性能需求和应用场景适配需求这几个方面,来进行梳理。
一是核心功能需求方面,系统需要实现基础的服药提醒与用药依从性监测功能,用户可以在物联网云平台上设置服药提醒的间隔时间,间隔时间能同步到本地的 TFTLCD 显示屏上显示,当设定的提醒时间到了之后,声光报警器会自动响起,以此来提醒用户按时服药,用户服药完成后,需要通过按键模块来确认服药动作,系统会把服药的时间、药品的重量变化数据,还有药盒内的温湿度环境数据一起上传到云平台,平台上会记录每一次的服药记录,方便用户和医护人员后续查看,同时系统还需要能实时采集药盒内的温湿度数据,通过 TFTLCD 屏幕本地显示出来,避免药品因为储存环境温湿度超标而出现变质的问题。
二是性能需求方面,系统需要保证数据采集的稳定性和准确性,温湿度数据的采集误差要控制在合理范围内,称重模块需要能精准识别服药前后的重量变化,以此来判断用户是否完成了服药动作,同时 ESP8266 WIFI 模块需要能稳定连接网络,确保服药数据可以实时上传到云平台,不会出现数据丢失或者延迟过高的情况,主控单元需要能同时处理多个模块的数据交互,在运行时不会出现卡顿或者死机的问题,声光报警器的提醒音量也要能满足居家环境的使用需求,保证用户可以及时接收到提醒信号。
三是应用场景适配需求方面,系统的硬件电路需要具备一定的稳定性和抗干扰能力,能适应家庭环境下的日常使用,TFTLCD 显示屏的显示内容要简洁易懂,方便老年用户查看服药提醒和环境数据,按键模块的操作逻辑也要尽量简化,用户只需要按下按键就能完成服药确认的操作,系统的整体功耗也要控制在较低水平,以此来延长设备的续航时间,方便用户日常使用和维护。
整体来看,本次系统的需求,就是要打造一个集服药提醒、用药记录、环境监测、数据上传于一体的智能药盒系统,以此来解决慢性病患者用药依从性不足、用药过程缺乏监管、药品储存环境无法监测等实际问题,为居家用药场景提供可靠的技术支撑。

系统总体架构设计
结合本次智能药盒SoC系统的功能需求和应用场景,我把整个系统的总体架构设计成了分层结构,这样的设计能让各模块的功能划分更清晰,后续的硬件制作、软件编写和系统调试也能更方便,还能提高系统的可扩展性和可维护性,整个架构从上到下依次分为物联网云平台层、通信传输层、主控核心层、外设模块层这四个部分,各层之间相互配合、协同工作,共同完成系统的各项功能,下面我就对每一层的具体设计和功能实现做详细的说明。
最上层是物联网云平台层,它是整个系统的数据管理和远程控制中心,主要负责接收和存储系统上传的各类数据,还能实现用户的远程操作和设置,用户通过云平台就能完成服药提醒间隔时间的设置,设置好的间隔时间会通过后续的通信层同步到本地主控单元,再显示到TFTLCD屏幕上,同时云平台还会实时接收主控单元上传的服药时间、药盒内温湿度数据、药品重量变化数据等,把这些数据进行整理和存储,形成完整的用药记录,用户和医护人员随时都能登录云平台查看这些记录,了解患者的用药情况,除此之外,云平台还具备数据异常提醒功能,如果药盒内的温湿度超标,或者到了设定的服药时间用户没有完成服药操作,云平台就会发出提醒信号,及时告知用户和医护人员,避免出现药品变质或者漏服的情况。
中间层是通信传输层,这一层的核心器件就是ESP8266 WIFI模块,它的主要作用是搭建起本地主控单元和物联网云平台之间的通信桥梁,实现数据的双向传输,一方面它能把云平台上设置好的服药提醒间隔时间、参数设置等信息接收过来,传递给主控核心层,让本地系统按照用户的设置运行,另一方面它还能把主控核心层处理好的各类数据,包括温湿度数据、称重数据、服药确认记录、服药时间等,实时上传到云平台,确保数据能及时、准确地同步,为了保证通信的稳定性,我在设计的时候还对ESP8266模块的通信参数进行了优化,让它能快速连接到家庭WIFI网络,减少数据传输的延迟和丢失,同时还加入了重连机制,要是出现网络中断的情况,模块能自动尝试重新连接,确保通信的连续性。
主控核心层是整个系统的“大脑”,核心器件选用的是STM32F411CEU6单片机,它承担着整个系统的统筹控制和数据处理工作,所有外设模块的工作都需要在它的控制下完成,首先它会接收通信传输层传来的云平台设置参数,把这些参数解析后传递给对应的外设模块,比如把服药提醒间隔时间发送给TFTLCD显示屏进行显示,同时按照设定的时间控制声光报警器的工作;其次它会实时接收外设模块采集到的各类数据,包括SHT30传感器采集的温湿度数据、HX711称重传感器采集的药品重量数据、按键模块的确认信号等,对这些数据进行筛选、处理和分析,比如通过称重数据的变化判断用户是否完成服药,通过温湿度数据判断药品储存环境是否合格;最后它会把处理好的数据传递给通信传输层,由ESP8266模块上传到云平台,同时根据数据处理结果控制各外设模块的运行状态,确保整个系统能有序、稳定地工作。
最下层是外设模块层,这一层包含了系统所有的外部功能模块,是实现系统各项具体功能的基础,主要分为数据采集模块、显示模块、提醒模块和操作模块四个部分,数据采集模块由SHT30数字温湿度传感器和HX711称重传感器组成,SHT30传感器会实时采集药盒内的温度和湿度数据,把采集到的数字信号传递给主控单元,避免药品因环境不适发生变质,HX711称重传感器会实时监测药盒内药品的重量变化,把重量数据传递给主控单元,帮助主控单元判断用户是否完成服药;显示模块采用TFTLCD液晶显示屏,主要用于显示服药提醒间隔时间、当前药盒内温湿度数据、服药状态等信息,让用户能直观地了解系统的运行状态和相关数据;提醒模块就是声光报警器,当到达设定的服药时间时,主控单元会控制它发出声音和灯光提醒,确保用户能及时接收到服药信号;操作模块是按键模块,用户服药完成后,按下按键就能完成服药确认,按键的信号会传递给主控单元,触发服药记录的上传操作。
整个系统的工作流程是相互衔接、闭环运行的,用户在云平台设置好服药提醒间隔时间后,ESP8266模块会把这个参数同步到STM32F411CEU6主控单元,主控单元再把间隔时间显示到TFTLCD屏幕上,同时开始计时,当计时达到设定的间隔时间时,主控单元会控制声光报警器响起,提醒用户服药,用户服药后按下按键确认,此时HX711称重传感器会采集到药品重量的变化,主控单元结合按键信号和重量变化数据,确认用户完成服药,随后把服药时间、温湿度数据、重量变化数据等整理好,通过ESP8266模块上传到云平台,云平台对这些数据进行存储和记录,形成完整的用药依从性监测记录,这样就完成了一次完整的服药监测流程,整个架构设计既满足了系统的各项功能需求,又保证了系统的稳定性和实用性,也为后续的硬件设计和软件设计奠定了坚实的基础。

二、文档介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、項目设计

系统软件程序设计以 STM32F411CEU6 为主控核心,采用模块化编程思路完成整体开发,软件架构分为主程序框架、传感器数据采集、WIFI 通信上传、本地显示驱动、按键与报警控制五大功能板块,所有程序均在 Keil MDK 开发环境中编写与调试,代码结构清晰、可读性强,能让各模块协同稳定工作,软件整体采用中断 + 轮询结合的运行方式,既保证了实时响应速度,也能降低系统功耗,满足智能药盒长期稳定运行的需求。

主程序框架设计
主程序是整个软件系统的核心入口,负责系统初始化、模块调度与任务循环执行,系统上电后会先完成时钟初始化、GPIO 初始化、串口初始化、I2C 与 SPI 初始化等基础配置,再依次启动 SHT30、HX711、TFTLCD、ESP8266 等外设,随后进入主循环,不断读取温湿度、重量数据,刷新屏幕显示,判断服药提醒时间,检测按键状态,并在满足条件时触发报警与数据上传,主程序框架保证了所有任务有序执行,不会出现冲突或卡死的情况。
主程序核心代码如下:

c
int main(void){
    SysInit();            // 系统时钟与底层初始化
    Sensor_Init();        // 传感器初始化
    LCD_Init();           // 液晶屏初始化
    ESP8266_Init();       // WIFI模块初始化
    KEY_Init();           // 按键初始化
    BEEP_LED_Init();      // 声光报警初始化

    LCD_ShowString(0,0,"Smart Pill Box");
    while(1){
        Get_SHT30_Data(&temp,&humi);    // 读取温湿度
        Get_HX711_Weight(&weight);      // 读取重量
        LCD_ShowTempHumi(temp,humi);    // 屏幕显示
        Check_Alarm_Time();             // 判断是否提醒服药
        if(KEY_Scan()){                 // 检测按键
            Upload_Data(temp,humi,weight); // 上传数据
            Alarm_Stop();                     // 关闭报警
        }
        delay_ms(200);
    }
}

传感器数据采集程序设计
传感器数据采集程序包含 SHT30 温湿度采集与 HX711 称重采集两部分,SHT30 采用 I2C 通信,主控通过发送指令读取温度与湿度原始数据,再通过公式转换为实际物理量,程序中加入了数据滤波处理,避免数值跳动,提高监测稳定性;HX711 称重模块通过 GPIO 口读取差分信号,程序内部完成校准、偏移修正与单位转换,能精准识别服药后的重量变化,为服药行为判断提供可靠依据,两种传感器的采集程序均做了容错处理,即使单次采集失败也不会影响系统整体运行。
SHT30 温湿度采集关键代码如下:

c
void Get_SHT30_Data(float *temp, float *humi){
    u8 buf[6];
    I2C_Start();
    I2C_Send_Byte(SHT30_ADDR+0);
    I2C_Send_Byte(0x2C);
    I2C_Send_Byte(0x06);
    I2C_Stop();
    delay_ms(50);
    I2C_Start();
    I2C_Send_Byte(SHT30_ADDR+1);
    buf[0]=I2C_Read_Byte(1);
    buf[1]=I2C_Read_Byte(1);
    buf[2]=I2C_Read_Byte(1);
    buf[3]=I2C_Read_Byte(1);
    I2C_Read_Byte(0);
    I2C_Stop();
    *temp = ((((buf[0]<<8)|buf[1]) * 175.0) / 65535.0) - 45.0;
    *humi = ((((buf[3]<<8)|buf[4]) * 100.0) / 65535.0);
}

ESP8266 WIFI 通信程序设计
ESP8266 WIFI 通信程序负责本地设备与物联网云平台之间的数据交互,软件采用串口 AT 指令控制方式,先完成 WIFI 账号密码连接,再建立 TCP 通信,将云平台下发的服药间隔时间解析并存储到主控内部变量,同时把温湿度、重量、服药时间等数据打包上传到云平台,程序中加入了自动重连机制,当网络断开时会自动尝试重新连接,保证数据上传不中断,云平台设置的参数可实时同步到本地屏幕,实现远程控制与监测功能。
ESP8266 发送数据核心代码如下:

c
void Upload_Data(float temp, float humi, float weight){
    char data_buff[64];
    sprintf(data_buff,"{\"temp\":%.1f,\"humi\":%.1f,\"weight\":%.1f}",temp,humi,weight);
    USART1_SendString("AT+CIPSEND=%d\r\n",strlen(data_buff));
    delay_ms(100);
    USART1_SendString(data_buff);
    LCD_ShowString(0,6,"Upload Success");
}
c
// 按键中断服务函数(消抖处理)
void EXTI0_IRQHandler(void){
    delay_ms(10);  // 软件消抖
    if(KEY == 0){  // 检测按键是否真的按下
        alarm_flag = 0;  // 清除报警标志
        key_flag = 1;    // 置位按键确认标志
        Alarm_Stop();    // 关闭声光报警
    }
    EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志
}

// 声光报警控制函数
void Alarm_Start(void){
    alarm_flag = 1;
    while(alarm_flag == 1){
        BEEP = 1;  // 蜂鸣器发声
        LED = 0;   // LED灯亮
        delay_ms(500);
        BEEP = 0;  // 蜂鸣器停止
        LED = 1;   // LED灯灭
        delay_ms(500);
        if(key_flag == 1){  // 检测到按键确认,退出报警
            key_flag = 0;
            break;
        }
    }
}

// 关闭报警函数
void Alarm_Stop(void){
    BEEP = 0;
    LED = 1;
    alarm_flag = 0;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

更多推荐