void MAX30102_display()
{
	
//	OLED_ShowString(0,0,"  initializing  ",16);
//	OLED_Refresh_Gram();//更新显示到OLED	 
	
	//printf("\r\n MAX30102  init  \r\n");
	//uint8_t _str[64] = {0};
	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
	delay_ms(1500);
	OLED_Fill(0xFF);//全屏点亮
	delay_s(2);
	OLED_Fill(0x00);//全屏灭
	OLED_CLS();	//清屏(将屏幕所显示的内容清空,变为黑屏)
	printf("现在在心率界面\r\n");
	
    for(i=200; 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];
	 //printf("\r\n ---------d  \r\n");
	//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); 
	//OLED_CLS();

	while(1)
	{
		
		i=0;
        un_min=0x3FFFF;
        un_max=0;
		delay_ms(5);
		//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];
        }
		OLED_DrawBMP(0,0,48,6,BMP1);
		//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);
				if(dis_hr == 0)  //**dis_hr == 0 && dis_spo2 == 0
				{
					sprintf((char *)str,"HR  :--- ");//**HR:--- SpO2:--- 
					sprintf((char *)spo2_str,"SPO2:--- ");//**HR:--- SpO2:--- 
				}
				else{
					sprintf((char *)str,"HR  :%3d ",dis_hr);//**HR:%3d SpO2:%3d 
					sprintf((char *)spo2_str,"SPO2:%3d ",dis_spo2);//**HR:%3d SpO2:%3d 
				}
						
				
		}
       
		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);
		
		OLED_ShowStr( 60 , 4 ,str , 1);
		OLED_ShowStr( 60 , 5 ,spo2_str , 1);
		delay_ms(1);
//		OLED_fill( 0 , 23 ,127,63,0);
//		//红光在上,红外在下
//		dis_DrawCurve(aun_red_buffer,20);
//		dis_DrawCurve(aun_ir_buffer,0);
//		OLED_Refresh_Gram();//更新显示到OLED
		

		if(KeyDown[2])
		{

			KeyDown[2] = 0;
			menu = 0;
			break;
		}

	}
}

很抱歉,由于缺少完整的代码和相关的错误信息,无法判断代码中是否有错误。请提供更详细的信息。

MAX30102 心率和血氧饱和度测量显示函数

原文地址: https://www.cveoy.top/t/topic/mLqu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录