Code to log MAX30102 sensor data to phone application (Based on Nexpaq)
Dependencies: ds3231 maxim_dev nexpaq_mdk MAX30102
Fork of IO_Demo by
Diff: main.cpp
- Revision:
- 2:9057c54ae6e9
- Parent:
- 1:5fb525e83780
--- a/main.cpp Wed Nov 09 16:44:59 2016 +0000 +++ b/main.cpp Sun Dec 18 09:43:33 2016 +0000 @@ -1,9 +1,31 @@ #include "mbed.h" #include "nexpaq_mdk.h" +#include "ds3231.h" +#include "algorithm.h" +#include "MAX30102.h" -PwmOut ledR(P2_4); -PwmOut ledG(P2_5); -PwmOut ledB(P2_6); +#define I2C_SDA P1_6 +#define I2C_SCL P1_7 + +#define FUNCTION_TABLE_NUM 2 +#define UUID_NUM 16 // UUID number is 16, don't change it +#define LOOP_DELAY 1000 + +DigitalOut ledR(P2_4, LED_OFF); +DigitalOut ledG(P2_5, LED_OFF); +DigitalOut ledB(P2_6, LED_OFF); + +uint32_t aun_ir_buffer[500]; //IR LED sensor data +int32_t n_ir_buffer_length; //data length +uint32_t aun_red_buffer[500]; //Red LED sensor data +int32_t n_sp02; //SPO2 value +int8_t ch_spo2_valid; //indicator to show if the SP02 calculation is valid +int32_t n_heart_rate; //heart rate value +int8_t ch_hr_valid; //indicator to show if the heart rate calculation is valid +uint8_t uch_dummy; + +DigitalIn INT(P4_1); + AnalogIn aIn0(AIN_0); AnalogIn aIn1(AIN_1); AnalogIn aIn2(AIN_2); @@ -30,14 +52,17 @@ }; unsigned char dataOut[10]; - +Ds3231 temp_sense(P3_4, P3_5); +DigitalOut cs(P1_3); +//vitals +int spo2=50,heart_rate=120,Resp_rate=12,tmp=25; /***** Functions *****/ void my_function_CMD_2700(unsigned char *pData, unsigned char len) { unsigned char response = 0x00; - ledR = 1.0f - (pData[0] / 255.0f); +/* ledR = 1.0f - (pData[0] / 255.0f); ledG = 1.0f - (pData[1] / 255.0f); - ledB = 1.0f - (pData[2] / 255.0f); + ledB = 1.0f - (pData[2] / 255.0f);*/ np_api_upload(0x2701, &response, 1); } @@ -85,7 +110,7 @@ if ( np_api_register((MDK_REGISTER_CMD*)my_cmd_func_table, FUNCTION_TABLE_NUM) == MDK_REGISTER_FAILD ) { // Register failed handle code } - ledR = 1.0f; +/* ledR = 1.0f; ledG = 1.0f; ledB = 1.0f; for (i = 0; i < 16; i++) { @@ -94,26 +119,29 @@ } for (i = 0; i < 10; i++) { dataOut[i] = 0xFF; - } + }*/ + + //instantiate rtc object + + } void app_loop() -{ - int anaData; - anaData = aIn4.read_u16(); - dataOut[0] = anaData; - dataOut[1] = anaData>>8; - anaData = aIn5.read_u16(); - dataOut[2] = anaData; - dataOut[3] = anaData>>8; - anaData = aIn2.read_u16(); - anaData = anaData/10; - dataOut[4] = anaData; - dataOut[5] = anaData>>8; - anaData = aIn3.read_u16(); - anaData = anaData/10; - dataOut[6] = anaData; - dataOut[7] = anaData>>8; +{ + if((n_heart_rate>20)&&(n_heart_rate<220)) + heart_rate=n_heart_rate; + if((n_sp02>60)&&(n_sp02<120)) + spo2=n_sp02; + + tmp = temp_sense.get_temperature(); + dataOut[0] = heart_rate; + dataOut[1] = heart_rate>>8; + dataOut[2] = tmp; + dataOut[3] = tmp>>8; + dataOut[4] = spo2; + dataOut[5] = spo2>>8; + dataOut[6] = Resp_rate; + dataOut[7] = Resp_rate>>8; dataOut[8] = (digPin[7].read()<<7) + (digPin[6].read()<<6) + @@ -131,15 +159,91 @@ (digPin[10].read()<<2) + (digPin[9].read()<<1) + (digPin[8].read()); + sendStatus(); } int main(void) { + uint32_t un_min, un_max, un_prev_data; //variables to calculate the on-board LED brightness that reflects the heartbeats + int i; + maxim_max30102_reset(); + maxim_max30102_read_reg(0,&uch_dummy); + maxim_max30102_init(); + un_min=0x3FFFF; + un_max=0; + n_ir_buffer_length=500; np_api_init(); app_setup(); np_api_start(); + + for(i=0;i<n_ir_buffer_length;i++) + { + while(INT.read()==1); //wait until the interrupt pin asserts + + maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); //read from MAX30102 FIFO + + 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]; + } + un_prev_data=aun_red_buffer[i]; + 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); + while(1) { + i=0; + un_min=0x3FFFF; + un_max=0; + + //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]; + } + + for(i=400;i<500;i++) + { + un_prev_data=aun_red_buffer[i-1]; + while(INT.read()==1); + maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); + + /* 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; + }*/ + + //led.write(1-(float)n_brightness/256); + + //send samples and calculation result to terminal program through UART + + } +// ledR=LED_OFF; +// ledG=LED_ON; + 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); + + ledR = LED_ON; app_loop(); np_api_bsl_chk(); Thread::wait(LOOP_DELAY);