a

Dependencies:   mbed

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); 
    }
}