Monitorización del ritmo cardíaco DIY usando el sensor MAX30100 con Arduino

Monitorización del ritmo cardíaco DIY usando el sensor MAX30100 con Arduino

¿Quieres conocer el nivel de oxígeno en tu sangre y el estado de tu ritmo cardíaco en tu casa? Te voy a mostrar cómo hacer un sistema casero de monitorización de la frecuencia cardíaca con Arduino y el sensor Max30100.

Te mostraré exactamente los componentes que necesitas, los diagramas de los pines, cómo cablear todo, y también el código de ejemplo. Vamos a empezar.

Suministros

Componentes de hardware

Arduino Uno Rev3× 1Amazon
Cable USB tipo A/B× 1Amazon
Módulo sensor de frecuencia cardíaca MAX30100× 1Amazon
Módulo sensor de frecuencia cardíaca MAX30102× 1Amazon
Pantalla LCD 16×2× 1Amazon
Tablero de pruebas× 1Amazon
Cables de puente× 15Amazon
Potenciómetro de 10K× 1Amazon
Fuente de alimentación de 5 V (opcional)× 1Amazon

Software

Arduino IDEArduino IDE

Makerguides.com participa en el Programa de Asociados de Amazon Services LLC, un programa de publicidad de afiliados diseñado para proporcionar un medio para que los sitios ganen honorarios de publicidad mediante la publicidad y los enlaces a productos en Amazon.com.

Acerca del módulo sensor MAX30100

El MAX30100 es un módulo sensor de frecuencia cardíaca y oximetría de pulso integrado. Consta de dos LEDs, un fotodetector, un elemento óptico optimizado y un procesamiento de señales analógicas de bajo ruido para detectar las señales de frecuencia cardíaca y oximetría de pulso. Funciona de 1,8V a 3,3V, y se comunica a través del estándar I2C.

¿Cómo funciona un MAX30100?

El pulsioxímetro mide la saturación de oxígeno en nuestro cuerpo. El oxígeno entra en los pulmones y después pasa a la sangre.

La sangre transporta el oxígeno a los diferentes órganos de nuestro cuerpo. La principal forma de transportar el oxígeno en nuestra sangre es mediante la hemoglobina.

El MAX30100 funciona para la monitorización de la frecuencia cardíaca en el ámbito del bricolaje

Hay que poner el dedo en la superficie de cristal del sensor, que permite las pequeñas emisiones de luz a través de la sangre y mide el nivel de oxígeno.

El nivel de oxígeno depende de la cantidad de absorción de luz en la sangre oxigenada o desoxigenada.

Este sensor proporciona el nivel de oxígeno como parámetro SpO2 en porcentaje y la frecuencia cardíaca en pulsaciones por minuto (BPM).

-> Lea nuestra guía sobre lo que puede construir con Adruino.

¿Cómo mide el MAX30100 la frecuencia cardíaca?

El dispositivo tiene dos LED, uno de los cuales emite luz roja y otro emite luz infrarroja, que mide la frecuencia del pulso. Ambas luces se utilizan para medir los niveles de oxígeno en la sangre.

Cuando el corazón bombea sangre, se produce un aumento de la sangre oxigenada como resultado de haber moderado la sangre. 

Al relajarse el corazón con el tiempo, el volumen de sangre oxigenada también disminuye. La frecuencia del pulso se determina en función del tiempo transcurrido entre el aumento y la disminución de la sangre oxigenada.

Resulta que la sangre oxigenada absorbe más luz infrarroja y pasa más luz roja, mientras que la sangre desoxigenada absorbe luz roja y da más luz infrarroja. 

Esta es la función principal del MAX30100: absorbe la luz roja, pasa más fuentes de luz infrarroja y las almacena en un búfer que se puede leer a través de un protocolo de comunicación I2C.

Diagrama de pines del módulo de oxímetro MAX30100 y MAX30102

MAX30100 y MAX30102 es un módulo sensor de frecuencia cardíaca y medición de SpO2 de siete pines, que se comunica a través de I2C. La descripción de cada pin se menciona a continuación.

