MAX30102 心率和血氧饱和度测量显示函数
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;
}
}
}
很抱歉,由于缺少完整的代码和相关的错误信息,无法判断代码中是否有错误。请提供更详细的信息。
原文地址: https://www.cveoy.top/t/topic/mLqu 著作权归作者所有。请勿转载和采集!