单片机课程设计:基于STM32的心率血氧检测报警系统

这篇具有很好参考价值的文章主要介绍了单片机课程设计:基于STM32的心率血氧检测报警系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

  本文使用搭载STM32F103VET6主控芯片的野火指南者、野火3.2寸LCD屏幕和MAX30102心率血氧传感器实现心率血氧采集并显示的效果。

(文末附完整程序下载链接)


一、设计任务

  1.可以通过MAX30102心率血氧传感器对用户的心率血氧进行采集,并用实时显示在LCD液晶屏上;
  2.可以设定一个固定的报警温度值显示在液晶屏上;
  3.用户心率低于60或者高于阈值报警、用户血氧低于阈值报警,报警形式包括:蜂鸣器发出滴滴声,LCD中心率血氧字符根据不同情况显示相应的报警颜色,报警颜色有红、蓝、品红;
  4.能够通过按键动态修改报警温度阈值;
  5.LCD显示屏下方绘制心率波形图;
  6.ESP8266将数据发送给TCP助手;

二、系统硬件设计

1.元器件选用

  1、STM32f103VET6单片机一块
  2、ESP8266一块
(此项目使用野火指南者,指南者自带ESP8266,其他型号单片机杜邦线自连即可)
  3、MAX30102心率血氧传感器
  4、3.2寸LCD显示器
  5、杜邦线5根

2.系统模型设计

  按键1设置心率阈值,按键2设置血氧阈值,MAX30102检测用户心率和血氧值。
  当检测的用户心率值大于心率阈值时LCD当前心率一栏变为红色、蜂鸣器报警、LED红灯闪烁、串口输出警告。
  当检测的用户心率值底于60时LCD当前心率一栏变为品红色、蜂鸣器报警、LED红灯闪烁、串口输出警告。
  当检测的用户血氧浓度小于血氧阈值时LCD显示血氧过低警告、蜂鸣器报警、蓝灯闪烁、串口输出心率过低警告。
  血氧波形图将检测到的血氧数据绘制出来,在未检测时y轴绘制为0。相应的颜色警告也会在波形图中显示。
  ESP8266将单片机采集的数据通过联网的方式发送到TCP助手中并显示。
单片机课程设计:基于STM32的心率血氧检测报警系统,STM32,嵌入式,stm32,单片机,嵌入式硬件

单片机课程设计:基于STM32的心率血氧检测报警系统,STM32,嵌入式,stm32,单片机,嵌入式硬件
单片机课程设计:基于STM32的心率血氧检测报警系统,STM32,嵌入式,stm32,单片机,嵌入式硬件
单片机课程设计:基于STM32的心率血氧检测报警系统,STM32,嵌入式,stm32,单片机,嵌入式硬件

 演示视频:

波形显示

3.硬件连接

  1、本系统使用野火指南者,由于该单片机自带ESP8266,因此无需连接。如果使用其他型号单片机,根据ESP8266用户手册连接即可。
  2、STM32F103与MAX30102的连接,VCC<->3.3V,GND<->GND,SCL<->PC7,SDA<->PC8,IM<->PC9。

总电路连接图:
单片机课程设计:基于STM32的心率血氧检测报警系统,STM32,嵌入式,stm32,单片机,嵌入式硬件

三、系统程序设计

1.程序流程

  基于STM32的血氧仪控制系统总体软件的设计,可以分为系统初始化、数据采集、数据处理、数据显示和系统控制。系统初始化包括各模块的初始化,包括MAX30102模块、LCD显示模块、按键模块、蜂鸣器模块等。同时还需要初始化串口通信模块。
  采集数据主要是获取的血氧数据,进行数字转换和滤波处理,得到血氧饱和度和脉搏率数据。数据处理是对采集到的血氧饱和度和脉搏率数据进行处理。同时,还需要对数据进行校验和处理,确保数据的准确性和可靠性。将处理后的数据通过LCD显示模块显示出来。同时,还需要通过蜂鸣器模块进行声音提示,例如当血氧饱和度低于一定阈值时,发出警报声。系统控制即通过按键控制模块控制系统的工作模式,如调节警报阈值等。