PINFUNCIÓN
VINTensión de entrada de 3,3 V CC
SCLEntrada de reloj serie I2C
SDADatos seriales bidireccionales I2C 
INTInterrupción activa baja (drenaje abierto)
IRDConexión del cátodo para el LED IR y el controlador del LED (déjelo flotando en el circuito)
R0Conexión del cátodo para el LED rojo y el controlador del LED (déjelo flotando en el circuito)
GNDTierra analógica
Diagrama de pines del módulo de oxímetro MAX30100 y MAX30102

¿Cuál es la diferencia entre MAX30100 y MAX30102?

Almacenamiento:

MAX30102 es capaz de almacenar la salida digital como datos FIFO de 32 bits dentro del CI, mientras que MAX30100 tiene FIFO de 16 bits. El FIFO de 32 bits hace que el MAX30102 sea más rápido que el MAX30100.  

Resolución ADC:

La resolución de 18 bits del ADC del MAX30102 lo hace más sensible a los cambios en las tensiones IR, mientras que el MAX30100 tiene una resolución de 16 bits.

Ancho de pulso del LED:

El ancho de pulso del LED MAX30102 puede programarse de 69µs a 411µs, mientras que el MAX30100 puede programarse de 200µs a 1,6ms. Un ancho de pulso estrecho de MAX30102 permite una mayor precisión para la medición de SpO2 y la frecuencia cardíaca y también reduce el consumo de energía.

Cableado del pulsioxímetro MAX30100 con Arduino UNO

Ahora, le daré las instrucciones paso a paso para interconectar MAX30100 o MAX30102 con Arduino UNO con LCD para mostrar el resultado de la frecuencia cardíaca y SpO2.

¿Cómo se hace un sensor de pulso Arduino?

Paso 1: Interfaz del MAX30100 o MAX30102 con el Arduino UNO

En primer lugar, debe conectar el módulo MAX30100 o MAX30102 a Arduino UNO. Para ello, es necesario conectar los pines de la fuente de alimentación y los pines I2C de IC a Arduino.

Clavija MAX30100Pin de Arduino UNO
VIN3.3V
SCLA5 (SCL) y pull up con 2,2 K a 5V
SDAA4 (SDA) y pull up con 2,2 K a 5V
GNDGND

Si estás usando Arduino UNO y tu sensor MAX30100 o MAX30102 no funciona con él, sigue este procedimiento.

Como los pines del Arduino UNO trabajan con una lógica de 5V y los pines del MAX30100 están a 3.3V, necesitas subir la conexión SCL y SDA. Puedes usar una resistencia de 2.2K a 4.7K en las líneas SCL y SDA y conectarla a +5V.

Clavijas de Arduino UNO para la monitorización del ritmo cardíaco

Paso 2: Interfaz de 16×2 LCD a Arduino UNO

Estoy usando una pantalla LCD de 16×2 en paralelo, que funciona con una lógica de 5V. Como se menciona en la tabla siguiente, es necesario conectar los pines de datos, RS, y Habilitar los pines del LCD a Arduino UNO.

16×2 LCD PinPin de Arduino UNO
RSClavija digital 8
EPin digital 9
D4Clavija digital 10
D5Clavija digital 11
D6Clavija digital 12
D7Clavija digital 13
Interfaz 16x2 LCD a Arduino UNO para el control de la frecuencia cardíaca de bricolaje

Paso 3: Alimentación del LCD 16×2

Para alimentar la pantalla LCD de 16×2, es necesario conectar VSS, RW y K de la pantalla LCD a la tierra común. Luego, conecte VDD a +5V, A a +5V con una resistencia de 220 ohmios.

Para variar el contraste de un LCD 16×2, conecte V0 al único terminal del potenciómetro de 10K y los dos terminales restantes del potenciómetro a GND y +5V. Puede variar el contraste variando el potenciómetro.

Fuente de alimentación para LCD 16x2

Después de todos los pasos, su conexión se parecerá a la imagen siguiente.

Fuente de alimentación para la conexión de LCD 16x2 para la monitorización del ritmo cardíaco de bricolaje

-> Lee nuestro artículo sobre ¿Es fácil aprender Arduino?

Instalación de las librerías Arduino necesarias

