写点什么

基于 STM32 设计的蓝牙健康管理设备

作者:DS小龙哥
  • 2022 年 6 月 27 日
  • 本文字数:5663 字

    阅读完需:约 19 分钟

1. 前言

随着移动通信技术的发展,移动互联网日益普及,传统互联网已经在向移动互联网迁移,智能穿戴设备近年来发展的非常迅速,成为一个热点行业,它通过借助传感器,与人体进行信息交互,是一种在新理念下诞生的智能设备,具有广泛的应用领域,并能够根据用户需求不断升级。智能穿戴设备在提高人们生活品质、促进生活方式智能化方面将会起到很重要的作用。


按照主要功能的不同,智能穿戴设备产品可以划分为以下几类:运动健康类、体感交互类、信息资讯类、医疗健康类和综合功能类等,每类设备针对不同的细分市场和消费人群。运动和医疗健康类的设备有运动、体侧腕带及智能手环,主要消费人群为大众消费者;体感控制和综合功能类的设备有智能眼镜等,消费人群以年轻人为主;信息咨询类的设备有智能手表,主要消费人群为大众消费者。从目前来看,医疗和运动健康类设备使用的用户较多。


随着智能穿戴产业竞争日趋激烈,同质化产品现象越来越严重,各类只具备单一功能的智能硬件纷纷开始与其他智能硬件寻求合作。在未来,随着单一领域的智能穿戴产品技术日渐成熟,不同领域和功能诉求的产品会根据用户实际需求在功能上实现互补,从而带来更符合用户需求的智能体验,发展方向也会日渐明确和多元化。


当前采用 STM32 加上各种外设传感器配合蓝牙+手机 APP 设计了一款个人健康监控管理设备,通过 BLE 低功耗蓝牙将采集的传感器数据上传到手机 APP 进行实时显示。



2. 功能总结

主要功能(1)开发板选用 STM32 单片机做数据处理。


(2)开发一款 Android 手机 APP,用来显示蓝牙上传的数据


(3)运用蓝牙来传输数据,将体温传感器、心率脉搏传感器、加速度传感器采集的数据上传到手机上显示。


一般情况下脉搏等于心率,心脏射血沿着血管壁向前流动,形成脉搏。正常人无论大人、小孩、老年人,正常状态下脉搏和心率是一致的。如果有心脏病,因为心脏本身的传导系统有保护作用,心室率不可能和心房率一样,在血管里传导的速度也不一样,脉搏会有时弱,有时强。弱的时候可能感知不到,这种状态下脉搏会少于心率,房颤时心率比脉搏要多一些,所以脉搏不一定完全代表心率。


(4)如果测量的体温值超过警戒值,本地设备上的蜂鸣器就会发出警示提示声音。


需要使用的硬件:


(1)STM32 系统板


(2)体温传感器


(3)陀螺仪传感器


(4)心率脉搏传感器

3. 硬件选型

3.1 MPU6050 陀螺仪



MPU6050 特点:


(1)高性能三轴加速度+三轴陀螺仪的六轴传感器模块 MPU6050 芯片;


(2)可利用自带的数字运动处理器(DMP)硬件加速引擎,通过主 IKC 接口,向应用端输出姿态解算后的数据,使用 InvenSense 公司提供的运动处理资料库,实现姿态解算,降低了运动处理运算对操作系统的负荷同时大大降低了开发难度;


(3)体积小,自带温度传感器;


(4)支持 IIC 从机地址设置和中断;


(5)兼容 3.3V/5V 系统;

3.2 STM32 开发板


3.3 母对母杜邦线


3.4 温度传感器



GY-MCU90615 是一款低成本红外温度模块。工作电压 3-5v 功耗小,体积小。其工作原理, 是通过单片机读取红外温度度数据,串口(TTL 电平)通信方式输出。串口的波特率有 9600bps 与 115200bps 有连续输出与询问输出两种方式,可适应不同的工作环境,与所有的单片机及电脑连接。


