以下是注释后的代码:

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; //缓存长度为500,即存储5秒的样本数据,每秒100个样本
//read the first 500 samples, and determine the signal range
delay_ms(1500); //延时1500毫秒等待MAX30102启动
OLED_Fill(0xFF);//全屏点亮
delay_s(2); //延时2秒
OLED_Fill(0x00);//全屏灭
OLED_CLS(); 	//清屏(将屏幕所显示的内容清空,变为黑屏)
printf("现在在心率界面\r\n"); //打印调试信息

for(i=200; i<n_ir_buffer_length ;i++) //读取前500个样本数据并计算信号范围
{
    while(MAX30102_INT==1);   //等待直到中断引脚被触发
   
	max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp); //读取FIFO数据
	aun_red_buffer[i] =  (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2];    // 将3个字节的数据合并成一个24位的数据
	aun_ir_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];   // 将3个字节的数据合并成一个24位的数据
        
    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];    //更新信号最大值
	
}
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); //延时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++) //将前100个样本数据丢弃,并将后400个样本数据向前移动
    {
        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++) //读取最后100个样本数据并计算心率
    {
        un_prev_data=aun_red_buffer[i-1]; //记录前一个数据点
        while(MAX30102_INT==1); //等待直到中断引脚被触发
        max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp); //读取FIFO数据
		aun_red_buffer[i] =  (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2];    // 将3个字节的数据合并成一个24位的数据
		aun_ir_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];   // 将3个字节的数据合并成一个24位的数据
    
        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); //延时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;
	}

}

}

void MAX30102_display		OLED_ShowString00 initializing 16;	OLED_Refresh_Gram;更新显示到OLED	 		printfrn MAX30102 init rn;	uint8_t _str64 = 0;	un_min=0x3FFFF;	un_max=0;	n_ir_buffer_length=500; buffer len

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

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