基于stm32单片机智能手环心率血压血氧体温佩戴检测APP设计

  • 1、项目简介
  • 1.1 系统功能
  • 1.2 演示视频
  • 2、部分电路设计
  • 2.1 STM32单片机核心板电路设计
  • 2.2 血压、心率、血氧检测电路设计
  • 2.3 ESP8266 WIFI无线通信电路设计
  • 2.4 OLED显示电路设计
  • 3、单片机代码展示
  • 3.1 系统初始化
  • 3.2 手环佩戴检测程序初始化
  • 3.3 OLED显示屏初始化
  • 3.4 ESP8266初始化
  • 4、Android Studio APP代码展示
  • 4.3 APP创建网络通信代码
  • 4.2 APP与单片机通信代码


1、项目简介

1.1 系统功能

  • 系统构成
  • 系统由stm32f103c8t6单片机最小系统、人体健康检测心率、血氧、血压测量电路、DS18B20温度测量电路esp8266 wifi通信电路、红外检测电路、按键电路构成。
  • 功能介绍:
  • 1、App通过wifi连接系统,app显示心率、血氧、收缩压、舒张压、温度、紧急呼叫数据
  • 2、通过按键电路可设置温度、血氧的报警阈值,心率,收缩压,舒张压报警阈值在人体正常范围,当这些参数超出阈值时,蜂鸣器进行报警。
  • 3、通过一键呼叫按键可向app发送信息,app界面显示紧急呼叫。
  • 4、检测手环是否佩戴,没佩戴则不进行数据显示以及报警

1.2 演示视频

2、部分电路设计

2.1 STM32单片机核心板电路设计

  • 基于 ARM Cortex-M3内核的STM32F1系列单片机属于主流STM32单片机,其中增强型STM32F103子系列单片机的CPU 主频高达72MHz,片内Flash容量高达1MB,芯片引脚数量多达144个,有 QFN、LQFP、CSP、BGA 等多种芯片封装形式,并具有多种片内外设、USB接口和CAN 接口。根据STM32F103单片机片内Flash容量的不同,ST 公司将其分为小容量(16-32KB)、中等容量(64-128KB)、大容量(256KB-1MB)3种。
  • 电源电路:为单片机提供稳定的工作电压,通常采用3.3V电源供电。电源电路的设计要保证单片机在不同工作条件下都能获得稳定的电压输出,以确保单片机的正常工作。
  • 晶振电路:提供单片机工作所需的时钟信号。晶振电路通过晶振和电容组成,为单片机提供稳定的工作脉冲,确保单片机的定时和同步需求。
  • 复位电路:实现单片机的复位功能,类似于电脑的重启。复位电路通过电容和电阻的配合,实现单片机在上电启动时的自动复位,以及通过手动按键实现复位功能,保证单片机在程序跑飞或异常情况下能够重新开始执行程序。

STM32单片机是一种功能强大、易于使用、灵活且可靠的32位微控制器,基于ARM Cortex™-M内核。其主要功能特点包括:

  • 高性能和低功耗:STM32系列单片机提供多种内核选择,如Cortex-M0、Cortex-M3、Cortex-M4等,满足不同应用场景对性能的需求,同时保持低功耗特性。
  • 多种通信和外设接口:STM32单片机具备广泛的通信和外设接口,如I2C、SPI、USART、USB等,便于开发者实现各种复杂功能。
  • 易于开发和调试:STM32单片机提供了丰富的软件和硬件工具,如HAL库、CubeMX等,帮助开发者快速创建和调试嵌入式系统。
  • 高集成度和设计灵活性:STM32系列单片机全系列产品共用大部分引脚、软件和外设,优异的兼容性为开发人员带来最大的设计灵活性

单片机最小系统原理图如下图所示:


基于stm32单片机智能手环心率血压血氧体温佩戴检测APP设计_课程设计

实物图:

基于stm32单片机智能手环心率血压血氧体温佩戴检测APP设计_毕业设计_02


2.2 血压、心率、血氧检测电路设计

  • 该产品是一款多光谱生理数据测量模块,可准确测量脉搏波形、心率值、血氧值和血管微循环参数等信息。得益于获专利保护的前端传感器技术,模块灵敏度和信噪比在同类产品中得到大幅提升。模块结合特有的信号调理技术和算法,直接输出脉搏波形、心率值、血氧值和血管微循环参数,大大降低了系统复杂程度。用户系统只需通过串口即可和模块通信,并且直接获得测量结果。在精准易用的同时,还具备超小体积和超低功耗的特性,提升了智能穿戴设备的续航时间和外观设计的灵活性。

产品特性:

  • 脉搏波形、心率值、血氧值、血管微循环和参考血压等参数
  • 宽光谱高灵敏度的光传感器
  • 11.18mm*8.13mm超小体积

典型应用

  • 心血管慢性病管理
  • 有氧运动管理
  • 健康异常监测
  • 智能可穿戴设备
  • 医疗检测设备

其具体电路原理图如下图所示:

  • 实物图

2.3 ESP8266 WIFI无线通信电路设计

  • ESP8266-01s是由安信可科技开发的Wi-Fi模块,其核心处理器是ESP8266,这款处理器在较小的尺寸封装中集成了业界领先的Tensilica L106 超低功耗 32 位微型 MCU,支持 80 MHz 和 160 MHz 的主频,并带有 16 位精简模式。ESP8266-01s 支持RTOS,集成Wi-Fi MAC/BB/RF/PA/LNA,支持标准的IEEE802.11 b/g/n协议和完整的TCP/IP协议栈。这使得用户可以为现有设备添加联网功能,或者构建独立的网络控制器。
  • ESP8266-01s 以其高性能和低成本的特性,为Wi-Fi功能的嵌入提供了无限可能,特别适用于物联网和智能家居等应用场景