程序设计流程图:
单片机课程设计:基于STM32的心率血氧检测报警系统,STM32,嵌入式,stm32,单片机,嵌入式硬件
WiFi运行逻辑图:
单片机课程设计:基于STM32的心率血氧检测报警系统,STM32,嵌入式,stm32,单片机,嵌入式硬件

2.主程序

项目部分程序示例。
main.c

int main()
{
	/* 初始化 */
    USART_Config ();    //初始化串口1
	NVIC_Configuration();
    CPU_TS_TmrInit();   //初始化DWT计数器,用于延时函数
    LED_Init();         //初始化RGB彩灯
	EXTI_Key_Config();  //KEY中断初始化
	BEEP_GPIO_Config(); //初始化蜂鸣器引脚
	ESP8266_Init();     //初始化WiFi模块使用的接口和外设
	ILI9341_Init();     //LCD 初始化  
	max30102_init();    //max30102初始化
	ILI9341_GramScan(6);    //LCD显示模式 	
	
	ESP8266_StaTcpClient_Unvarnish_ConfigTest();   //对ESP8266进行配置
	
	max30102_read();  //数据预处理
	LCD_SetFont(&Font8x16);  //LCD显示字体		
	LCD_SetColors(WHITE,BLACK);//LCD黑底白字,这样显示它别致
    ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);	/* 清屏,显示全黑 */
	
    while (1)
    {
		max30102_control();  //max30102控制函数
		ESP8266_Sendmax30102DataTest();//LCD显示及串口\网络数据发送
		drawCurve(280,dis_hr);//LCD画波形,第一个参数是LCD显示起始位置,第二个是波形的数值
	}
}

max30102_control(); max30102控制函数

void max30102_control()
{
	i=0;
	un_min=0x3FFFF;
	un_max=0;
	//将前100组样本转储到存储器中,并将最后400组样本移到顶部
	for(i=100;i<500;i++){
			aun_red_buffer[i-100]=aun_red_buffer[i];
			aun_ir_buffer[i-100]=aun_ir_buffer[i];
			//update the signal min and max
			if(un_min>aun_red_buffer[i])
			un_min=aun_red_buffer[i];
			if(un_max<aun_red_buffer[i])
			un_max=aun_red_buffer[i];
	}
	//在计算心率之前采集100组样本。
	for(i=400;i<500;i++){
			un_prev_data=aun_red_buffer[i-1];
			while(MAX30102_INT==1);
			max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp);
			aun_red_buffer[i] =  (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2];    // Combine values to get the actual number
			aun_ir_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];   // Combine values to get the actual number
			if(aun_red_buffer[i]>un_prev_data){
					f_temp=aun_red_buffer[i]-un_prev_data;
					f_temp/=(un_max-un_min);
					f_temp*=MAX_BRIGHTNESS;
					n_brightness-=(int)f_temp;
					if(n_brightness<0)
					n_brightness=0;
			}else{
					f_temp=un_prev_data-aun_red_buffer[i];
					f_temp/=(un_max-un_min);
					f_temp*=MAX_BRIGHTNESS;
					n_brightness+=(int)f_temp;
					if(n_brightness>MAX_BRIGHTNESS)
					n_brightness=MAX_BRIGHTNESS;
			}
		//通过USART将样本和计算结果发送到终端程序
		if(ch_hr_valid == 1 && n_heart_rate<120){//**/ ch_hr_valid == 1 && ch_spo2_valid ==1 && n_heart_rate<120 && n_sp02<101
			dis_hr = n_heart_rate;
			dis_spo2 = n_sp02;
		}else{
			dis_hr = 0;
			dis_spo2 = 0;
		}
	}
			maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);

	if(dis_hr == 0 && dis_spo2 == 0)  //**dis_hr == 0 && dis_spo2 == 0
	{
		sprintf((char *)str,"HR:--- SpO2:--- ");//**HR:--- SpO2:--- 
		
		ILI9341_DispStringLine_EN_CH(LINE(4),"        当前心率:---");
		ILI9341_DispStringLine_EN_CH(LINE(6),"        当前血氧:---");
	}else{
		sprintf((char *)str,"HR:%3d SpO2:%3d ",dis_hr,dis_spo2);//**HR:%3d SpO2:%3d 
		
		LCD_SetTextColor(GREEN);
		sprintf(get_hr_char,"        当前心率:%d ",dis_hr);
		LCD_ClearLine(LINE(4));
		ILI9341_DispStringLine_EN_CH(LINE(4),get_hr_char); 	

		LCD_SetTextColor(GREEN);
		sprintf(get_spo2_char,"        当前血氧:%d%%",dis_spo2);
		LCD_ClearLine(LINE(6));
		ILI9341_DispStringLine_EN_CH(LINE(6),get_spo2_char); 
	}

}

