Medición de pulso cardíaco con Sensor AD8232 y Arduino IDE

El AD8232 es un pequeño chip que se utiliza para medir la actividad eléctrica del corazón.

Se buscará registrar la actividad eléctrica como un ECG o electrocardiograma. La electrocardiografía se utiliza para ayudar a diagnosticar diversas afecciones cardíacas, así como aprender más del corazón y hasta para armar detectores de mentiras.

Según su datasheet, «La potencia, el tamaño y el nivel de integración resultantes permiten a los diseñadores desarrollar dispositivos de monitorización cardíaca y de frecuencia cardíaca para su uso fuera de entornos de cuidados intensivos en áreas como la gestión de la salud personal y la monitorización remota de la salud.»

NOTA: Este dispositivo no está diseñado para diagnosticar o tratar ninguna condición.

Entendiendo el ECG

En términos generales, veamos qué representa un ECG y cómo podemos detectarlo. El ECG se divide en dos intervalos básicos, el intervalo PR y el intervalo QT, que se describen a continuación.

Sistema de conducción eléctrica del corazón: 1. Nodo SA; 2. Nódulo AV.

El corazón tiene cuatro cámaras: dos aurículas y dos ventrículos, izquierdos y derechos. La aurícula derecha recibe la sangre venosa del cuerpo y la envía al ventrículo derecho el cual la bombea a los pulmones, lugar en el que la sangre se oxigena y libera dióxido de carbono (CO2) y del que pasa a la aurícula izquierda. De aquí la sangre se deriva al ventrículo izquierdo, de donde se distribuye, al contraerse éste, a todo el cuerpo y regresa a la aurícula derecha cerrando el ciclo cardíaco.

Fuente de todo el contenido sobre el corazón: Wikipedia

Actividad eléctrica del corazón

Intervalo PR

El intervalo PR es la onda inicial generada por un impulso eléctrico que viaja desde la aurícula derecha hacia la izquierda. La aurícula derecha es la primera cámara en ver un impulso eléctrico. Este impulso eléctrico hace que las cámaras se «despolaricen». Esto lo obliga a contraerse y drenar la sangre desoxigenada de la vena cava superior e inferior hacia el ventrículo derecho. A medida que el impulso eléctrico viaja a través de la parte superior del corazón, hace que la aurícula izquierda se contraiga. La aurícula izquierda es responsable de recibir sangre recién oxigenada desde los pulmones hacia el ventrículo izquierdo a través de las venas pulmonares izquierda y derecha. Las venas pulmonares están rojas en el diagrama porque transportan sangre oxigenada. Todavía se les llama venas porque las venas llevan la sangre hacia el corazón. ¡Ciencia!

Intervalo QT El Intervalo QT

El QRS es un proceso complejo que genera el «bip» característico en los monitores cardíacos. Durante QRS ambos ventrículos comienzan a bombear. El ventrículo derecho comienza a bombear sangre desoxigenada hacia los pulmones a través de las arterias pulmonares izquierda y derecha. Las arterias pulmonares son azules en el diagrama porque transportan sangre desoxigenada. Todavía se les llama arterias porque las arterias llevan la sangre fuera del corazón. ¡Ciencia, otra vez! El ventrículo izquierdo también comienza a bombear sangre recién oxigenada a través de la aorta y hacia el resto del cuerpo. Después de la contracción inicial viene el segmento ST. El segmento ST es bastante silencioso eléctricamente, ya que es el momento en que los ventrículos esperan ser «repolarizados». Finalmente, la onda T se hace presente para «re-ploarizar» activamente o relajar los ventrículos. Esta fase de relajación reinicia los ventrículos para ser llenados nuevamente por las aurículas.

Conexión de AD8232 con Microcontrolador:

Prueba con Arduino IDE

Conexión del hardware

