STM32项目分享:心率血氧手环(可报警)

 目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

1.PCB图 

2.PCB板打样焊接图

五、程序设计 

六、实验效果 

七、资料内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1z1421d7Yp/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末) 

二、项目简介

1.功能详解

基于STM32的心率血氧手环(可报警)。功能如下:

  1. 心率血氧采集:MAX30102采集人体心率和血氧
  2. 计步:ADXL345三轴加速传感器记录人行走步数
  3. 时间显示:外部DS1302时钟模块读取和保存当前实时时间(支持掉电保存)
  4. 温度采集:DS18B20温度传感器采集人体体温
  5. OLED显示:显示当前时间、体温、心率、血氧和步数信息
  6. 按键控制:调整时间和日期,为心率、血氧和体温设置正常阈值范围
  7. 异常报警:当心率、血氧和体温在阈值范围外时触发声光报警(蜂鸣器报警、指示灯闪烁)
  8. 蓝牙APP控制:手机端蓝牙app显示心率、血氧、体温和步数信息,并可设置阈值上下限和控制步数清零
  9. 跌倒检测:板子倾斜90°持续5秒以上触发跌倒监测报警

2.主要器件

  • STM32F103C8T6最小系统板
  • OLED显示屏(4针I2C协议)
  • MAX30302心率血氧传感器
  • ADXL345加速度传感器
  • DS18B20温度传感器
  • 蓝牙模块(BT04-A)
  • 蜂鸣器
  • LED灯

三、原理图设计

四、PCB硬件设计

1.PCB图 

2.PCB板打样焊接图

五、程序设计 

int main(void)
{
	unsigned char i;
	DelayInit();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	I2C_Configuration(); //IIC初始化
	OLED_Init(); //OLED初始化
	KEY_Init(); //按键初始化
	DelayMs(200);
	CheckNewMcu();
  OLED_CLS();//清屏
	DS18B20_Init();
	DS1302_Init(&SysDate); 
	DelayMs(100);
	for(i=0;i<8;i++)OLED_ShowCN(i*16,2,i+8,0);//测试显示中文:欢迎使用使能手环
	DelayMs(1000);
	OLED_CLS();//清屏
	DS1302_DateRead(&SysDate);//读时间
	OLED_CLS();//清屏
	for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//测试显示中文:心率
	for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//测试显示中文:血氧
	for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//测试显示中文:步数
	OLED_ShowCentigrade(112, 2);    //℃
	IIC_init();//IIC初始化
	uart1_Init(9600);
	adxl345_init();//ADXL345初始化
	Init_MAX30102();//MAX30102初始化
	TIM2_Init(99,719);   //定时器初始化,定时1ms
	//Tout = ((arr+1)*(psc+1))/Tclk ; 
	//Tclk:定时器输入频率(单位MHZ)
	//Tout:定时器溢出时间(单位us)
	while(1)
	{
		  shanshuo=!shanshuo;
		  KeySettings();
	    DisplayTime();
		  if(setn == 0)//不在设置状态下,读取相关数据
			{
					DisplayTemperature();
					GetSteps();
					GetHeartRateSpO2();
				  if(fallTime==0)
					{
							if(displayfall==0)
							{
									displayfall=1;
								  OLED_CLS();//清屏
								  for(i=0;i<3;i++)OLED_ShowCN(i*16+48,2,i+64,0);//测试显示中文:跌倒
								  UsartSendReceiveData();
								  DelayMs(1000);DelayMs(1000);
								  OLED_CLS();//清屏
									for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//测试显示中文:心率
									for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//测试显示中文:血氧
									for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//测试显示中文:步数
									OLED_ShowCentigrade(112, 2);    //℃
							}
					}
			}
			UsartSendReceiveData();
			DelayMs(10);
	}
}
void TIM2_IRQHandler(void)//定时器2中断服务程序,用于记录时间
{ 
	  static u16 timeCount1 = 0;
	  static u16 timeCount3 = 0;
      if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{ 
			TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位  
			timeCount1 ++;
		    if(timeCount1 >= 800)  
			{
				timeCount1 = 0;
				sendFlag = 1;
				if(tiltFlag)
				{
					if(fallTime>0)fallTime--;  //跌倒时间倒计时
				}
			}
			timeCount3 ++;
			if(timeCount3 >= 100) 
			{
				timeCount3=0;
				if(fallTime==0){        //跌倒蜂鸣器报警
				BEEP=1;
				} 
			    else
				{
					if(((hrAvg!=0)&&(hrAvg>=xinlvMax||hrAvg<=xinlvMin))||((spo2Avg!=0)&&(spo2Avg<=spo2Min))||(temperature>=tempMax||temperature<=tempMin))//不在范围蜂鸣器报警
					{
						BEEP=~BEEP;
						beepFlag|=0x01;	
					}else
					{	
						beepFlag&=0xFE;
						BEEP=0;
					}
				}
			}
		}
}

六、实验效果 

七、资料内容

项目分享

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值