通信协议串口发送命令字节:
(1)、串口通信参数(默认波特率值9600 bps,可通过软件设定)波特率:9600 bps 校验位:N 数据位:8 停止位:1
波特率:115200 bps 校验位:N 数据位:8 停止位:1
(2)、模块输入命令,由外部控制器发送至GY-MCU90615模块(十六进制)
1、帧头:0xa5
指令格式:帧头+指令+校验和(8bit)(如自动读取温度指令=0xA5+0x45+0xEA)
2、命令指令:
连续输出指令:0xA5+0x45+0xEA----------------温度数据(模块返回数据类型为0x45)
查询输出指令:
0xA5+0x15+0xBA ---------------温度数据(模块返回数据类型为0x45)
配置指令:(掉电重启后生效)
波特率配置:
0xA5+0xAE+0x53 ---------------9600(默认)
0xA5+0xAF+0x54 ---------------115200
上电是否自动发送温度数据配置:
0xA5+0x51+0xF6---------------上电后自动输出温度数据(默认)
0xA5+0x52+0xF7---------------上电后不自动输出温度数据

通信协议
串口接收:
(1)、串口通信参数(默认波特率值9600 bps,可通过软件设定)
波特率:9600 bps 校验位:N 数据位:8 停止位:1
波特率:115200 bps 校验位:N 数据位:8 停止位:1

(2)、模块输出格式,每帧包含9个字节(十六进制):
①.Byte0: 0x5A 帧头标志
②.Byte1: 0x5A 帧头标志
③.Byte2: 0X45 本帧数据类型(0X45:温度数据)
④.Byte3: 0x04 数据量(以下4个数据2组为例)
⑤.Byte4: 0x00~0xFF 数据1高8位
⑥.Byte5: 0x00~0xFF 数据1低8位
⑦.Byte6: 0x00~0xFF 数据2高8位
⑧.Byte7: 0x00~0xFF 数据2低8位
⑨.Byte8: 0x00~0xFF 校验和(前面数据累加和,仅留低8位)
(3)、数据计算方法
温度计算方法 :
温度= 高8位<<8 低8位(结果为实际角度乘以100)
例:发送指令:A5 45 EA ,接收到一帧数据:
<5A- 5A- 45- 04- 0C- 78- 0D- 19- A7 >
表示TO(有符号16bit,表示目标温度):TO=0x0C78/100=31.92 ℃
表示TA(有符号16bit,表示环境温度):TO=0x0D19/100=33.53 ℃
使用方法该模块为串口输出数据,使用者通过串口连接后,发送输出指令,例如0xA5+0x45+0xEA给模块,模块将连续输出温度数据;如想通过查询输出可发送0xA5+0x15+0xBA给模块,每发送一次,模块将返回一次温度数据,查询频率应低于10hz,如需高于10hz请使用连续输出模式,即发送0xA5+0x45+0xEA指令;
复制代码

3.5 脉搏传感器



PulseSensor 是一款用于脉搏心率测量的光电反射式模拟传感器。将其佩戴于手指、耳垂等处,通过导线连接可将采集到的模拟信号传输给 Arduino 等单片机用来转换为数字信号,再通过 arduino 等单片机简单计算后就可以得到心率数值,此外还可将脉搏波形通过串口上传到电脑显示波形。 PulseSensor 是一款开源硬件, 目前国外官网上已有其对应的 arduino 程序和上位机 Processing 程序, 其适用于心率方面的科学研究和教学演示,也非常适合用于二次开发。



特别提醒:传感器背面是电子元件,请不要用手指直接接触, 以免静电或汗液造成背面器件损坏。 可以在背面粘贴黑色粘扣, 正面粘贴透明膜来保护传感器。