ESP8266_Sendmax30102DataTest();LCD显示以及数据发送

void ESP8266_Sendmax30102DataTest(void)
{
	char cStr[170]={0};
	uint8_t ucStatus;
	
	LCD_SetTextColor(WHITE);
	ILI9341_DispStringLine_EN_CH(LINE(1),"        血氧仪控制系统   ");
	LCD_SetTextColor(GREEN);
	sprintf(set_hr_char,"        心率阈值:%d ",set_hr_max);
    LCD_ClearLine(LINE(3));
	ILI9341_DispStringLine_EN_CH(LINE(3),set_hr_char); 

	LCD_SetTextColor(GREEN);
	sprintf(set_spo2_char,"        血氧阈值:%d%%",set_spo2);
    LCD_ClearLine(LINE(5));
	ILI9341_DispStringLine_EN_CH(LINE(5),set_spo2_char); 

	if(dis_hr == 0 && dis_spo2 == 0)  //max30102未检测
	{
		printf("Max30102 not detected!/r/n");
		LCD_SetTextColor(GREEN);
		LCD_ClearLine(LINE(18));
		LCD_ClearLine(LINE(19));
		PBout(5)=1;//灯灭
		PBout(1)=1;//灯灭
		BEEP( OFF );//蜂鸣器关
	}else{                            //max30102开始检测
		/* 显示血氧 */
		if(dis_spo2 >= set_spo2){                 
			LCD_ClearLine(LINE(19));
			LCD_SetTextColor(GREEN);//当前血氧一栏显示绿色
			sprintf(get_spo2_char,"        当前血氧:%d%% ",dis_spo2);
			LCD_ClearLine(LINE(6));	/* 清除单行文字 */
			ILI9341_DispStringLine_EN_CH(LINE(6),get_spo2_char);
			PBout(1)=1;//灯灭
			BEEP( OFF );//蜂鸣器关
		} else{   			//当前血氧低于阈值时颜色变蓝
			PBout(1)=0;//灯亮
			BEEP( ON );//蜂鸣器开
			LCD_SetTextColor(BLUE);
			LCD_ClearLine(LINE(6));	/* 清除单行文字 */
			sprintf(get_spo2_char,"        当前血氧:%d%% ",dis_spo2);
			ILI9341_DispStringLine_EN_CH(LINE(6),get_spo2_char);
			ILI9341_DispStringLine_EN_CH(LINE(19),"          血氧过低          ");
			printf("!!!血氧低于阈值!!!");         //串口输出
		}
		
		/* 显示心率 */
		if((dis_hr <= set_hr_max) && (dis_hr >= set_hr_min)){                 //当前心率一栏显示绿色
			LCD_ClearLine(LINE(18));
			LCD_SetTextColor(GREEN);
			LCD_ClearLine(LINE(4));	/* 清除单行文字 */
			sprintf(get_hr_char,"        当前心率:%d ",dis_hr);
			ILI9341_DispStringLine_EN_CH(LINE(4),get_hr_char);
			PBout(5)=1;//灯灭
			BEEP( OFF );//蜂鸣器关
		}else if( ( dis_hr <= set_hr_min ) && ( dis_hr != 0) ){
			LCD_SetTextColor(MAGENTA);
			LCD_ClearLine(LINE(4));	/* 清除单行文字 */
			sprintf(get_hr_char,"        当前心率:%d ",dis_hr);
			ILI9341_DispStringLine_EN_CH(LINE(4),get_hr_char);
			ILI9341_DispStringLine_EN_CH(LINE(18),"          心率低于60        ");
			printf("!!!心率低于60!!!");         //串口输出
			BEEP( ON );//蜂鸣器开
			PBout(5)=0;//灯亮
			
		}else{                              //当前心率超过阈值时颜色变红
			BEEP( ON );//蜂鸣器开
			PBout(5)=0;//灯亮
			LCD_SetTextColor(RED);
			LCD_ClearLine(LINE(4));	/* 清除单行文字 */
			sprintf(get_hr_char,"        当前心率:%d ",dis_hr);
			ILI9341_DispStringLine_EN_CH(LINE(4),get_hr_char);
			ILI9341_DispStringLine_EN_CH(LINE(18),"          心率过高          ");
			printf("!!!心率超出阈值!!!");         //串口输出
			
		}
	}
	
	
	if(dis_hr !=0 || dis_spo2 != 0 ){
		sprintf ( cStr, "POST /devices/92648495/datapoints?type=5 HTTP/1.1\napi-key:Yn2cDHrWmsTL62QUjHYu4RNtgPw=\nHost:api.zj.cmcconenet.com\nContent-Length:23\n\n,;xinlv,%3d;xueyang,%3d",dis_hr,dis_spo2);
		printf ( "%s", cStr );                                             //打印读取 DHT11 温湿度信息
		ESP8266_SendString ( ENABLE, cStr, 0, Single_ID_0 );               //发送 DHT11 温湿度信息到网络调试助手
	}
	  
	
  if ( ucTcpClosedFlag ){                                             //检测是否失去连接
    ESP8266_ExitUnvarnishSend ();                                    //退出透传模式
    do ucStatus = ESP8266_Get_LinkStatus ();                         //获取连接状态
    while ( ! ucStatus );
    if ( ucStatus == 4 ){                                             //确认失去连接后重连
      printf ( "\r\n正在重连热点和服务器 ......\r\n" );
      while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );  
      while ( !	ESP8266_Link_Server ( enumTCP, macUser_ESP8266_TcpServer_IP, macUser_ESP8266_TcpServer_Port, Single_ID_0 ) );
      printf ( "\r\n重连热点和服务器成功\r\n" );
    }
    while ( ! ESP8266_UnvarnishSend () );		
  }
}

