单片机毕业设计——基于STM32的心率、血氧、体温检测系统


前言

  • 大家好,我是三🐎!一晃又五个月多没发文章了,现如今也成功上岸信通研究生,想着把本科当时的毕业设计和大家分享一下!感谢大家的阅读!希望对有些读者有帮助,欢迎评论指错!

一、项目概述

1.1 系统概述

脉搏、血氧和体温是人体基本的生理特征参数,现如今人们希望可以在不影响工作、学习、生活的同时也能满足他们随时随地检测这些基本的生理特征参数的需求,了解他们的身体状态,以便及时就医。
基于以上需求分析,基于STM32的人体健康检测系统(心率、血氧、体温)设计应遵循以下原则:
(1)体积小,易于携带,操作简单。
(2)安全,检测结果准确。
(3)功耗低。
(4)无线远程通信。

1.2 功能设计

依据上述需求划分出以下几个关键功能模块:用于采集人体基本生理参数的数据采集模块、用于用户和系统交互的人机交互模块、用于实时报警的报警模块。

  • 数据采集模块:具体可分为用于采集检测人体脉搏血氧的脉搏血氧模块和用于采集检测人体体温的体温模块。
  • 人机交互模块:具体可分为用于设置不同参数报警范围和接收短信的手机号码的按键设置模块和用于实时显示设置信息和检测值的显示模块。
  • 报警模块模块:具体可分为用于远程报警的短信发送模块和实时的声光报警模块。

系统整体方案设计如下图所示:

在这里插入图片描述


二、项目硬件实物设计

本文所设计的系统硬件模块包括STM32主控核心、MAX30102脉搏血氧模块、DS18B20温度模块、GSM短信模块、LCD显示模块、声光报警模块、按键设置与安全电源模块,硬件实物采用USB 5V DC数据线进行供电,用户可以将USB线连接手机充电器为系统供电。系统硬件设计框图如下图所示。
在这里插入图片描述

2.1 系统硬件选型

  • 主控芯片选型
    采用了STM32F103C8T6芯片,它是一个简洁、实用高效的开发平台,为研究者提供了一个快速原型设计和实验的环境。实际上用的是STM32F103C8T6最小系统板,实物图如下所示。
    在这里插入图片描述

  • 脉搏血氧模块选型
    本系统采用了MAX30102心率血氧传感器,它集成了一个红光LED和一个红外光LED、光电检测器、光器件以及带环境光抑制的低噪声电子电路。MAX30102具有集成度高、功耗低、精度高以及体积小等特点,可佩戴于手指或手腕处,非常适用于本系统的脉搏血氧采集功能。实物如下图所示。
    在这里插入图片描述

  • 体温模块选型
    本系统体温采集模块采用了美国DALLAS半导体公司生产的DS18B20,它是一种单总线数字温度测量芯片,采用不锈钢封装,实物如下图所示。具备小巧体积、低功耗、抗干扰性强和高精度等特点,用户可以将其放置腋下来测量体温。
    在这里插入图片描述

  • 显示模块选型
    本系统采用LCD1602液晶显示屏,它是一个字符型的液晶显示模块,在市面上十分常见。这款液晶显示屏的主要优势包括低能耗、体积小和低辐射,非常符合本系统的高性价比、低能耗和小型化便携的设计要求。实物如下图所示。
    在这里插入图片描述

  • 短信模块选型
    本系统选用GSM SIM800L模块,采用短信通信的方式实现远程报警功能。模块具有低成本、低功耗、高性能、体积小、使用方便等优点,非常适用于本系统的远程报警的需求。实物如下图所示。在这里插入图片描述用户使用该模块进行短信通信时,需要将一张移动的电话卡插入SIM卡槽之中。(亲测移动卡有效)

2.2 STM32单片机最小系统

单片机最小系统电路,又称最小应用电路,是指用最少的元件组成的单片机可以工作的系统。
STM32最小系统主要有以下五大部分:STM32F103C8T6芯片、电源电路、晶振电路、复位电路、调试下载电路。
本系统采用STM32F103C8T6最小系统板,其详细电路不在此赘述,读者可本站内自行寻找。