传感器的接口一共 3 个, 如上图红框内所示。 请大家千万不要根据线的颜色来自行推测, 而要根据电路板的背面标识来分辨。红框中的 3 根线,标有 S 的为模拟信号输出线(最左边) ; 标有+的为电源输入线(中间);标有-的为地线(最右边) 。总结一下:S → 脉搏信号输出(要接单片机 AD 接口)


VCC→ 5v(或 3.3v)电源输入


GND→ GND 地

3.6 PCB 洞洞板


3.7 BLE 低功耗蓝牙模块


4. 上位机程序设计

4.1 开发环境

上位机软件采用 Qt 框架设计,Qt 是一个跨平台的 C++图形用户界面应用程序框架。Qt 是一个 1991 年由 Qt Company 开发的跨平台 C++图形用户界面应用程序开发框架。它既可以开发 GUI 程序,也可用于开发非 GUI 程序,比如控制台工具和服务器。简单来说,QT 可以很轻松的帮你做带界面的软件,甚至不需要你投入很大精力。


QT 官网: https://www.qt.io/



QT5.12.6 的下载地址:https://download.qt.io/archive/qt/5.12/5.12.6/


打开下载链接后选择下面的版本进行下载:


qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details


软件安装时断网安装,否则会提示输入账户。


安装的时候,第一个复选框里勾选一个 mingw 32 编译器即可,其他的不管默认就行,直接点击下一步继续安装。



选择 MinGW 32-bit 编译器:



选择 MinGW 32-bit 编译器:




4.2 设计效果

5. STM32 开发

下面只是贴出了原理图的截图,运行效果,部分代码,硬件资料演示视频不好上传,如果需要项目完整的工程、系统原理图、相关的硬件资料,可以在这里去下载:https://download.csdn.net/download/xiaolong1126626497/85793557

5.1 硬件接线

本设计的硬件接线说明: (1)BLE低功耗蓝牙模块PA2(TX)--RXD 模块接收脚PA3(RX)--TXD 模块发送脚GND---GND 地VCC---VCC 电源(3.3V)
(2)红外测温模块PB10(TX)--RXD 模块接收脚PB11(RX)--TXD 模块发送脚GND---GND 地VCC---VCC 电源(3.3V)
(3)MPU6050陀螺仪1 VCC 3.3V/5V 电源输入 ---->接3.3V2 GND 地线 --->接GND3 IIC_SDA IIC 通信数据线 -->PB64 IIC_SCL IIC 通信时钟线 -->PB75 MPU_INT 中断输出引脚 ---->未接6 MPU_AD0 IIC 从机地址设置引脚-->未接 AD0引脚说明:ID=0X68(悬空/接 GND) ID=0X69(接 VCC) (4)心率检测模块PA1---心率模块的DAT输出脚GND---GND 地VCC---VCC 电源(3.3V)

(--)板载LED灯:低电平亮LED1--PC13 BEEP2--PC14
(--)板载按键: KEY1--PA0 按下为高电平
复制代码

5.2 程序下载

将开发板连接电脑,打开程序下载软件,照着下图的说明进行下载。


5.3 系统原理图

5.4 keil 工程


5.5 功能代码