drawCurve(280,dis_hr);LCD画波形,第一个参数是LCD显示起始位置,第二个是波形的数值

void drawCurve(int coord_x,short int rawValue)  
{
	//coord_xLCD显示起始位置坐标
	u16 x,y;
	int rawValue_value;
	rawValue_value = rawValue*280;//rawValue_value波形高度,280可修改
	y = coord_x - rawValue_value/280;  	//数据处理代码
	//这里之所以是120-rawValue/280,与屏幕的扫描方向有关,如果出现上下颠倒的情况,可以改成120 + 
	if(firstPoint){//如果是第一次画点,则无需连线,直接描点即可
		ILI9341_SetPointPixel(10,y);
		lastX=0;
		lastY=y;
		firstPoint=0;
	}
	else{
		x=lastX+1;
		if(x<240){  //不超过屏幕宽度
			ILI9341_DrawLine(lastX,lastY,x,y);
			lastX=x;
			lastY=y;
		}
		else{  //超出屏幕宽度,清屏,从第一个点开始绘制,实现动态更新效果
			ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);	/* 清屏,显示全黑 */
			ILI9341_SetPointPixel(10,y);
			lastX=0;
			lastY=y;
		}
  }
}

总结

  基于STM32的血氧仪控制系统是一个适合初学者的STM32设计,本系统设计包含了GPIO的配置、ESP8266的配置与使用、传感器MAX30102的使用、按键中断、串口发送信息、LCD显示等的使用。本系统主要部分即心率血氧采集和WiFi数据传输,比较适合初学者学习理论知识后对知识的总结和融会贯通。