En este texto, se conectará el AD8232 a un microcontrolador Arduino Uno y a un módulo ESP32 con pantalla OLED. ¡Construiremos un monitor cardíaco simple que le permitirá medir la actividad eléctrica del corazón en tiempo real!

Prueba con Arduino Uno

Utilizaré un arduino Uno que me ha regalado un amigo, mientras vivía en Barcelona en 2017.

Prueba con ESP32 + OLED

Para una cómoda representación del pulso

También probaré el ECG con un ESP32 que cuenta con una pantalla integrada.

Conexión de pines

El monitor de frecuencia cardíaca AD8232 cuenta con nueve conexiones desde el IC. Estos pines provienen de los pines en el IC, pero en realidad son agujeros a los que puede soldar cables o pines de cabecera.

Conectaremos cinco de los nueve pines de la placa Arduino y al ESP32 respectivamente. Los cinco pines que necesita están etiquetados GND, 3.3v, OUTPUT, LO- y LO+.

Board LabelFunciónConexión Uno/ESP32
GNDGroundGND
3.3v3.3v Power Supply3.3v
OUTPUTOutput SignalA0
LO-Leads-off Detect –11
LO+Leads-off Detect +10
SDNShutdownNo usado

Conexión del Sensor AD8232 con Arduino Uno (Atmega328P), ESP8266 y ESP32

AD8232Atmega328PESP8266ESP32
OUTPUTA5A023
LO+21
LO-32
3.3V3.33.33.3
GNDGNDGNDGND

Código Para compilar Atmega 328P – Medición de pulso cardíaco:

// Previous values
int val;
float lowPass1;
float highPass1;
float rawSignal, rawSignal1, rawSignal2, rawSignal3;
int threshold1;
long bpm;
unsigned long t1, t2;
unsigned long milliseconds;

// -------- Functions --------- //
static inline void initTimer(void) {
  /*Write code to initialize Timer 1*/
  TCNT1 = 65223; //  preload timer 65536-16MHz/256/200Hz (sampling frequency of the ECG)
  TCCR1B |= (1 << CS12); // prescaler value of 256
  TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
}

static inline void initIOPorts(void) {
  /*Write code to initialize the GPIO ports (pins) that you need*/
  DDRB = 0b00100000;
}

static inline void initADC(void) {
  /*Write code to initialize the ADC*/
  ADMUX |= (1 << REFS0); // reference voltage on ADC as AVcc
  ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // ADC clock prescaler of 128
  ADCSRA |= (1 << ADATE); // Enables ADC auto trigger
  ADCSRB |= (1 << ADTS2) | (1 << ADTS1); // ADC triggers when Counter1 overflows
  ADCSRA |= (1 << ADIE); // ADC interrupts enabled
  ADCSRA |= (1 << ADEN); // enable ADC
  ADCSRA |= (1 << ADSC); // start ADC conversion
}

void tiempo(void);

// ------ Interrupt Service Routine ------ //
ISR(TIMER1_OVF_vect) {
  /*This is the interrupt service routine for Timer 1 Overflow*/
  PORTB ^= 0b00100000;
  TCNT1 = 65223;   // preload timer
  rawSignal = analogRead(A0);
  tiempo();
  val = 1;
}

ISR(ADC_vect) {
  /*This is the interrupt service routine for the ADC
     It is executed when the ADC completes a conversion.
  */
  if (ADC > 512) // turn LED on or off
  {
    PORTB = 0b00100000;
    // measure();

  }
  else
    PORTB = 0b00000000;

  rawSignal = ADC; //Store the ADC value in the variable ECG_rawsignal
  val = 1;
}

void tiempo(void) {
  static int counter;
  static int counter2;
  static long segundos;
  counter++;
  //Contador de segundos /////////////////////////////////////////////////////
  if (counter > 200) {
    counter = 0;
    segundos++;
    // Serial.print("***************************** Segundos de ejecición: ");
    // Serial.print(segundos);
    // Serial.println(" segundos *****************************");
  }

  /////////////////////////////////// Contador de milliseconds ///////////////
  milliseconds = milliseconds + 5;


}

