STM32开发实例_基于STM32单片机的血氧检测显示系统(电路图+PCB+程序+流程图)24-32-29

一.系统概述

血氧检测显示系统系统的功能如下:
1. 血氧采集控制:系统整合了血氧传感器,能够准确采集用户的血氧数据。
2. 数据显示:设备配备了显示屏,能够实时显示采集到的血氧数据,为用户提供即时监测功能。
3. 波形显示:显示屏能够以波形图形式展示血氧数据变化趋势,能直观地了解血氧水平的变化。
4. LED灯状态控制:设计了LED灯,用于显示系统工作状态或提醒用户。
5. 异常情况处理:当系统检测到血氧数据异常时,自动控制LED灯熄灭并触发蜂鸣器响。
通过以上设计,该智能系统不仅能够精确采集和显示血氧数据,还能以直观的波形图形式展示数据趋势,同时通过灯光和声音提醒用户异常情况,从而提升了系统的监测能力和用户的使用体验。

二.电路设计 

电路图采用Altium Designer进行设计:
1. 通过STM32F103C8T6单片机作为系统主控,最小系统电路是整个电路的核心;
2. 使用MAX30102血氧传感器进行血氧数据检测,采用IIC总线与单片机进行通信;
3. 通过0.96寸的OLED12864进行数据显示,采用IIC总线的形式与单片机进行通信;
4. 使用LED灯进行血氧状态提醒,LED灯的一端接VCC电源,另一端接单片机GPIO口;
5. 使用蜂鸣器进行报警,蜂鸣器采用的有源蜂鸣器,使用NPN三极管进行蜂鸣器进行驱动。

三.程序设计 

#include "sys.h"
#include "delay.h"
#include "math.h"
#include "key.h"
#include "max30102.h"
#include "OLED_I2C.h"
#include "algorithm.h"
#include "Control_Report_To_Police.h"
#include "bsp_adc.h"
/************************************************
版权:小常硬件
公众号:微信搜索“小常硬件“在公众号免费下载相关资料
************************************************/

int main(void)
 {	
 	 u8 str[30];
	static int i;
	static uint8_t x1,ch=0;
	uint32_t un_min, un_max, un_prev_data;  
	int32_t n_brightness;
	float f_temp;
	u8 temp[6],data[128]; 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	delay_init();	    	 //延时函数初始化	  
	max30102_init();	 
	n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps
	while(MAX30102_INT==1);   //wait until the interrupt pin asserts
	max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp);
	OLED_Init();            //OLED初始化
	OLED_CLS();             //OLED清屏
	OLED_ShowCN(32,2,0);		
	OLED_ShowCN(32+16,2,1);
	OLED_ShowCN(32+32,2,2);
	OLED_ShowCN(32+32+16,2,3);
	Before_State_Update(accur*0);
	OLED_CLS();
	Beep_init();
	Led0_init();
	KEY_Init();
  while(1)
	{
//		Before_State_Update(accur*dis_spo2);
		un_min=0x3FFFF;
		un_max=0;
		for(i=0;i<200;i++)
		{
				aun_red_buffer[i-100]=aun_red_buffer[i];
				aun_ir_buffer[i-100]=aun_ir_buffer[i];
				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];
		}
		for(x1=0;x1<128;x1++)
		{	
			for(i=100;i<200;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;
					}
					if(ch_hr_valid == 1 && n_heart_rate<120)
					{
						dis_hr = n_heart_rate;
						dis_spo2 = n_sp02;
					}
					else
					{
						dis_hr = 0;
						dis_spo2 = 0;
					}	
			}
	
			if(dis_spo2<25)dis_spo2=0;
			if(ch==1){
//				if(x1!=0)
				OLED_DrawWave(x1,accur*dis_spo2);//这是个画波形的函数	
			}else
			{
				OLED_ShowStr(0,2,str,2);	
			} 
			if(dis_spo2>90){Beep=1;Led0_1=1;}else {Beep=0;Led0_1=0;}
		}
		OLED_CLS();
		
	}	 
} 

四.资料内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小常硬件

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值