下载

  下载包所含基于STM32的血氧仪控制系统程序一份,流程图、原理图若干。
单片机课程设计:基于STM32的心率血氧检测报警系统,STM32,嵌入式,stm32,单片机,嵌入式硬件

下载地址1:https://download.csdn.net/download/qq_50185399/88553380
下载地址2:http://cloud.tao-space.top/2023/05/28/13/595/
https://download.csdn.net/download/qq_50185399/88553380文章来源地址https://www.toymoban.com/news/detail-620353.html

到了这里,关于单片机课程设计:基于STM32的心率血氧检测报警系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通信工程毕设 基于Stm32的便携体测仪(心率 体温) - 单片机 嵌入式 物联网

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(23)
  • 基于单片机体温心率脉搏检测仪系统设计

    ** 单片机设计介绍, 基于单片机体温心率脉搏检测仪系统设计   基于单片机体温心率脉搏检测仪系统设计是一个综合性的项目,它结合了单片机技术、传感器技术和电子技术,实现了对人体体温、心率和脉搏的实时监测。以下是关于该系统设计的主要内容的概述: 一、系

    2024年04月10日
    浏览(24)
  • 0231-基于单片机的心率监测(蓝牙)电路设计

    1、采用51/52单片机(通用)作为主控芯片; 2、采用1602液晶显示:当前心率、报警上限、报警下限; 3、采用ST188红外对管检测心率,当单片机检测到大约第5次信号时,开始显示这5次信号算出的平均心率,当超过大约3秒没有检测到信号,清除心率; 4、当测试心率超出报警上下

    2024年02月19日
    浏览(17)
  • 基于单片机心率脉搏心率血压体温血氧检测系统的设计与实现

     功能介绍        本次设计通过32系列单片机STM32进行数据处理,配置引脚和JFC103传感器以及温度传感器进行数据通信。采用防水DS18B20进行腋下温度采集,通过单总线方式进行数据传输。心率血氧血压模块通过串口通信方式把采集到的数据发送给单片机,所有的信息我们通

    2024年02月07日
    浏览(48)
  • 【特纳斯电子】基于单片机的实用型心率计设计-实物设计

    资料查找方式: 特纳斯电子(电子校园网):搜索下面编号即可 T1712204C-SW 本设计是基于单片机的实用型心率计设计,主要实现以下功能: 1、通过心率血氧检测模块来检测心率的大小,温度模块检测温度。 2、当心率过高或者过低都会进行语音播报。 3、可以通过语音播报心

    2024年02月19日
    浏览(22)
  • 基于stm32单片机的电子称设计

    电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。 电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。电子称不但计

    2024年02月08日
    浏览(21)
  • 基于STM32单片机的智能视力保护台灯设计

    智能台灯以专门感应人体红外信号的红外传感器为基础,这意味着仅当有人的时候,红外传感器才输出一个信号,经放大处理后达到单片机的输入门限电压,单片机开始运行,台灯自动点亮。当人离开的时候,单片机控制台灯自动关闭,以达到节约用电的目的。此外,通过功

    2024年02月12日
    浏览(25)
  • STM32毕设分享 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年04月11日
    浏览(21)
  • 【毕业设计】基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年02月04日
    浏览(29)
  • 基于stm32单片机甲醛烟雾温湿度检测仪设计

    目录 第1章 绪论 1.1 引言 1.1.1甲醛的特性及危害 1.1.2甲醛的来源 1.2甲醛检测仪的种类 第2章  概述 2.1系统总概述 2.2总体方案设计 2.3硬件设计 2.4软件设计 第3章  硬件设计 3.1  硬件设计主电路图 3.2  硬件选择 3.2.1  MCU的选择与简介 3.2.3  数据采集系统 3.2.4  数据采集简介

    2023年04月08日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包