boolean serialMonitor = 0;

unsigned long lastMillisBpm[] = {0, 0, 0, 0, 0}; //A cuántos millis se detectó beat

unsigned long lastTimeBeat[] = {0, 0, 0, 0, 0}; //Tiempo entre pulso y pulso

int main(void) {


  Serial.begin(115200); //Sets the data rate bits/s for serial data submission

  pinMode(LED_BUILTIN, OUTPUT);

  noInterrupts(); //Disable interrupts
  initIOPorts(); //Initiate GPIO module
  initTimer(); // Initiate timer module
  initADC(); //Initiate ADC module
  interrupts(); //Enable interrupts

  while (1) {

    Serial.flush(); //Waits for the transmission of outgoing serial data to complete
    if (val == 1) { //Tests if val is equal to 1
      // Filtered signal calculation

      float highPass = -0.5096 * rawSignal - 0.6456 * rawSignal1 + 0.6456 * rawSignal2 + 0.5096 * rawSignal3;
      float lowPass = 0.91 * lowPass1 + 0.045 * highPass + 0.045 * highPass1;

      // Comparison with threshold
      int threshold;
      if (lowPass < 0) lowPass = -lowPass; // Calculates the module
      if (lowPass > 10) threshold = 400;
      else threshold = 0;


      // Print the values on serial plotter/

      if (serialMonitor) {


        Serial.print(rawSignal);
        Serial.print(",");
        Serial.print(highPass);
        Serial.print(",");
        Serial.print(lowPass);
        Serial.print(",");
        Serial.print(threshold);
        Serial.print(",");
        Serial.println(bpm);
        //  Serial.print(",");
        //  Serial.println(milliseconds);
      }
      //   if ()

      rawSignal1 = rawSignal;
      rawSignal2 = rawSignal1;
      rawSignal3 = rawSignal2;
      highPass1 = highPass;
      lowPass1 = lowPass;

      static int QRS = 0;
      static int j = 0;

      if (threshold == 400) {
        if (!QRS) {

          int k = j - 1;
          if (k < 0) k = 4;

          if ( milliseconds > lastMillisBpm[k] + 300 ) {

            //Rutina de detección
            QRS = 1;
            if (!serialMonitor)Serial.print("QRS complex detected");
            lastMillisBpm[j] = milliseconds;

            //Compara los ultimos 2
            long lastTime = lastMillisBpm[k] - lastMillisBpm[j] ;
            if (lastTime > 300 && lastTime < 1200) {
              lastTimeBeat[k] = lastTime;
            }

            int nuevosBpm=600000/lastTime;

            j++;


          }
          else
          {
            if (!serialMonitor)Serial.println("Discard the pulse");
          }







          if (j > 5) j = 0;
        }
        else {
          //There was a pulse



        }

        digitalWrite(LED_BUILTIN, HIGH);
      }
      else
        QRS = 0;
      digitalWrite(LED_BUILTIN, LOW);


      long testPulse = lastMillisBpm[2] - lastMillisBpm[1];

      bpm = 60000 / (testPulse);
      if (!serialMonitor) Serial.print(testPulse);
      if (!serialMonitor) Serial.print(",");
      if (!serialMonitor) Serial.println(bpm);



      ///////////////////////////////////////////Serial.println("bpm" + bpm);

      threshold1 = threshold;
      val = 0;
    }
  }
  return 0; /* This line is never reached */
}

Ahora la detección de pulsaciones:

Otros Proyectos realizados en España:

5 Respuestas
  1. Ramiro

    Hola, quisiera agendar una sesión de consoltoría con vosotros para la participación en un proyecto con este sensor. Agradecería su pronta respuesta.

Dejar comentario

HUE CAT

PROGRAMACIÓN Y DISEÑO

GDPR