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
以下是注释后的代码:
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;
}
}
}
原文地址: https://www.cveoy.top/t/topic/bjjR 著作权归作者所有。请勿转载和采集!