STM32--基于STM32F103的MAX30102心率血氧测量

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

本文介绍基于STM32F103ZET6+MAX30102心率血氧测量+0.96寸OLED(7针)显示(完整程序代码见文末链接)

一、简介

MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。它集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。

MAX30102采用一个1.8V电源和一个独立的5.0V用于内部LED的电源,应用于可穿戴设备进行心率和血氧采集检测,佩戴于手指点耳垂和手腕处。

标准的I2C兼容的通信接口可以将采集到的数值传输给Arduino、STM32、STC51等单片机进行心率和血氧计算。此外,该芯片还可以通过软件关断模块,待机电流接近为零,实现电源始终维持供电状态。
STM32--基于STM32F103的MAX30102心率血氧测量,STM32,stm32,嵌入式硬件,单片机,MAX30102,心率血氧测量
模块主要参数:

LED峰值波长器 :660nm/880nm
LED供电电压 : 3.3 ~ 5V
检测信号类型 : 光反射信号(PPG)
输出信号接口 : I2C接口
通信接口电压 : 1.8 ~ 3.3V ~ 5V(可选)

工作原理

光溶积法:利用人体组织在血管搏动时造成透光率不同来进行脉搏和血氧饱和度测量

光源:采用对动脉血中痒合血红蛋白(HbO2)和血红蛋白(Hb)有选择性的特定波长的发光二极管

透光率转化为电信号:动脉搏动充血容积变化导致这束光的透光率发送改变,此时由光电变换接收经人体组织反射光线,转变为电信号并将其放大输出。

STM32--基于STM32F103的MAX30102心率血氧测量,STM32,stm32,嵌入式硬件,单片机,MAX30102,心率血氧测量
模块原理图

STM32--基于STM32F103的MAX30102心率血氧测量,STM32,stm32,嵌入式硬件,单片机,MAX30102,心率血氧测量

引脚说明

管脚定义 说明
VIN 电源输入 1.6V-5.5V,一般3.3V
SDA IIC-SDA
SCL IIC-SCL
GND
INT INT 低电平有效中断(漏极开路)MAX30102 的中断引脚
IRD IR_DRV IR LED阴极和LED驱动器连接点,一般NC
RD R_DRV 红色LED阴极和LED驱动器连接点,一般NC

通讯协议

本模块采用I2C通讯方式,具有I2C/SMBus兼容的2线制由串行数据线(SDA)和串行时钟线(SCL),时钟速率高达400kHz。

设备地址:
STM32--基于STM32F103的MAX30102心率血氧测量,STM32,stm32,嵌入式硬件,单片机,MAX30102,心率血氧测量

本文主要介绍基于STM32F103ZET6和实现的MAX30102的心率和血氧测量,并显示在0.96寸的OLED(7针)屏幕上

二、接线图

设计中涉及STM32和MAX30102链接以及和OLED的管脚连接,具体连接脚说明如下:

STM32F103ZET6+MAX30102接线

STM32F103ZET6 MAX30102
3.3V Vin
GND GND
PC7 SCL
PC8 SDA
PC9 INT

STM32F103ZET6+0.96寸OLED接线,其中OLED选用的是7针OLED-4SPI通信

STM32F103ZET6 0.96寸OLED(7针)
3.3V VCC
GND GND
PA5 SCL/D0
PA6 SDA/D1
PA3 RST
PA4 DC
PA2 CS

STM32--基于STM32F103的MAX30102心率血氧测量,STM32,stm32,嵌入式硬件,单片机,MAX30102,心率血氧测量

三、代码函数(完整工程文件见文末连接)

主函数,主要实现心率和血氧测量并显示在OLED屏幕,且当超过阈值后会蜂鸣器报警

int main(void)
{ 
	//variables to calculate the on-board LED brightness that reflects the heartbeats
	uint32_t un_min, un_max, un_prev_data;  
	int i;
	int32_t n_brightness;
	float f_temp;
//	u8 temp_num=0;
	u8 temp[6];
	u8 str[100];
	u8 dis_hr=0,dis_spo2=0;

	NVIC_Configuration();
	delay_init();	    	 //延时函数初始化	  
	uart_init(115200);	 	//串口初始化为115200
	LED_Init();
	BEEP_Init();
	
	
	//OLED
	OLED_Init();
	OLED_ShowString(0,0,"  initializing  ",16);
	OLED_Refresh_Gram();//更新显示到OLED	 

	max30102_init();

	printf("\r\n MAX30102  init  \r\n");

	un_min=0x3FFFF;
	un_max=0;
	
	n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps
	//read the first 500 samples, and determine the signal range
    for(i=0;i<n_ir_buffer_length;i++)
    {
        while(MAX30102_INT==1);   //wait until the interrupt pin asserts
        
		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(un_min>aun_red_buffer[i])
            un_min=aun_red_buffer[i];    //update signal min
        if(un_max<aun_red_buffer[i])
            un_max=aun_red_buffer[i];    //update signal max
    }
	un_prev_data=aun_red_buffer[i];
	//calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples)
    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); 
	
	while(1)
	{
		i=0;
        un_min=0x3FFFF;
        un_max=0;
		
		//dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top
        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];
        }
		//take 100 sets of samples before calculating the heart rate.
        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;
            }
			//send samples and calculation result to terminal program through UART
			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;
			}
				printf("HR=%i, ", n_heart_rate); 
				printf("HRvalid=%i, ", ch_hr_valid);
				printf("SpO2=%i, ", n_sp02);
				printf("SPO2Valid=%i\r\n", ch_spo2_valid);
		}
        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);
		
		//显示刷新
		LED0=0;
		if(dis_hr == 0 && dis_spo2 == 0)  //**dis_hr == 0 && dis_spo2 == 0
		{
			sprintf((char *)str,"HR:--- SpO2:--- ");//**HR:--- SpO2:--- 
		}
		else{
			sprintf((char *)str,"HR:%3d SpO2:%3d ",dis_hr,dis_spo2);//**HR:%3d SpO2:%3d 
		}
		OLED_ShowString(0,0,str,16);
		OLED_Fill(0,23,127,63,0);
		//红光在上,红外在下
		dis_DrawCurve(aun_red_buffer,20);
		dis_DrawCurve(aun_ir_buffer,0);
		OLED_Refresh_Gram();//更新显示到OLED
}
}

