Anderley Riaño Polania
/
TRANSVERSAL_MAX30102
a
main.cpp
- Committer:
- ander16
- Date:
- 2021-10-11
- Revision:
- 6:12a94e952f60
- Parent:
- 5:648aa1e83d65
File content as of revision 6:12a94e952f60:
#include "mbed.h" #include "algorithm.h" #include "MAX30102.h" #define MAX_BRIGHTNESS 255 uint32_t aun_ir_buffer[500]; //Datos del sensor IR LED int32_t n_ir_buffer_length; //longitud de los datos uint32_t aun_red_buffer[500]; // Datos del sensor LED rojo int32_t n_sp02; // Valor de SPO2 int8_t ch_spo2_valid; // indicador para mostrar si el cálculo de SP02 es válido int32_t n_heart_rate; // valor de frecuencia cardíaca int8_t ch_hr_valid; // indicador para mostrar si el cálculo de la frecuencia cardíaca es válido uint8_t uch_dummy; Serial pc(USBTX, USBRX); //inicializa el puerto serie DigitalIn INT(PB_0); //el pin PTD1 se conecta al pin de salida de interrupción del MAX30102 // la rutina de configuración se ejecuta una vez cuando presiona restablecer: int main() { uint32_t un_min, un_max, un_prev_data; //variables para calcular el brillo del LED integrado que refleja los latidos int i; int32_t n_brightness; float f_temp; maxim_max30102_reset(); //restablece el MAX30102 // inicializa la comunicación en serie a 115200 bits por segundo: pc.baud(115200); pc.format(8,SerialBase::None,1); wait(1); //led = 1; //leer y borrar el registro de estado maxim_max30102_read_reg(0,&uch_dummy); maxim_max30102_init(); //inicializa el MAX30102 n_brightness=0; un_min=0x3FFFF; un_max=0; n_ir_buffer_length=500; // lee las primeras 500 muestras y determina el rango de señal for(i=0;i<n_ir_buffer_length;i++) { maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); if(un_min>aun_red_buffer[i]) un_min=aun_red_buffer[i]; // actualiza la señal min if(un_max<aun_red_buffer[i]) un_max=aun_red_buffer[i]; // actualiza la señal max pc.printf("red="); pc.printf("%i", aun_red_buffer[i]); pc.printf(", ir="); pc.printf("%i\n\r", aun_ir_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; for(i=100;i<500;i++) { aun_red_buffer[i-100]=aun_red_buffer[i]; aun_ir_buffer[i-100]=aun_ir_buffer[i]; 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; } pc.printf("red="); pc.printf("%i", aun_red_buffer[i]); pc.printf(", ir="); pc.printf("%i", aun_ir_buffer[i]); pc.printf(", HR=%i, ", n_heart_rate); pc.printf("HRvalid=%i, ", ch_hr_valid); pc.printf("SpO2=%i, ", n_sp02); pc.printf("SPO2Valid=%i\n\r", ch_spo2_valid); } 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); } }