基于STM32的家庭健康监测系统
智能家庭医疗系统监测家庭成员健康 #生活知识# #科技生活# #科技改变生活# #智能医疗#
系统成品图
模块选用
液晶显示模块:OLED12864
WIFi模块:ATK-ESP8266
心率模块:ADS1292R
串口+stm32
mpu6050
文件链接
通过百度网盘分享的文件:A_系统.zip
链接:https://pan.baidu.com/s/1trr2h3ckNP6_ocTCt5NTfw
提取码:c9rx
一、引言
在现代生活中,人们对健康的关注度日益提高。家庭健康监测系统能够方便地为家庭成员提供实时健康数据,有助于及时发现健康问题。本文将介绍一个基于 STM32 微控制器的家庭健康监测系统的设计与实现。
二、系统概述
(一)功能需求 基本健康参数测量:能够测量体温、心率、血压等常见健康参数。数据显示与存储:在本地显示测量数据,并将数据存储起来以便后续分析。异常报警功能:当测量数据超出正常范围时,系统能发出警报。远程数据传输(可选):可将数据传输到手机或云端,方便用户和医护人员远程查看。 (二)系统架构基于 STM32 的家庭健康监测系统主要由以下几个部分组成:
传感器模块:用于采集各种健康参数的传感器,如温度传感器、心率传感器、血压传感器等。STM32 微控制器核心:负责处理传感器数据、控制其他模块的工作,并执行相应的算法。显示模块:如液晶显示屏(LCD),用于向用户展示测量结果。报警模块:包括声音报警器或指示灯等,用于提示异常情况。通信模块(如果有远程功能):如蓝牙或 Wi-Fi 模块,用于与外部设备通信。(三).项目描述
① 使用 ADS1292R 模块与 STM32 进行全双工的 SPI 通讯,获得心率原始数据,STM32 将经软件滤波后的心电信号以审口的方式 传输到他设备对心率数据进行下一步的处理
② 温度模块 LMT70 测量温度(IC)
③ MPU6050 模块实现跌倒的判断
④ 烟雾报警模块实现烟雾浓度测试
⑤ 在本地 OLED 屏上显示数据(IIC)
⑥ 使用 ESP8266 模块实现物联网(MQTT) ,使用 ONENET 平台作为上位机 ,接收单片机上传的数据 ,通过登录云平台查看心率、 温度、烟雾浓度的折线图。
三、硬件设计
(一)传感器选型与连接 温度传感器:可以选择 DS18B20 数字温度传感器。它与 STM32 通过单总线协议连接,具有精度高、体积小、使用方便等优点。心率传感器:例如ADS1292R 脉搏血氧仪和心率传感器。它通过 spi 接口与 STM32 相连,能够同时测量心率和血氧饱和度。需要搭配适当的信号调理电路将压力信号转换为 STM32 可处理的电压信号,然后通过 ADC(模拟 - 数字转换)通道接入 STM32。 (二)STM32 微控制器选型根据系统的复杂程度和性能要求,可以选择合适的 STM32 型号。例如,STM32F103 系列具有丰富的外设资源,包括多个 ADC 通道、通用输入输出引脚(GPIO)、定时器等,能够满足本系统的需求。
(三)显示模块选用合适的液晶显示屏,如 1602 字符型液晶显示屏或彩色 TFT - LCD 显示屏。以 1602 显示屏为例,通过 STM32 的 GPIO 引脚控制其数据传输和显示操作,向用户展示测量的健康参数。
(四)报警模块选择一个小型蜂鸣器作为声音报警器,通过 STM32 的 GPIO 引脚控制其发声。同时,可以添加一个红色 LED 指示灯,当出现异常数据时,蜂鸣器鸣叫且指示灯闪烁,引起用户注意。
(五)通信模块(若实现远程功能) 蓝牙模块:如 HC - 05 蓝牙模块,通过 UART(通用异步收发器)接口与 STM32 连接。用户可以使用手机上的蓝牙功能与系统配对,接收和查看健康数据。Wi - Fi 模块(可选):对于更高级的远程监测需求,可以选择 ESP8266 等 Wi - Fi 模块,将数据传输到云端服务器,方便医护人员远程监控。四、软件设计
(一)初始化设置 在程序开始,对 STM32 的系统时钟、GPIO 引脚、各个外设(如 ADC、I2C、SPI、UART 等)进行初始化配置。例如,设置 ADC 的采样频率和分辨率,初始化 I2C 通信的时钟频率和从设备地址等。对传感器进行初始化,使其进入正常工作状态。例如,对 MAX30100 传感器进行初始化,设置其工作模式、采样率等参数。 (二)传感器数据采集 编写函数实现对各个传感器数据的采集。对于温度传感器 DS18B20,通过单总线通信协议发送读取温度的指令,并接收返回的温度数据。对于心率传感器 MAX30100,通过 I2C 接口读取心率和血氧饱和度数据。对于血压传感器,通过 ADC 采集电压信号,并根据传感器的校准公式计算出血压值。为了提高数据的准确性,可以对采集到的数据进行滤波处理。例如,采用滑动平均滤波法,对多次采集的数据求平均值,减少噪声的影响。 (三)数据处理与判断 根据医学标准,设定各个健康参数的正常范围。例如,正常体温范围在 36.1℃ - 37.2℃,正常心率范围在 60 - 100 次 / 分钟(成人)等。在程序中编写函数,将采集到的数据与正常范围进行比较。如果数据超出正常范围,则标记为异常数据。 (四)显示与存储功能 编写函数将采集和处理后的健康数据显示在液晶显示屏上。例如,将温度、心率、血压等数据以合适的格式显示在 1602 显示屏上,方便用户查看。实现数据存储功能,将测量数据以一定的格式(如 CSV 文件格式)存储到 SD 卡中。包括记录测量时间、各个健康参数的值等信息,以便后续对健康状况进行分析。 (五)报警功能 当检测到异常数据时,触发报警功能。通过控制 GPIO 引脚使蜂鸣器发声和 LED 指示灯闪烁。可以设置不同的报警模式,例如,持续鸣叫和闪烁表示严重异常,间歇鸣叫和闪烁表示轻度异常。 (六)通信功能(若有远程功能) 蓝牙通信:如果系统配备蓝牙模块,编写 UART 通信相关的程序实现与手机的蓝牙连接和数据传输。将测量的健康数据按照一定的协议格式发送到手机端的应用程序。Wi - Fi 通信(可选):对于 Wi - Fi 模块,配置其连接到指定的 Wi - Fi 网络,并实现与云端服务器的数据交互。可以使用 HTTP 协议或 MQTT 协议等将数据上传到云端,医护人员可以通过相应的平台查看数据。五.代码实现
(一)跌倒监测功能(姿态解算)怎样实现跌倒判断的?
在实现跌倒功能之前,MPU6050是整合性六轴运动处理组件,其中组合了三轴陀螺仪和三轴加速器。加速度传感器是用来检查空集中的6个面(前后左右上下)中的哪些面受到了力的作用,陀螺仪是检测3个方向的欧拉角,本模块所需要实现简单的跌倒检测的功能,首先得知道什么算跌倒或者如何表示跌倒的状态。跌倒是指突发、不自主的、非故意的体位改变,倒在地上或更低的平面上[4]。人体在跌倒瞬间,身体的加速度和角速度在水平和垂直方向都会发生巨大的变化[5]。因此,通过判断三个方向的欧拉角以及三个方向的综合加速度综合考虑来判断是否摔倒。之后我移植DMP,用于从内部传感器中直接解算出四元数,大幅降低运算复杂度,四元组转化得到三个方向的欧拉角,三个方向的欧拉角之后,再结合人体加速度向量幅值SVM来综合判断是否跌倒。SVM是三个方向的综合加速度值。
(二)
wifi与onenet工作流程
1.首先是对WI-FI模块引脚进行初始化包括WI-FI模块的RESET引脚,在本设计中WI-FI模块,通过USART3串口与主控STM32进行通信,因此也对USART3(串口3)进行初始化
2.然后是对WI-FI模块的配置,首先是主控STM32通过串口3向ESP8266发送RST复位指令,然后清除ESP8266中的缓存,根据本设计的需求是要把硬件采集层所获取的所有数据传输到云平台,因此配置其工作模式为“STA”模式(WI-FI模式)。配置为STA模式后需要连接手机热点,通过串口3发送AT指令到ESP8266配置WIFI的名称和密码
3.配置为STA模式后需要连接手机热点,通过串口3发送AT指令到ESP8266配置WIFI的名称和密码,为了方便串口3发送命令,本设计将热点名称和密码做了宏定义,宏定义#define ESP8266_WIFI_INFO"AT+CWJAP=\"ONTNET\",\"lyycz1314\"\r\n" 能上网之后接下来访问云平台公网IP,因为ESP8266模块内部自带了TCP/IP协议栈,因此通过AT命令连接到云平台。
4.置完成后就可以向云平台发送MQTT协议包,等待平台回应后就可以将各种数据打包发送至云平台了
(三).串口+DMA来接收和发送定长数据传输与不定长数据
发送数据有俩种方法,一种是以数组的形式发送,此情况下要知道数组有效元素的个数;
1.用数组的形式发送数据步骤
先判断上一次发送的数据是否完成,未完成就等待数据发送完成,一种是直接判断DMA传输完成标志位,我们自己定义全局变量是否置1;
指定发送缓冲区首地址,也就是待发送数据的地址
指定待发送数据长度。
开启DMA通道7启动DMA发送。
产生DMA通道7传输完成中断,清除中断标志位。
关闭DMA通道7,并清除USART2_TX_FLAG(清0);
2类似printf形式发送数据
void USART2_printf(char *format, ...)
{
//VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h>,用于获取不确定个数的参数。
va_list arg_ptr; //实例化可变长参数列表
while(USART2_TX_FLAG); //等待上一次发送完成(USART2_TX_FLAG为1即还在发送数据)
va_start(arg_ptr, format); //初始化可变参数列表,设置format为可变长列表的起始点(第一个元素)
// USART2_MAX_TX_LEN+1可接受的最大字符数(非字节数,UNICODE一个字符两个字节), 防止产生数组越界
vsnprintf((char*)USART2_TX_BUF, USART2_MAX_TX_LEN+1, format, arg_ptr); //从USART2_TX_BUF的首地址开始拼合,拼合format内容;USART2_MAX_TX_LEN+1限制长度,防止产生数组越界
va_end(arg_ptr); //注意必须关闭
DMA_USART2_Tx_Data(USART2_TX_BUF,strlen((const char*)USART2_TX_BUF)); //发送USART2_TX_BUF内容
}
先实例化可变参数列表
等待上一次发送是否完成
初始化可变参数列表,设置可变列表的起始点
限制长度,放置产生数组越界
关闭
3.、接收数据+双缓冲区
(1)双缓冲区
接收中断间隔时间非常短(即发送数据帧的速率很快),MCU来不及处理此次接收到的数据,又产生中断,这时不能直接开启DMA通道,否则数据会被覆盖,建立双缓冲,设置一个缓冲区标志(用来指示当前处在哪个缓冲区),每完成一次传输就通过重新配置DMA_MemoryBaseAddr的缓冲区地址,下次传输数据就会保存到新的缓冲区中,可以通过自定义缓存区标志来判断和切换,这样可以避免缓冲区数据来不及处理就被覆盖的情况,也能为处理数据留出更多地时间(指到下次传输完成)。
(2)接收定长数据
接收定长数据推荐直接使用DMA传输完成中断,只要DMA通道的DMA缓存的大小不变,每次缓存满了就会产生DMA传输完成中断,这样就能保住每次接收到的数据都是一样长度的
(3)接收不定长数据
接收不定长数据相当于和串口聊天,每次聊天的内容都不一定一样,但每句话都会有间隔的时间,可以理解为空闲时间,由此可以利用串口空闲中断来判断一次数据传输是否完成,虽定义了两个缓冲区,但对于不定长数据,还必须知道所接收数据的长度,只有这样才能正确处理数据。
六、测试与优化
(一)硬件测试 在硬件组装完成后,首先检查各个模块的电源连接是否正确,是否有短路等问题。使用万用表等工具检查传感器的输出信号是否正常,例如检查温度传感器在不同温度环境下的输出电压变化是否符合预期。检查显示模块、报警模块、存储模块和通信模块等是否能够正常工作,如显示屏是否能正常显示初始化信息,蜂鸣器是否能正常发声等。 (二)软件测试 通过调试工具(如 ST - Link 调试器)对软件程序进行逐步调试,检查各个函数的执行情况是否正确。例如,检查传感器数据采集函数是否能正确获取数据,数据处理和判断函数是否能准确识别异常数据。进行功能测试,模拟不同的健康参数情况,检查系统的显示、存储、报警和通信功能是否正常。例如,输入超出正常范围的心率值,检查系统是否能正确报警和显示异常信息。 (三)优化 根据测试结果,对系统进行优化。如果发现数据采集不准确,可以调整传感器的位置或改进信号调理电路。如果软件运行效率较低,可以对算法进行优化,减少不必要的计算和延迟。例如,优化 ADC 采样的时间间隔,提高数据采集的频率同时不影响系统的稳定性。七.遇到的问题
1.遇到的问题,在程序整合逻辑代码均没错误之后,使用串口2给ESP8266发送控制指令进行初始化,结果永远收不到反馈消息,也就一直没有初始化成功,于是就一点一点的排除,先单独用USB调试ESP8266完全没问题,再使用串口2发送和接收数据测试也没问题,然后又借助逻辑分析仪分析出每次串口都发送出了AT指令。在快要放弃的时候突然看到8266的红色指示灯很暗,突然想到会不会是供电不稳定啊,结果真的是杜邦线连接导致电压不稳。
USB调试
作用 对设备进行调试和数据分析。实时数据监视、数据发送和接收、十六进制和文本视图、协议解析、触发和过滤以及日志记录,深入了解设备的行为,诊断问题并优化性能
逻辑分析仪
作用 用来分析信号和电平。
2.在检测的时候,会有许噪音对心率监测的结果带来干扰,比如人体自身以及电路的干扰都会对检测结果产生影响,当许多干扰信号和心电信号混在一起的时候就可能会使有用信号发生变形甚至被淹没,我是使用了滤波,可以分为代码实现的软件滤波和芯片自带的硬件滤波,软件代码滤波用的是1.中间值滤波算法 采样若干次,舍弃较大数据和较小的数据 然后将中间值平均,(定义一个数组,数组里面n个数据,n是宏定义的,之后来个for循环,获取通道里的adc数据,采样n次,放到数组里边,之后冒泡排序,再取中间值,在求和,在算法平均值就是我们最终采取的这个结果
3.接收中断间隔时间非常短(即发送数据帧的速率很快),MCU来不及处理此次接收到的数据,又产生中断,这时不能直接开启DMA通道,否则数据会被覆盖,我就用到了
建立双缓冲,设置一个缓冲区标志(用来指示当前处在哪个缓冲区),每完成一次传输就通过重新配置DMA_MemoryBaseAddr的缓冲区地址,下次传输数据就会保存到新的缓冲区中,可以通过自定义缓存区标志来判断和切换,这样可以避免缓冲区数据来不及处理就被覆盖的情况,也能为处理数据留出更多地时间(指到下次传输完成)。
在使用某传感器模块,一般传感器输出的数据包长度是固定,这就是定长数据;但使用中,我们也可能接收不定长数据。所以我就用串口+dma。
八、总结
基于 STM32 的家庭健康监测系统能够为家庭健康管理提供一种便捷、有效的解决方案。通过合理的硬件设计和软件编程,可以实现对多种健康参数的准确测量、显示、存储和报警功能,并且可以根据需要实现远程数据传输。在未来,随着传感器技术和通信技术的不断发展,该系统还可以进一步完善和扩展,为人们的健康生活提供更有力的保障。
以上博客内容详细介绍了基于 STM32 的家庭健康监测系统的设计过程,希望对有兴趣的读者有所帮助,欢迎大家在评论区交流讨论。
网址:基于STM32的家庭健康监测系统 https://www.yuejiaxmz.com/news/view/215416
相关内容
基于stm32的家庭安全监测系统基于STM32的智能健康监测手环
基于STM32的人体健康检测系统
基于物联网智慧家庭健康监测系统设计
基于STM32开发的智能空气质量监测系统
基于STM32的家庭健康监测系统的研究背景和意义,内容有:心率、血氧、体温、摔倒检测、烟雾、APP等
基于STM32的户外环境监测系统(五)
基于STM32的宠物远程投喂和监测系统设计
基于STM32的人体健康监测系统:心率、血氧、体温实时检测与语音播报,基于STM32的人体健康监测系统:心率、血氧、体温测量,语音播报和报警
基于STM32单片机的室内环境监测系统:打造智能生活新体验