#include "stm32f10x.h"#include "delay.h"#include "led.h"#include "key.h"#include "sys.h"#include "usart.h"#include <string.h>#include <stdlib.h>#include "timer.h"#include "adc.h"#include "mpu6050.h"
/*---------心率相关的数据值---------------*/extern int IBI; //相邻节拍时间extern int BPM; //心率值 extern int Signal; //原始信号值 extern unsigned char QS; //发现心跳标志
short aacx,aacy,aacz; //加速度传感器原始数据short gyrox,gyroy,gyroz; //陀螺仪原始数据float TO=0; //红外测温温度-目标温度float TA=0; //红外测温温度-物体温度
//蓝牙发送缓冲区u8 BLE_TX_BUFF[100];
/*主函数: 程序执行的入口*/int main(void){ u32 i=0; u8 key_val; u32 wifi_TimeCnt=0; JTAG_Set(); USART1_Init(115200); //串口1的初始化 USART2_Init(9600); //串口-蓝牙 TIMER2_Init(72,20000); //超时时间20ms USART3_Init(9600); //串口-红外线测温模块 TIMER3_Init(36,20000); //超时时间20ms //板载按键初始化 KEY_Init(); //板载LED灯初始化 LED_Init(); //ADC初始化 ADC_Init(); //超时时间2ms TIMER1_Init(72,2000); //初始化MPU6050 while(MPU6050_Init()) { printf("三轴加速度计、陀螺仪初始化失败!\r\n"); DelayMs(1000); }
printf("系统工作正常..\r\n"); while(1) { //板载按键检测 key_val=KEY_GetValue(); if(key_val) { printf("按键按下...\r\n"); } //时间记录 DelayMs(10); wifi_TimeCnt++; if(wifi_TimeCnt>=100) //1000毫秒一次 { wifi_TimeCnt=0; LED1=!LED1; MPU6050_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪原始数据 MPU6050_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据 printf("三轴陀螺仪:x=%d y=%d z=%d\r\n",gyrox,gyroy,gyroz); printf("三轴加速度:x=%d y=%d z=%d\r\n",aacx,aacy,aacz); printf("(心率)BPM=%d\r\n",BPM); //向蓝牙发送数据,发送给上位机 //例如: update,12,13,14,15,20.5 //分别表示:加速度X轴,加速度Y轴,加速度Z轴,心率、体温 sprintf((char*)BLE_TX_BUFF,"update,%d,%d,%d,%d,%f",aacx,aacy,aacz,BPM,TO); USARTx_StringSend(USART2,(char*)BLE_TX_BUFF); }
// 接收蓝牙返回的数据 if(USART2_RX_FLAG) { USART2_RX_BUFFER[USART2_RX_CNT]='\0'; printf("蓝牙收到数据:\r\n"); //向串口打印服务器返回的数据 for(i=0;i<USART2_RX_CNT;i++) { printf("%c",USART2_RX_BUFFER[i]); } USART2_RX_CNT=0; USART2_RX_FLAG=0; } //实时接收红外测温模块收到的数据 if(USART3_RX_FLAG) { printf("\r\n红外测温开始:"); for(i=0;i<USART3_RX_CNT;i++) { printf("%#x ",USART3_RX_BUFFER[i]); } printf("红外测温结束.\r\n"); u8 sum=0,i=0; for(sum=0,i=0;i<(USART3_RX_BUFFER[3]+4);i++) { sum+=USART3_RX_BUFFER[i]; } /*温度计算方法 :温度=高 8 位<<8|低 8 位(结果为实际角度乘以 100)例:发送指令: A5 45 EA ,接收到一帧数据: <5A- 5A- 45- 04- 0C- 78- 0D- 19- A7 >表示 TO(有符号 16bit,表示目标温度): TO=0x0C78/100=31.92 ℃表示 TA(有符号 16bit,表示环境温度): TO=0x0D19/100=33.53 ℃ */ if(sum==USART3_RX_BUFFER[i])//校验和判断 { TO=(float)((USART3_RX_BUFFER[4]<<8)|USART3_RX_BUFFER[5])/100.0; //得到真实温度 TA=(float)((USART3_RX_BUFFER[6]<<8)|USART3_RX_BUFFER[7])/100.0; //得到真实温度 } printf("TO: %f\r\n",TO); printf("TA: %f\r\n",TA); memset(USART3_RX_BUFFER,0,sizeof(USART3_RX_BUFFER)); USART3_RX_CNT=0; USART3_RX_FLAG=0; } } }
复制代码


发布于: 刚刚阅读数: 3
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
基于STM32设计的蓝牙健康管理设备_6月月更_DS小龙哥_InfoQ写作社区