Para utilizar el MAX30100 o el MAX30102 con el IDE de Arduino, puede utilizar una biblioteca ya construida de MAX30100lib.

Siga los siguientes pasos para instalar la biblioteca MAX30100 en el IDE de Arduino.

Paso 1: Abrir el Administrador de Bibliotecas en el IDE de Arduino

Ve a Herramientas > Gestionar Bibliotecas (Ctrl + Shift + I en Windows) para abrir el gestor de bibliotecas en Arduino IDE.

Administrador de bibliotecas en el IDE de Arduino

Paso 2: Buscar e instalar la biblioteca MAX30100

Ahora, en el cuadro de búsqueda, escriba "MAX30100" y podrá ver los diferentes resultados de su búsqueda.

Instalar la biblioteca MAX30100

También puedes instalar MAX30100 de Connor Huffine o MAX30100lib de OXullo Intersecans.

MAX30100lib por OXullo

Tienes que hacer clic en Instalar para instalar la biblioteca en el IDE de Arduino. Eso es todo, y usted ha instalado con éxito la biblioteca para el sensor de ritmo cardíaco MAX30100 en su Arduino IDE.

Código Arduino para la monitorización del ritmo cardíaco

El siguiente código permite medir la frecuencia cardíaca en bpm y la SpO2 en porcentaje utilizando el sensor de oximetría de pulso MAX30100 o MAX30102. Puedes ver los resultados en un monitor de serie y en una pantalla LCD de 16×2.

Puedes copiar el código haciendo clic en el botón de la esquina superior derecha del campo de código y cargarlo en tu placa Arduino UNO utilizando Arduino IDE.

#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#include <LiquidCrystal.h>

#define UPDATE_TIME   1000

// variables and pin defination
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
byte heart [8] = {0b00000, 0b01010, 0b11111, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000};
uint32_t previous_update_time = 0;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
PulseOximeter pulse;

void on_pulse_detected()
{
  Serial.println("Pulse Detected!");
}

void setup() {
  Serial.begin(115200);
  Serial.print("Initializing Pulse Oximeter..");

  lcd.createChar(2, heart);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("Initializing");
  lcd.setCursor(1, 1);
  lcd.print("Pulse Oximeter");

  delay(3000);

  if (!pulse.begin()) {
    Serial.println("Sensor begin Failed");
    for (;;);
  } else {
    Serial.println("Sensor begin Success");
  }
  //set current
  pulse.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);

  // for the pulse detection
  pulse.setOnBeatDetectedCallback(on_pulse_detected);
}

void loop() {
  pulse.update();

  if (millis() - previous_update_time > UPDATE_TIME) {

    // Display Result on LCD
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.write((uint8_t)2);
    lcd.print(" Rate:");
    lcd.print(pulse.getHeartRate());
    lcd.print("bpm");
    lcd.setCursor(0, 1);
    lcd.print(" SpO2 :");
    lcd.print(pulse.getSpO2());
    lcd.print("%");
    previous_update_time = millis();

    // Display Result on Serial Monitor
    Serial.print("Heart ❤ Rate:");
    Serial.print(pulse.getHeartRate());
    Serial.println("bpm");
    Serial.print(" SpO2 Level  :");
    Serial.print(pulse.getSpO2());
    Serial.println("%");
    previous_update_time = millis();
  }
}

Cómo funciona el código

En primer lugar, he incluido los archivos de cabecera necesarios para el MAX30100 y el LCD 16×2. Como el MAX30100 utiliza el protocolo de comunicación I2C, necesitas añadir Wire.h en tu código.

#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#include <LiquidCrystal.h>

En el void setup(), he inicializado la comunicación en serie con una tasa de baudios de 115200, así que cuando abra el monitor en serie en el IDE de Arduino, asegúrese de que establece la tasa de baudios como 115200.

Entonces, he escrito una condición de prueba para MAX30100 o MAX30102 IC.

if (!pulse.begin()) {
    Serial.println("Sensor begin Failed");
    for (;;);
  } else {
    Serial.println("Sensor begin Success");
  }

Si se inicializa con éxito, entonces verá "Senosr begin Success" en el terminal serie; de lo contrario, mostrará "Sensor begin Failed" esperar un tiempo infinito en el bucle for.