2.3 外设电路

  • MAX30102心率血氧模块
    本系统脉搏血氧检测采用MAX30102传感器,该芯片在原有硬件结构基础上增加了一些外围电路和软件算法,使得该脉搏血氧传感器能更精确地测量出人体的脉搏以及相应的血氧值,从而达到对健康监测的目的。
    在这里插入图片描述
    MAX30102心率血氧模块外围电路连接图如下所示。
    在这里插入图片描述其中VIN引脚接 3.3V电源;SCL引脚和SDA引脚分别连接最小系统板的PB06和PB07引脚,用作IIC通信的时钟线和数据线;INT、RD和LRD引脚不连接;GND引脚接地。

  • DS18B20体温模块
    本系统体温检测采用DS18B20温度传感器,它只有3个引脚,其中VDD为电源引脚,GND为接地引脚,DQ引脚为I/O总线数据引脚。在DQ端与电源输入口VDD间连接一个上拉电阻,电阻值为10K,且DQ引脚还连接STM32F103C8T6最小系统板的PB15引脚。
    其中,上拉电阻的作用是确保在没有数据传输时,DQ引脚保持在高电平状态(逻辑1)。这对于单总线通信是必要的,因为DS18B20在空闲状态下需要保持高电平。

在这里插入图片描述

  • LCD显示模块
    LCD显示模块电路如下图所示,其中RT1为电位器,用于调节液晶屏背光亮度。VSS引脚连接RT电位器的3号引脚并接地;D0-D7分别连接STM32F103C8T6最小系统板的PA07-PA00引脚;VDD、BLA引脚连接+5V电源VCC;BLK引脚接地。VO引脚连接RT电位器的2号引脚;RS、RW、E分别连接STM32F103C8T6最小系统板的PC13~PC15引脚。
    在这里插入图片描述

  • 报警模块
    报警模块可分为远程报警和声光报警两部分。
    远程报警实际上就是使用SIM800L模块的短信发送功能,将所需要发送的短信内容发送给指定的手机号码,电路图如下所示。
    在这里插入图片描述模块的RXD(串口接收端)、TXD(串口发送)端分别与最小系统板的PA09、PA10引脚连接,组成串口通信。其中还需要一个1000uF的电容和一个1N4007 二极管,1000uF电容用于平滑电源电压,提供稳定的电源。电容可以储存电能,帮助在电源波动时维持电压稳定,尤其是在模块启动或负载变化时。1N4007 二极管用于防止反向电流。二极管只允许电流单向流动,保护电路中的其他元器件不受反向电压的影响,确保电源的安全性。
    声光报警
    在这里插入图片描述由于蜂鸣器工作所需的电流较大,而STM32单片机上电后 口引脚为高阻态,直接用I/O口不足以提供大电流,不能直接驱动蜂鸣器,故需要放大电路,而S8050三极管的作用是放大电流。三极管集电极连接外部VCC,基极连接1K限流电阻后与最小系统板PB09引脚相连,通过该引脚提供高电平给三极管,发射极与蜂鸣器正极连接,即可驱动有源蜂鸣器报警。

  • 按键设置模块
    用户通过按键实现设置体温报警上限和下限、脉搏报警上限和下限、血氧报警下限以及接收报警短信的手机号码。
    在这里插入图片描述

2.4 实物焊接

本系统实物的焊接采用了洞洞板(万能板)焊接,成本低廉,使用方便,但容易受到外界干扰,需要有一定的自主焊接能力。在焊接完成后,不要着急进行软件程序的烧录,一定要用万用表检测通断,整体再检查一遍。系统实物如下图所示。有绘制原理图和PCB设计基础的同学可以使用嘉立创EDA进行原理图绘制及PCB设计,最终打板
在这里插入图片描述


三、项目软件设计

本系统的软件代码设计采用Keil uVision5编写。通过向STM32单片机中烧录编写的程序,来实现系统所需要完成的全部功能。软件流程如图所示。
在这里插入图片描述
具体的模块程序如下。

  1. 脉搏血氧检测模块

脉搏血氧检测模块是利用MAX30102心率血氧传感器常见的驱动程序,在本站中搜索即可,本文不再详细介绍。

  1. 体温检测模块

系统控制DS18B20进行采集用户的体温时,即对其进行相关的寄存器配置。注:DS18B20的初始化程序、写/读字节程序在本站内也有很多,读者可自行搜索。
体温检测模块的主要程序代码如下:

float ReadTemperature(void)
{
    unsigned char TPH;				//存放温度值的高字节
    unsigned char TPL;				//存放温度值的低字节
    short i16=0;
    float f32=0;

	DS18B20_Init();
    DS18B20_WriteByte(0xCC);  		//跳过ROM命令
    DS18B20_WriteByte(0x44);   		//开始转换命令
    DS18B20_Init();
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0xBE);        //读暂存存储器命令
    TPL = DS18B20_ReadByte();       //读温度低字节
    TPH = DS18B20_ReadByte();       //读温度高字节
    i16 = 0;
    i16 = (TPH<<8) |TPL;			// 将高位(MSB)与低位(LSB)合并
    f32 = i16 * 0.0625;				// 12bit精度时温度值计算
    return(f32);					// 返回读取到的温度数值(float型)
}
  1. 显示模块
    本文选取了在按键设置时的显示心率上下限作为例子,心率、血氧与此类似故不再赘述。