四、视频演示

MAX30102心率血氧测量

附完整代码程序资料

链接:https://pan.baidu.com/s/1TaxlDzRbkNnz4guaJPrGnQ?pwd=6arw
提取码:6arw文章来源地址https://www.toymoban.com/news/detail-794360.html

到了这里,关于STM32--基于STM32F103的MAX30102心率血氧测量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • MAX30102脉搏血氧仪和心率传感器(四)血氧+心率完整版(STM32)

    相较于上一章,增加和改进的地方有:①增加了血氧饱和度测量;②改进了心率的代码。即中断采集完一段数据后才“扔进“函数进行处理,期间处理器可以做其它事情,但算法原理与上一章基本相同;③减少了代码量,较为简洁高效。 手指接触到传感器, 等待1-2s后 串口输

    2023年04月10日
    浏览(34)
  • ESP32设备驱动-MAX30102脉搏血氧饱和度和心率监测传感器驱动

    MAX30102是一款集成脉搏血氧饱和度和心率监测生物传感器模块。 它包括内部 LED、光电探测器、光学元件和具有环境光抑制功能的低噪声电子设备。 MAX30102提供完整的系统解决方案,简化移动和可穿戴设备的设计流程。 MAX30102具有如下特性: LED 反射式解决方案中的心率监测器

    2023年04月18日
    浏览(33)
  • MAX30102心率血氧传感器

    目前,基本上所有的可穿戴式设备都集成了心率血氧测量的功能,在手表/手环中尤为常见。一般情况下,开发人员用于评估的心率血氧传感器型号用的都是MAX30102/MAX30100。MAX30102EFD如下图所示。 为上图所示的MAX30102传感器增加外围电路后就成为了常见的MAX30102模组,如下图所示

    2024年02月07日
    浏览(30)
  • 心率血氧传感器模块MAX30102

    心率血氧传感器模块MAX30102实物图   模块简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。 它集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。 MAX30102采用一个1.8V电源和一个独立的5.0V用于内部LED的电源,应

    2024年02月12日
    浏览(26)
  • 84、基于STM32单片机的心率MAX102血氧浓度脉搏检测系统设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、硬件框图 七、流程图  八、程序源码  九、 资料包括 血氧饱和度是人体生理参数检测的一个重要指标。但是传统的血氧监测仪造价成本太高,只

    2024年02月07日
    浏览(63)
  • MAX30102脉搏血氧仪和心率传感器(三)心率计算——时域法

    本章介绍PPG信号的心率计算方法——时域法。基本思想是计算动态阈值曲线,利用波形与曲线相交来确定PPG信号的周期。 如下图,当PPG波形在相同的位置两次经过动态阈值曲线的交点时, 这段时间的间隔就能认为是PPG的一个周期 ,根据此周期即可求出 心率 。 动态阈值曲线

    2024年02月03日
    浏览(41)
  • 【开源】ESP8266_MAX30102_OLED屏幕实现血氧心率检测

    本系列,是记录自己入门嵌入式领域的学习笔记。 看看能坚持多久。 今天是2023年5月2日 源代码的来源:https://github.com/yangqingyuan-byte/MAX30102-0.96_4pin_oled-esp8266_HR_and_SPO2 * ESP8266 --- OLED * GND --- GND * * 5V --- VCC  * D1 --- SCL  * D2 --- SDA  * ESP8266 --- MAX30102 * 5V --- VIN * G --- GND * D0 --- INT

    2024年02月03日
    浏览(36)
  • STM32传感器外设集--心率模块(MAX30102)

    目录 ​​​​​​​ 一、模块介绍 二、资料获取连接  欢迎关注微信公众号--星之援工作室 发送(MAX30102) 三、接线方式 四、代码编写 main.c max30102.c max30102.h myiic.c myiic.h algorithm.c algorithm.h 五 、参考 MAX30102模块是一种集成了光学传感器和信号处理器的模块,广泛应用

    2024年01月22日
    浏览(42)
  • 基于stm32F103的座面声控台灯

            设计一个放置在桌面使用的台灯,使用220v交流电供电。具备显示屏能够实时显示日期(年、月、日和星期),时间(小时、分钟、秒)和温度(摄氏度);能够通过语音交互播报实时日期、时间或者温度;能够通过语音交互控制桌面台灯的开启与关闭(或者明暗

    2024年04月29日
    浏览(59)
  • 基于stm32F103的蜂鸣器周期发声实验

    蜂鸣器作为一种声音报警器件,应用广泛。本实验基于stm32F103单片机,通过控制蜂鸣器的IO口电平电压,使其周期性地进行电平翻转,从而驱动蜂鸣器发出周期性的鸣叫声。该实验主要运用了stm32的GPIO和定时器TIM的相关功能,不仅可以巩固这些外设的使用,也可以通过改变时间参数,控

    2024年02月21日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包