Ahora, puede ajustar la corriente que pasa por el LED. Por defecto, la corriente a través del LED es de 50mA. He establecido la corriente a través del LED IR como 7,6mA.

pulse.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);

Puede establecer diferentes corrientes para el LED IR, y una corriente más alta permitirá una penetración más profunda a través de la piel. A continuación se muestra la lista de los diferentes ajustes de corriente que puede aplicar en el código.

MAX30100_LED_CURR_0MA
MAX30100_LED_CURR_4_4MA
MAX30100_LED_CURR_7_6MA
MAX30100_LED_CURR_11MA
MAX30100_LED_CURR_14_2MA
MAX30100_LED_CURR_17_4MA
MAX30100_LED_CURR_20_8MA
MAX30100_LED_CURR_24MA
MAX30100_LED_CURR_27_1MA
MAX30100_LED_CURR_30_6MA
MAX30100_LED_CURR_33_8MA
MAX30100_LED_CURR_37MA
MAX30100_LED_CURR_40_2MA
MAX30100_LED_CURR_43_6MA
MAX30100_LED_CURR_46_8MA
MAX30100_LED_CURR_50MA

¿Cómo se mide la frecuencia cardíaca con un sensor?

Puedes detectar el pulso del sensor utilizando la función setOnBeatDetectedCallback, que llamará a la función on_pulse_detected e imprimirá el mensaje "¡Pulso detectado!" en el monitor serie.

pulse.setOnBeatDetectedCallback(on_pulse_detected);
void on_pulse_detected()
{
  Serial.println("Pulse Detected!");
}

En el bucle infinito (), la función pulse.update() actualiza la lectura del sensor. El tiempo necesario para llamar a la función pulse.update() en el bucle infinito debe ser inferior a 10 ms.

Al final, imprimirá la frecuencia cardíaca en bpm y la SpO2 en porcentaje en un monitor de serie y en la pantalla LCD cada segundo. Puede ajustar el intervalo cambiando el valor UPDATE_TIME.

¿Cómo mide Arduino la frecuencia cardíaca?

if (millis() - previous_update_time > UPDATE_TIME) {

    //Display Result on LCD
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.write((uint8_t)2);
    lcd.print(" Rate:");
    lcd.print(pulse.getHeartRate());
    lcd.print("bpm");
    lcd.setCursor(0, 1);
    lcd.print(" SpO2 :");
    lcd.print(pulse.getSpO2());
    lcd.print("%");
    previous_update_time = millis();

    //Display Result on Serial Monitor
    Serial.print("Heart ❤ Rate:");
    Serial.print(pulse.getHeartRate());
    Serial.println("bpm");
    Serial.print(" SpO2 Level  :");
    Serial.print(pulse.getSpO2());
    Serial.println("%");
    previous_update_time = millis();
  }

Finalmente, una vez cargado el código en Arduino UNO, el LED rojo del sensor se encenderá, y el valor por defecto se mostrará en la pantalla LCD, como se muestra a continuación.

LED rojo en el sensor

Vídeo de demostración del sistema de control de la frecuencia cardíaca

Puntos importantes

  • El cristal del sensor debe estar limpio y, no aplicar ninguna TINTA sobre él.
  • Coloque su dedo en el lugar correcto, sobre el IR y el LED rojo, de lo contrario el sensor puede generar resultados incorrectos.
  • No mueva el dedo; espere a que el sensor se inicialice.

Conclusión

Después de este tutorial, puedes desarrollar tu propio sistema de monitorización del ritmo cardíaco utilizando MAX30100 o MAX30102 y Arduino UNO.

Espero que hayas encontrado este tutorial informativo. Si lo has hecho, ¡compártelo con un amigo al que le guste la electrónica y hacer cosas!

Me encantaría saber qué proyecto planeas construir o ya has hecho con el Arduino. Si tienes alguna pregunta o sugerencia, o si crees que faltan cosas en este tutorial, por favor deja un comentario abajo.

Tenga en cuenta que los comentarios son retenidos por la moderación para evitar el spam.

->Consulta nuestra guía de los 12 mejores cursos online de Arduino