void displaySetValue(void)  //显示设置的值
{
		switch(setn) //按键1按的次数
		{
				case(1):
							sprintf(display,"%03d",(int)heartrate_min);
				 			LCD_Write_String(4,1,(u8 *)display);	//显示心率下限
							sprintf(display,"%03d",(int)heartrate_max);
							LCD_Write_String(13,1,(u8 *)display);	//显示心率上限
			          		LCD_Write_Com(0x80+0x40+6);
							LCD_Write_Com(0x0F);
			   		        break;
			    case(2):
			    			sprintf(display,"%03d",(int)heartrate_min);
							LCD_Write_String(4,1,(u8 *)display);	//显示心率下限
							sprintf(display,"%03d",(int)heartrate_max);
							LCD_Write_String(13,1,(u8 *)display);	//显示心率上限	
			         		LCD_Write_Com(0x80+0x40+15);
							LCD_Write_Com(0x0F);
			                break;
		}
}
  1. 声光报警模块
    使用本系统检测自身身体健康状况时,若检测出心率、血氧、体温的测量值不在系统设置的正常范围内,实现声光报警功能,实现代码如下。
if(	(heartrate!=0&&(heartrate>=heartrate_max || heartrate<=heartrate_min)) ||
	(temperature>=temperature_max || temperature<=temperature_min)         ||
	(SPO2!=0&&(SPO2<=SPO2_Min)))
	{
		beep = ~beep;//蜂鸣器滴滴的响
	}
else
	{
		beep = 0;   //蜂鸣器关闭
	}	
  1. 短信发送模块
    使用本系统检测自身身体健康状况时,若检测出心率、血氧、体温的测量值不在系统设置的正常范围内,也可以实现发送短信,实现远程报警。实现代码如下。
if(sendSmsFlag != 0) //发送短信
{
		char TEMP_BUF[100]; 
		memset(SEND_BUF,0,sizeof(SEND_BUF));      //清空缓冲区
		switch(sendSmsFlag)
		{
			case(1): strcat(SEND_BUF,"8BF76CE8610FFF0C5FC373874E0D5728830356F4FF01"); break;		//请注意,心率不在范围!
			case(2): strcat(SEND_BUF,"8BF76CE8610FFF0C88406C274E0D5728830356F4FF01"); break;		//请注意,血氧不在范围!
			case(3): strcat(SEND_BUF,"8BF76CE8610FFF0C6E295EA64E0D5728830356F4FF01"); break;		//请注意,温度不在范围!
			default: break; 
		}
		memset(TEMP_BUF,0,sizeof(TEMP_BUF));
		sprintf(TEMP_BUF,"5FC37387003A003%1d003%1d003%1dFF0C88406C27003A003%1d003%1d003%1dFF0C6E295EA6003A003%1d003%1d002E003%1d21033002",heartrate/100,heartrate%100/10,heartrate%10,
							 SPO2/100,SPO2%100/10,SPO2%10,temp/100,temp%100/10,temp%10);
		strcat(SEND_BUF,TEMP_BUF); 
		sim800_send_sms((char *)SEND_BUF);//发送短信
		sendSmsFlag = 0;
}
  1. 按键设置模块
    本系统检测自身身体健康状况时,可以通过按键1~3设置脉搏、血氧、体温报警范围和远程报警接收短信的手机号码,按键1为菜单键/跳转键,按键2为+键,按键3为-键,下面给出了按键1与按键2对应的代码,按键3与按键2类似,这里不再赘述。
