心拍・酸素飽和度モニタモジュール MAXREFDES117から取得した心拍の値をシリアルコンソールに表示するプログラムです。

Dependencies:   microbit

Fork of microbit-component-display by BBC

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }