当前位置:网站首页>基于STM32设计的蓝牙健康管理设备
基于STM32设计的蓝牙健康管理设备
2022-06-27 09:25:00 【InfoQ】
1. 前言


2. 功能总结
3. 硬件选型
3.1 MPU6050陀螺仪

3.2 STM32开发板

3.3 母对母杜邦线

3.4 温度传感器

通信协议
串口发送命令字节:
(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 脉搏传感器



3.6 PCB洞洞板

3.7 BLE低功耗蓝牙模块

4. 上位机程序设计
4.1 开发环境






4.2 设计效果

5. STM32开发
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.3V
2 GND 地线 --->接GND
3 IIC_SDA IIC 通信数据线 -->PB6
4 IIC_SCL IIC 通信时钟线 -->PB7
5 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;
}
}
}
边栏推荐
- About the problem that the El date picker Click to clear the parameter and make it null
- 快速入门CherryPy(1)
- [vivid understanding] the meanings of various evaluation indicators commonly used in deep learning TP, FP, TN, FN, IOU and accuracy
- Collection framework generic LinkedList TreeSet
- 不会初始化类的几种Case
- How much memory does the data type occupy? LongVsObject
- [ 扩散模型(Diffusion Model) ]
- Getting started with webrtc: 12 Rtendpoint and webrtcendpoint under kurento
- 使线程释放锁资源的操作/方法重载一点注意事项
- Obsidian 一周使用心得(配置、主题和插件)
猜你喜欢

有關二叉樹的一些練習題

Rman-08137 main library failed to delete archive file

NoSQL database redis installation

力扣84柱状图中最大的矩形

E+h secondary meter repair pH transmitter secondary display repair cpm253-mr0005

初步认识pytorch

手把手带你玩摄像头模组

ucore lab5

Improving efficiency or increasing costs, how should developers understand pair programming?

ucore lab3
随机推荐
Summary of three basic interview questions
多网络设备存在时,如何配置其上网优先级?
Semi-supervised Learning入门学习——Π-Model、Temporal Ensembling、Mean Teacher简介
Apache POI的读写
IMX8QXP DMA资源和使用(未完结)
Some exercises about binary tree
借助原子变量,使用CAS完成并发操作
Rough reading DS transunet: dual swing transformer u-net for medical image segmentation
Video file too large? Use ffmpeg to compress it losslessly
About the problem that the El date picker Click to clear the parameter and make it null
0号进程,1号进程,2号进程
Conception de plusieurs classes
内存泄露的最直接表现
巴基斯坦安全部队开展反恐行动 打死7名恐怖分子
E+H二次表维修PH变送器二次显示仪修理CPM253-MR0005
How do I get the STW (pause) time of a GC (garbage collector)?
2022.6.26-----leetcode. seven hundred and ten
MYSQL精通-01 增删改
集合框架 泛型LinkedList TreeSet
This, constructor, static, and inter call must be understood!