void keyscan(void)
{
	if(key1 == 0)//设置按键按下
	{
	 	delay_ms(10);//消抖
		if(key1 == 0)
		{
		 	while(key1 == 0);	//等待按键松开
			beep = 0;   		//蜂鸣器关闭
			setn++;				//记录设置按键按下的次数
			if(setn == 1)		//设置心率
			{
				 	LCD_Write_String(0,0,"  Set Heartrate ");//显示字符串
					LCD_Write_String(0,1,"min:     max:   ");
			}				
			if(setn == 3)		//设置温度
			{
					LCD_Write_String(0,0,"min:            ");//显示字符串
					LCD_Write_String(0,1,"max:            ");
				 	LCD_Write_Char(9,0,0xDF);
					LCD_Write_Char(10,0,'C');
				 	LCD_Write_Char(9,1,0xDF);
					LCD_Write_Char(10,1,'C');
			}				
			if(setn == 5)		//设置血氧
			{
					LCD_Write_String(0,0,"     Set SPO2   ");//显示字符串
					LCD_Write_String(0,1,"min:            ");
			}	
  			if(setn == 6)
			{
					LCD_Write_String(0,0, "Set the PhoneNum");//第一行显示的内容
					LCD_Write_String(0,1, "                ");//第二行显示的内容
					LCD_Write_String(2,1, (u8 *)PhoneNumber);
					LCD_Write_Com(0x80+0x40+2);
					LCD_Write_Com(0x0F);
			}
			if(setn >= 7)
			{
					LCD_Write_Com(0x80+0x40+setn-4);
					LCD_Write_Com(0x0F);
			}	
			displaySetValue();
			if(setn >= 17)		//退出设置
			{
				  	setn = 0;
				 	LCD_Write_Com(0x0C);//关闭光标
				 	LCD_Clear();//清屏
					STMFLASH_Write(FLASH_SAVE_ADDR + 0x40,(u16*)PhoneNumber,11);  //退出设置,存入设置的手机号
				  /* 显示摄氏度符号℃ */
					LCD_Write_Char(14,0,0xDF);
					LCD_Write_Char(15,0,'C');
			}
		}
	}
	if(key2 == 0)//加键按下
	{
	 	delay_ms(100);
		if(key2 == 0)
		{
			if(setn == 1)//设置心率
			{
					if(heartrate_min<heartrate_max)heartrate_min++;
			}				
			if(setn == 2)
			{
					 if(heartrate_max<200)heartrate_max++;
			}
			if(setn == 3)//设置温度
			{
					if(temperature_min<temperature_max)temperature_min+=0.1;
			}				
			if(setn == 4)
			{
					 if(temperature_max<99.9)temperature_max+=0.1;
			}
			if(setn == 5)//设置血氧
			{
					if(SPO2_Min<200)SPO2_Min++;
			}	
       		if(setn >= 6)
			{
					PhoneNumber[setn-6]++;  
					if(PhoneNumber[setn-6]>'9')PhoneNumber[setn-6]='0';
					LCD_Write_String(2,1, (u8 *)PhoneNumber);
					LCD_Write_Com(0x80+0x40+setn-4);
					LCD_Write_Com(0x0F);
			}				
			displaySetValue();
		}
	}
}

四、系统调试

在Keil5中将运行无误的代码,使用ST-Link烧录到STM32F103C8T6最小系统板上,随后上电进行系统测试。具体可分为功能测试和误差测试,功能测试时,需要测试系统的心率、血氧、体温的检测功能,数据显示功能,按键设置功能,声光报警及短信发送功能;误差测试时,需要选择对照组进行误差分析,分析该系统是否能达到检测的目的,是否符合实验预期。

五、测试结果分析

通过测试,系统各项功能运行正常、稳定,能达到预期效果。

  • 数据采集部分:通过STM32主控芯片对传感器进行对应的控制配置,获取被检测人员的脉搏、血氧、体温等数据,实现了脉搏、血氧、体温的检测功能。
  • 报警部分:采用GSM模块、蜂鸣器和发光二极管,当脉搏、血氧、体温的测量值不在系统设定的正常范围内,可实现声光及远程发送短信报警。
  • 按键设置及显示部分:用户的检测结果可以在液晶屏上显示,也可以通过按键设置各参数的报警范围和接收报警短信的手机号码。

总结

本文设计了一种基于STM32的人体健康检测系统。整个系统使用STM32F103C8T6芯片作为主控核心,完成脉搏、血氧、体温参数的采集、处理等,检测结果可以实时显示在液晶显示屏。用户可以在人机交互模块利用按键设置脉搏、血氧、体温的报警范围,当系统检测到数据异常时,系统可以及时声光报警并发送报警短信给用户监护人。
具体功能实现如下:
(1)脉搏、血氧、体温的检测功能。
(2)数据显示及参数设置功能。
(3)声光及远程发送短信报警功能。
最后通过测试,系统可以满足设计需求,实现预期目标。


附录


附录A 元件清单图
在这里插入图片描述
大家有什么问题可以评论或者私信!!!希望大家可以多多收藏与点赞!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐三馬

你的鼓励将是对我最大的帮助!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值