其具体电路原理图如下图所示:

基于stm32单片机智能手环心率血压血氧体温佩戴检测APP设计_stm32_03


实物图如下:

基于stm32单片机智能手环心率血压血氧体温佩戴检测APP设计_嵌入式硬件_04


2.4 OLED显示电路设计

  • OLED显示屏是一款无需背景光源,自发光式的显示模块。模块采用蓝色背景,显示尺寸控制在0.96英寸,采用OLED专用驱动芯片SSD1306控制。该模块支持通过I2C接口与控制器通信,支持高传输速率,能够实现60Hz的刷新频率。

其具体电路原理图如下图所示:

基于stm32单片机智能手环心率血压血氧体温佩戴检测APP设计_嵌入式硬件_05

实物图:



3、单片机代码展示

3.1 系统初始化

void HardWare_Init(void)
{
	Usart1_Init(38400);   //串口1  连接体征检测模块,发送命令与接收数据;同时还兼任系统打印调试信息
	//	Usart2_Init(115200);	 //串口2,驱动ESP8266用
	Usart3_Init(115200); //串口3初始化 连接wifi
	
	DIInit();     //佩戴检测初始化
	Beep_Init();  //蜂鸣器初始化
	KEY_Init();   //按键初始化
	OLED_Init();  //OLED初始化
	
	ShengMingTeZhengInit();
	
	WIF_ESP8266_AP_INIT();  //esp8266初始化为ap模式
	
	//清除数据
	memset(&sample_data, 0, sizeof(SampleData));
	memset(&show_data, 0, sizeof(ShowDataStr));
	
	//初始化数据
	sample_data.temp_threshold = 27;
	sample_data.xinlv_l_threshold = 60;
	sample_data.xinlv_h_threshold = 100;
	
	sample_data.shousuoya_l_threshold = 90;
	sample_data.shousuoya_h_threshold = 140;
	
	sample_data.shuzhangya_l_threshold = 60;
	sample_data.shuzhangya_h_threshold = 90;
	
	sample_data.spo2_threshold = 90;
}

3.2 手环佩戴检测程序初始化

void DIInit(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(DI_1_GPIO_RCC,ENABLE);//使能时钟

  GPIO_InitStructure.GPIO_Pin  = DI_1_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置成下拉输入
  GPIO_Init(DI_1_GPIO_PORT, &GPIO_InitStructure);//初始化引脚
}

3.3 OLED显示屏初始化

static void OLED_I2C_Configuration(void)
{
	I2C_InitTypeDef  I2C_InitStructure;
	GPIO_InitTypeDef  GPIO_InitStructure; 

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

	/*STM32F103C8T6芯片的硬件I2C: PB6 -- SCL; PB7 -- SDA */
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C必须开漏输出
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	I2C_DeInit(I2C1);//使用I2C1
	I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
	I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
	I2C_InitStructure.I2C_OwnAddress1 = 0x30;//主机的I2C地址,随便写的
	I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
	I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	I2C_InitStructure.I2C_ClockSpeed = 400000;//400K

	I2C_Cmd(I2C1, ENABLE);
	I2C_Init(I2C1, &I2C_InitStructure);
}

void OLED_Init(void)
{
	OLED_I2C_Configuration();
	OLED_Init_CMD();
	OLED_Fill(0x00);//全屏灭
}

3.4 ESP8266初始化

void WIF_ESP8266_AP_INIT(void)
{
  u3_printf("AT\r\n");
  delay_ms(2);
  u3_printf("AT+CWMODE=2\r\n");
  delay_ms(2);
  u3_printf("AT+CIPMUX=1\r\n");
  delay_ms(2);
  u3_printf("AT+CIPSERVER=1,8899\r\n");
  delay_ms(2);
  u3_printf("AT+CIFSR\r\n");
  delay_ms(2);
  u3_printf("AT+GMR\r\n");
  delay_ms(2);
}

4、Android Studio APP代码展示

4.3 APP创建网络通信代码

netMessageHandle = new Handler() {            //消息 handler 对象
            public void handleMessage(Message msg) {
                if (msg.what == 0x1233) {                             //如果消息是 0x1233,则是从 线程中 传输过来的数据
                    public_info.connect_cnt = 1;
                    Toast.makeText(getApplicationContext(),"设备连接成功",Toast.LENGTH_SHORT).show();
                    vib.vibrate(100);     //震动
                }
                if (msg.what == 0x1234) {
                    show_result((byte [])msg.obj,8);                    //将 缓冲区的数据显示到 UI
                }
                if (msg.what == 0x1235) {
                    vib.vibrate(100);     //震动
                    Toast.makeText(getApplicationContext(), "网络线程退出:" + msg.obj+" 重新连接 :" + public_info.connect_cnt, Toast.LENGTH_LONG).show();
                    //网络断开了,需要重新连接
                    if (public_info.connect_cnt++ < 3) {
                        client_info_thread = new clientInfoThread(netMessageHandle);
                        client_info_thread.start();
                    }
                }
            }
        };

4.2 APP与单片机通信代码

buttonRefresh = (Button)findViewById(R.id.buttonRefresh);
        buttonRefresh.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                byte[] msg = new byte[8];
                msg[0] = (byte) 0x85;
                msg[1] = (byte) 0x09;
                msg[2] = (byte) 0x00;
                msg[3] = (byte) 0x00;
                msg[4] = (byte) 0x00;
                msg[5] = (byte)0;
                msg[6] = (byte)0;
                msg[7] = (byte) (msg[0] + msg[1] +msg[2] +  msg[3] +msg[4] +msg[5] + msg[6]); //校验和
                send_buffer_to_network(msg,(byte) msg.length);
                vib.vibrate(100);     //震动
            }
        });