Monitoreo Cardiovascular en Tiempo Real: Arduino + MAX30102

En la era de la tecnología vestible (wearables), entender cómo funciona nuestro cuerpo es más accesible que nunca. El corazón, ese motor incansable que bombea aproximadamente 5 litros de sangre por minuto, emite señales eléctricas y ópticas que podemos capturar con precisión utilizando sensores biométricos avanzados y microcontroladores de código abierto.

Este proyecto no solo es una excelente práctica de programación y electrónica, sino que es una ventana al fascinante mundo de la fotopletismografía (PPG), la técnica que permite medir la saturación de oxígeno y el pulso mediante luz.



🔩Funcionamiento

El Cerebro del Sistema: Arduino UNO

El Arduino UNO utiliza el microcontrolador ATmega328P de Atmel (ahora Microchip). Este chip opera típicamente a 16 MHz y ofrece una arquitectura sencilla pero potente con 32 KB de memoria Flash para el código.

I2C es un protocolo de comunicación serial que permite que un microcontrolador (el Maestro) se comunique con múltiples periféricos (los Esclavos) usando solo dos cables de señal, además de la alimentación.

Los modelos más modernos de Arduino (como el Uno R3, el Mega, o el Leonardo) también tienen pines I2C dedicados cerca del pin AREF, pero internamente, en el Uno, están conectados a A4 y A5. Por compatibilidad, siempre se recomienda usar A4 y A5.

La Comunicación I2C y la Pantalla OLED 128 x 32

La pantalla OLED (Organic Light-Emitting Diode) es ideal por su alto contraste, bajo consumo de energía y tamaño compacto. La mayoría de los módulos de 128 x 32 píxeles utilizan el chip controlador SSD1306 o SSH1106 y se comunican a través del bus I2C.

  • Protocolo de Dos Hilos: I2C es un bus de comunicación serial que, de manera inteligente, requiere solo dos líneas para transferir datos entre el maestro (Arduino) y los esclavos (la pantalla):
    • SDA (Serial Data Line): Línea de datos.
    • SCL (Serial Clock Line): Línea de sincronización del reloj.

PINES del OLED 128×32(SSD1306)

Pin OLED 128×32(I2C)ProtocoloNotas Importantes
VCCAlimentaciónUso de 5V.
GNDTierraConexión de referencia.
SCLI2CLínea de Datos Serial.
SDAI2CLínea de Reloj Serial.

Principio de Funcionamiento del MAX30102

El funcionamiento del sensor MAX30102 es un despliegue fascinante de ingeniería biomédica miniaturizada. Su operación se basa en una técnica llamada fotopletismografía (PPG), que consiste en detectar cambios de volumen en el tejido mediante la iluminación del mismo y la medición de la luz que se refleja o transmite.

El sensor cuenta con una estructura interna diseñada para aislar la luz y evitar interferencias:

  • LED Rojo (660nm) e Infrarrojo (880nm): Estos componentes emiten ráfagas de luz hacia la piel (generalmente la punta del dedo).
  • Fotodetector: Un sensor de silicio extremadamente sensible que recoge los fotones que regresan después de rebotar en los tejidos y la sangre.
  • Cristal de Protección: Una capa de vidrio que filtra la luz ambiental y protege los componentes electrónicos.

PINES del sensor MAX30102

Pin MAX30102 ProtocoloNotas Importantes
VCC / VINAlimentación del módulo (3.3V o 5V según el modelo).3.3V / 5V(checar módulo)
GNDTierraGND
SCLI2CReloj de la comunicación serial
SDAI2CDatos de la comunicación serial
INTDigital (Interrupción)Interrupción (opcional)
IRDNo conectar
RDNo conectar

🔨Componentes

ComponenteCantidadEspecificaciónFunción
Placa Arduino1Arduino Uno.Control de componentes(cerebro)
Pantalla OLED1128×32 (SSD1306)Mostrar información
Sensor ritmo cardiaco1MAX30102 Obtener ritmo cardiaco
Cables de conexiónnUnir los componentes

🔌Conexiones

Conexión OLED 128×32

OLED 128×32 PinArduino Pin
GNDGND
VCC5V
SCLA5
SDAA4

Conexión del sensor MAX30102

MAX30102 PinArduino Pin
GNDGND
VCC-VIN3.3V o 5v(Checar módulo)
SCLA5
SDAA4

0️⃣Código

Asegúrate de instalar las librerías necesarias desde el Gestor de Librerías del IDE de Arduino:

  1. Adafruit GFX Library (librería gráfica principal)
  2. Adafruit SSD1306 (driver específico para la pantalla)
  3. SparkFun MAX3010x(librería para a para el sensor de ritmo cardiaco)
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <Arduino.h>

#include <Wire.h>
#include "MAX30105.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

void dibujarPico();
void actualizarVisualizacion();

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

MAX30105 particleSensor;

long lastBeat = 0;
float beatAvg = 0;
int xPos = 0;
bool beatDetected = false;

