心拍・酸素飽和度モニタモジュール MAXREFDES117から取得した心拍の値をシリアルコンソールに表示するプログラムです。
Fork of microbit-component-display by
main.cpp
00001 #include "MicroBit.h" 00002 #include "MAX30102.h" 00003 #include "algorithm.h" 00004 00005 MAX30102 sensor(I2C_SDA0, I2C_SCL0); 00006 00007 MicroBitDisplay display; 00008 00009 DigitalIn INT(P0_16); 00010 00011 Serial pc(USBTX, USBRX); 00012 00013 #define MAX_BRIGHTNESS 255 00014 00015 uint32_t aun_ir_buffer[500]; //IR LED sensor data 00016 int32_t n_ir_buffer_length; //data length 00017 uint32_t aun_red_buffer[500]; //Red LED sensor data 00018 int32_t n_sp02; //SPO2 value 00019 int8_t ch_spo2_valid; //indicator to show if the SP02 calculation is valid 00020 int32_t n_heart_rate; //heart rate value 00021 int8_t ch_hr_valid; //indicator to show if the heart rate calculation is valid 00022 uint8_t uch_dummy; 00023 00024 int main() 00025 { 00026 uint32_t un_min, un_max, un_prev_data; //variables to calculate the on-board LED brightness that reflects the heartbeats 00027 int i; 00028 int32_t n_brightness; 00029 float f_temp; 00030 00031 sensor.reset(); 00032 sensor.init(); 00033 00034 n_brightness=0; 00035 un_min=0x3FFFF; 00036 un_max=0; 00037 00038 pc.printf("Start\r\n"); 00039 00040 n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps 00041 00042 //read the first 500 samples, and determine the signal range 00043 //for(i=0;i<n_ir_buffer_length;i++) 00044 i=0; 00045 while(1) 00046 { 00047 while(INT.read()==1); //wait until the interrupt pin asserts 00048 00049 sensor.read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); //read from MAX30102 FIFO 00050 00051 if(un_min>aun_red_buffer[i]) 00052 un_min=aun_red_buffer[i]; //update signal min 00053 if(un_max<aun_red_buffer[i]) 00054 un_max=aun_red_buffer[i]; //update signal max 00055 pc.printf("red="); 00056 pc.printf("%i", aun_red_buffer[i]); 00057 pc.printf(", ir="); 00058 pc.printf("%i\n\r", aun_ir_buffer[i]); 00059 } 00060 un_prev_data=aun_red_buffer[i]; 00061 00062 00063 //calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples) 00064 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); 00065 00066 //Continuously taking samples from MAX30102. Heart rate and SpO2 are calculated every 1 second 00067 while(1) 00068 { 00069 i=0; 00070 un_min=0x3FFFF; 00071 un_max=0; 00072 00073 //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top 00074 for(i=100;i<500;i++) 00075 { 00076 aun_red_buffer[i-100]=aun_red_buffer[i]; 00077 aun_ir_buffer[i-100]=aun_ir_buffer[i]; 00078 00079 //update the signal min and max 00080 if(un_min>aun_red_buffer[i]) 00081 un_min=aun_red_buffer[i]; 00082 if(un_max<aun_red_buffer[i]) 00083 un_max=aun_red_buffer[i]; 00084 } 00085 00086 //take 100 sets of samples before calculating the heart rate. 00087 for(i=400;i<500;i++) 00088 { 00089 un_prev_data=aun_red_buffer[i-1]; 00090 while(INT.read()==1); 00091 sensor.read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); 00092 00093 if(aun_red_buffer[i]>un_prev_data) 00094 { 00095 f_temp=aun_red_buffer[i]-un_prev_data; 00096 f_temp/=(un_max-un_min); 00097 f_temp*=MAX_BRIGHTNESS; 00098 n_brightness-=(int)f_temp; 00099 if(n_brightness<0) 00100 n_brightness=0; 00101 } 00102 else 00103 { 00104 f_temp=un_prev_data-aun_red_buffer[i]; 00105 f_temp/=(un_max-un_min); 00106 f_temp*=MAX_BRIGHTNESS; 00107 n_brightness+=(int)f_temp; 00108 if(n_brightness>MAX_BRIGHTNESS) 00109 n_brightness=MAX_BRIGHTNESS; 00110 } 00111 00112 //send samples and calculation result to terminal program through UART 00113 pc.printf("red="); 00114 pc.printf("%i", aun_red_buffer[i]); 00115 pc.printf(", ir="); 00116 pc.printf("%i", aun_ir_buffer[i]); 00117 pc.printf(", HR=%i, ", n_heart_rate); 00118 pc.printf("HRvalid=%i, ", ch_hr_valid); 00119 pc.printf("SpO2=%i, ", n_sp02); 00120 pc.printf("SPO2Valid=%i\n\r", ch_spo2_valid); 00121 } 00122 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); 00123 } 00124 00125 //while(1) 00126 // display.scroll(":)"); 00127 }
Generated on Tue Jul 12 2022 21:44:59 by 1.7.2