InicioTarjetas de DesarrolloArduinoDetecta tu Ritmo Cardiaco a través del KY-039.

Detecta tu Ritmo Cardiaco a través del KY-039.

En este tutorial realizaremos un detector de ritmo cardíaco usando el sencillo módulo KY-039.

El detector de ritmo cardíaco KY-039 se constituye por un LED y un fototransistor; cuando es colocado el dedo índice (de preferencia) entre estos dos elementos, la presión arterial que pasa por el dedo modifica ligeramente la corriente base del fototransistor, ya que la luz que atraviesa el dedo es menor, lo que significa una salida por el puerto análogo diferente.

Para el uso de este módulo se recomienda lo siguiente:

  • Primero ejecutar un programa de lectura de datos analógicos para conocer los valores que el módulo nos entrega.
  • Al utilizar el KY-039, tratar de cubrirlo o no exponerlo a luces externas como la iluminación propia de habitación o luz natural.
  • Conociendo estas características procederemos a realizar nuestro proyecto con el siguiente material:

    Diagrama de Conexión para KY-039

    Realizaremos la siguiente conexión para visualizar el funcionamiento.

    Código en IDE Arduino

    El siguiente programa sólo realizará la lectura de datos detectados por el sensor KY-039.

    void setup() 
    
    {
        Serial.begin(9600);       //inicia el Monitor Serial a 9600 bauds
    }
    
    void loop() 
    
    {
      Serial.println(analogRead(A0));  //Se realiza la lectura del la señal proveniente de 
                                       //KY-039 a A0 y se imprime la información en el Monitor Serial
    }
    

    En el video se mostrará la señal detectada, primero en forma de gráfica (Serial Plotter) en donde se podrá observar la forma aleatoria de los datos y posteriormente en el Monitor Serial en donde también observaremos los valores de los datos por cada pulso cardíaco detectado.

    Como visualizamos, la información que recibimos del sensor es variable y no concuerda con la de un pulso cardíaco, por lo que tendremos que realizar algunos cálculos y conocer un poco más del proceso de un latido de corazón para que las variables obtenidas sean lo más cercano a una frecuencia cardíaca.

    Procesamiento de Datos

    Para poder realizar el acondicionamiento de datos utilizaremos un filtro paso bajo llamado también EMA o Filtro Exponencial, con el que obtendremos un valor filtrado a partir de una medición previamente tomada, la expresión es la siguiente:

    El Factor Alpha sera el índice que se utiliza para la frecuencia de corte de la señal. Este factor depende del tiempo de muestreo de nuestro sistema, el cual en un inicio puede ser desconocido o que cuente con variaciones entre periodos.

    El factor tiene las siguientes interpretaciones:

  • Alpha=1 Señal sin filtrar, debido a que se depende de la medición de la señal anterior para realizar el filtrado.
  • Alpha=0: Salida de un valor de filtrado igual a cero, debido a que se depende de la medición actualizada para aportar el nuevo filtrado.
  • En caso de que Alpha se aumente, suavizará la señal pero se podría estar eliminando elementos de la frecuencia, clasificando como ruido parte de las variaciones normales de la señal.

    Por otro lado,disminuir el valor de Alpha, aumentará el tiempo de respuesta en el sistema, causando retrasos de calculo entre la señal original y filtrada.

    Hay que tomar en cuenta que el valor leído varia mas rápido que el valor filtrado, es por esta razón el uso de filtro paso bajas para poder permitir el paso a los datos filtrados y atenuar la frecuencias leídas.

    Convencionalmente para tener un filtro paso bajo el valor de Alpha estará en un rango de 0.6 y 0.75. En nuestro caso usaremos un Alpha de 0.75, este valor nos ayudará a obtener un valor filtrado conformado por: 75% valor medido anteriormente y 25% del valor leído.

    Código para el manejo de datos del KY-039

    Utilizaremos la conexión previamente realizada y programaremos el siguiente código en el IDE de Arduino; considerando los siguientes puntos:

    • Se usará la expresión para realizar un filtro paso baja.
    • El Alpha o el factor de la ecuación EMA será 0.75.
    • La función milli se usará de forma dinámica en varias partes del proceso de contabilizar los latidos del corazón.
    int ky039 = A0;               //Variable entera para la señal del KY039
    int latido = 0;               //Variable para almacenar el número de latidos por ciclo
    int rangoT;                    //Variable que almacenará los valores recibidos por KY039
    int lateMin = 300;            //Constante para calculo del numero de latidos por minuto mínimos
    
    double factor = 0.75;         //Constante para Filtro Paso Bajas
    double minval = 0.0;          //Variable para almacenar el valor Mínimo de onda de la señal filtrada
    double VFiltrado;             //Variable que recibirá el resultado del calculo del filtro paso bajas
    double cambio;                //Variable que tiene la diferencia entre el valor filtrado y anterior
    
    float antes = 512;            //Valor de referencia (mitad de 1023),para el Valor Filtrado Anterior An-1
    float maxval = 0.0;           //Variable para almacenar el valor Máximo de onda de la señal filtrada
    
    void setup ()
    {
      Serial.begin (9600);      //Inicialización de puerto serial a 9600 bd
    }
    
    
    void loop ()
    {
      static unsigned long LPMtime = millis();  //Retorno de # de ms desde que se enciende el Arduino a la variable LMPtime para el calculo de los latidos p/minuto
      static unsigned long LPMQR = millis();    //Retorno de # de ms a la variable LPMQR que servirá para saber el tiempo entre latidos del corazón
      rangoT = analogRead (ky039);              //Se almacenan los valores brutos provenientes del sensor KY-039 (0 a 1023)
    
      //Acondicionamiento de la señal por medio de un filtro paso bajas (EMA)
      VFiltrado = factor * antes + (1 - factor) * rangoT;         //Expresión para el Filtro paso bajo (EMA)
      cambio = VFiltrado - antes;                                //Diferencia para obtener el valor transcurrido
      antes = VFiltrado;                                         //El valor anterior queda actualizado con la información del valor filtrado
        
      //Condición para poder descartar valores fuera de los latidos "normales" en un tiempo de 300 ms
      //Condición doble: si la diferencia obtenida es mayor al valor máximo y el tiempo millis es mayor que el valor de tiempo ENTRE LATIDOS mas el Valor Mínimo entonces..
     
      if ((cambio >= maxval) && (millis() > LPMQR + minval)) {         //En caso de ser afirmativa la condición...
        maxval = cambio;                                                //se actualiza el valor máximo por el resultado de la diferencia entre valor filtrado y valor anterior
        digitalWrite(13, HIGH);                                         //se encenderá el LED de la placa para confirmar que se esta tomando una lectura dentro de estos rangos
        LPMQR = millis();                                               //se carga a la variable ENTRE LATIDOS el valor actualizado de millis
        latido++;                                                       //incremento de la cuenta de latidos
      }
      else {
        digitalWrite(13, LOW);                                           //si la condición es negativa no encenderá el Led de la Placa
         }
      
      maxval = maxval * 0.97;                            //el valor máximo de la señal se multiplica por 0.97 para que tenga un 3% de decaimiento la señal
     
      //Condición para conteo de latidos del corazón
      if (millis() >= LPMtime + 15000) {        //nuevamente compara el tiempo transcurrido sea mayor a 15s
        int L= latido*4;                        //Caso afirmativo, se multiplicara los latidos por 4 para tener un resultado a los 60s
        
        Serial.print ("LPM:");                  //Imprime el valor procesado del sensor KY-039
        Serial.println(L); 
                  
        latido = 0;                             //Reinicia el valor del contador de latidos
        LPMtime = millis();                     //Actualiza el valor de tiempo de Latidos p/minuto 
        }
    
      delay(50);                                //con este tiempo actualizamos las funciones para que nuevamente se repita el ciclo
    }
    
    

    La primera parte de código se refiere a poder filtrar la señal del KY-039. Posteriormente, se crea el escenario para contabilizar los latidos por minuto. La función milli es clave, ya que la aproximación respecto al conteo de los latidos puede ser lo más acertada en tiempo desde que se enciende el Arduino hasta que realiza la primera toma del pulso cardiaco.

    Como se puede visualizar los datos obtenidos son variables pero mas acertados a un latido por minuto. Te invitamos a que realices cambios en el Factor Alpha y en el porcentaje de decaimiento de la onda máxima de la señal para que sea mas comprensible el procesamiento de la señal por filtro paso bajas.

    Bibliografía

    TUTORIALES RELACIONADOS