// Variables de autocalibración
float filtroPasoBajo = 0;

void setup() {
  Serial.begin(115200);
  
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    for(;;); 
  }
  
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(20, 10);
  display.print("Iniciando...");
  display.display();

  // Inicializar sensor
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println("Sensor no encontrado");
    while (1);
  }

  // Configuración estándar recomendada
  particleSensor.setup(); 
  particleSensor.setPulseAmplitudeRed(0x0A); // LED Rojo (bajo brillo)
  particleSensor.setPulseAmplitudeIR(0x1F);  // LED IR (brillo moderado para detección)
}

void loop() {
  long irValue = particleSensor.getIR();

  // Si el valor es muy bajo (menos de 20,000), no hay dedo
  if (irValue < 20000) {
    display.clearDisplay();
    display.setCursor(25, 12);
    display.print("PON EL DEDO");
    display.display();
    beatAvg = 0;
    xPos = 0;
    return;
  }

  // Algoritmo de seguimiento de señal (Filtro Paso Bajo)
  filtroPasoBajo = (filtroPasoBajo * 0.94) + (irValue * 0.06);
  long diferencia = irValue - (long)filtroPasoBajo;

  // Detección de pulso por flanco ascendente (Diferencia relativa)
  if (diferencia > 450 && !beatDetected) { 
    beatDetected = true;
    
    // Calcular BPM basándose en el tiempo entre picos
    long tiempoActual = millis();
    long delta = tiempoActual - lastBeat;
    
    if (delta > 400 && delta < 1500) { // Rango de 40 a 150 BPM
      float bpmActual = 60000.0 / delta;
      // Suavizado del número mostrado
      if(beatAvg == 0) beatAvg = bpmActual; // Primera lectura
      else beatAvg = (beatAvg * 0.7) + (bpmActual * 0.3);
    }
    lastBeat = tiempoActual;
    dibujarPico();
  } 

  // Resetear el detector cuando la señal baja de la cresta
  if (diferencia < 150) {
    beatDetected = false;
  }

  actualizarVisualizacion();
}

void dibujarPico() {
  // Dibuja el pico del electrocardiograma
  display.drawLine(xPos, 31, xPos + 2, 10, WHITE);
  display.drawLine(xPos + 2, 10, xPos + 4, 31, WHITE);
  xPos += 4;
}

void actualizarVisualizacion() {
  // Dibujar el valor numérico de BPM
  display.fillRect(0, 0, 128, 10, BLACK);
  display.setCursor(0, 0);
  display.print("BPM: ");
  display.print((int)beatAvg);

  // Dibujar la línea base constante
  display.drawPixel(xPos, 31, WHITE);
  xPos++;

  // Reiniciar barrido de pantalla
  if (xPos >= SCREEN_WIDTH) {
    xPos = 0;
    display.clearDisplay();
  }
  display.display();
}


🖌️Diseños


🎬Videos


📑Conclusión

La implementación de este sistema de monitoreo cardíaco basado en el sensor MAX30102 y la plataforma Arduino Uno representa una convergencia exitosa entre la electrónica digital, la programación embebida y la biometría aplicada. A través del desarrollo de este proyecto, se ha logrado transformar una señal fisiológica analógica —el flujo volumétrico de sangre en los capilares— en una representación visual digital y comprensible en tiempo real mediante una pantalla OLED SSD1306.

Logros Técnicos y Aprendizaje

Desde una perspectiva técnica, el proyecto demuestra la eficiencia del protocolo de comunicación I2C, permitiendo que múltiples periféricos (el sensor y la pantalla) coexistan en un mismo bus de datos sin sacrificar la velocidad de muestreo necesaria para capturar la onda pletismográfica. La integración de la técnica de fotopletismografía (PPG) subraya la importancia de la precisión en la adquisición de datos, donde factores como la luz ambiental, la presión mecánica sobre el sensor y el filtrado de ruido digital juegan un papel crítico en la obtención de una lectura de BPM (Latidos por Minuto) estable.

Impacto y Proyección

Más allá de ser un simple prototipo, este dispositivo sirve como base para aplicaciones más complejas en el ámbito de la e-Salud (e-Health) y el Internet de las Cosas (IoT). La capacidad de visualizar la onda de frecuencia no solo aporta un valor estético, sino que permite al usuario verificar la fidelidad de la lectura; una onda rítmica y limpia es sinónimo de un sensor bien colocado y un algoritmo de detección de picos funcionando correctamente.

Reflexión Final

En conclusión, este proyecto reafirma que la democratización de la tecnología médica, facilitada por hardware de código abierto, permite a estudiantes y desarrolladores explorar las fronteras del monitoreo humano de forma segura y educativa. Aunque no sustituye a un equipo médico profesional, sienta las bases para entender los mecanismos de diagnóstico que salvan vidas diariamente, recordándonos que el corazón, además de ser un motor biológico, es una fuente constante de datos listos para ser interpretados por la tecnología adecuada.


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Carrito de compra