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) | Protocolo | Notas Importantes |
|---|---|---|
| VCC | Alimentación | Uso de 5V. |
| GND | Tierra | Conexión de referencia. |
| SCL | I2C | Línea de Datos Serial. |
| SDA | I2C | Lí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 | Protocolo | Notas Importantes |
|---|---|---|
| VCC / VIN | Alimentación del módulo (3.3V o 5V según el modelo). | 3.3V / 5V(checar módulo) |
| GND | Tierra | GND |
| SCL | I2C | Reloj de la comunicación serial |
| SDA | I2C | Datos de la comunicación serial |
| INT | Digital (Interrupción) | Interrupción (opcional) |
| IRD | No conectar | |
| RD | No conectar |
🔨Componentes
| Componente | Cantidad | Especificación | Función |
|---|---|---|---|
| Placa Arduino | 1 | Arduino Uno. | Control de componentes(cerebro) |
| Pantalla OLED | 1 | 128×32 (SSD1306) | Mostrar información |
| Sensor ritmo cardiaco | 1 | MAX30102 | Obtener ritmo cardiaco |
| Cables de conexión | n | Unir los componentes |
🔌Conexiones
Conexión OLED 128×32
| OLED 128×32 Pin | Arduino Pin |
|---|---|
| GND | GND |
| VCC | 5V |
| SCL | A5 |
| SDA | A4 |
Conexión del sensor MAX30102
| MAX30102 Pin | Arduino Pin |
|---|---|
| GND | GND |
| VCC-VIN | 3.3V o 5v(Checar módulo) |
| SCL | A5 |
| SDA | A4 |
0️⃣Código
Asegúrate de instalar las librerías necesarias desde el Gestor de Librerías del IDE de Arduino:
- Adafruit GFX Library (librería gráfica principal)
- Adafruit SSD1306 (driver específico para la pantalla)
- 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.

