Sistema de Monitoreo de Pacientes con Arduino
Trabajo desarrollado por Álvaro Ramírez Armijos, Daniel Rodríguez Buritica, David Arévalo Rey y Pablo Doval Mancheño — Asignatura: Sistemas Empotrados.
Introducción
En el contexto actual, donde los servicios sanitarios enfrentan una elevada demanda, especialmente en urgencias y consultas externas, disponer de herramientas de monitorización rápida y accesible puede marcar una diferencia significativa. Con esta motivación, desarrollamos un sistema de monitoreo de pacientes basado en Arduino: un prototipo portátil, sencillo y de bajo coste capaz de medir signos vitales básicos como el pulso, la temperatura corporal y una señal ECG elemental.
El dispositivo no pretende sustituir a un equipo médico profesional. Su objetivo es servir como una solución educativa y de primera comprobación, demostrando cómo los sistemas empotrados pueden integrarse de manera práctica en el ámbito sanitario.
Objetivos del proyecto
El proyecto se planteó con los siguientes objetivos principales:
- Diseñar y montar un prototipo funcional de monitorización básica de pacientes.
- Integrar distintos sensores biomédicos en un mismo sistema empotrado.
- Mostrar los datos obtenidos en tiempo real mediante una pantalla OLED.
- Detectar valores fuera de rango y generar avisos visuales y sonoros.
- Desarrollar un código modular, limpio y fácil de entender.
- Construir una solución económica, portátil y ampliable.
Componentes utilizados y coste
El prototipo se construyó con componentes electrónicos asequibles. Muchos de ellos ya estaban disponibles, por lo que no supusieron coste adicional. La tabla siguiente resume los elementos utilizados:
| Componente | Precio aproximado |
|---|---|
| Arduino UNO | Gratis |
| Dos protoboards | Gratis |
| Pantalla OLED 0.96″ | 11,91 € |
| LED rojo | Gratis |
| Zumbador activo | 7,76 € |
| Módulo MAX3010X (pulso) | 6,99 € |
| Resistencia 4.7K | Gratis |
| Módulo AD8232 (ECG) | 11,99 € |
| Electrodos adhesivos | 7,99 € |
| Sensor de temperatura | 9,99 € |
| Total | 56,63 € |
Con un coste total de apenas 56,63 €, el sistema resulta especialmente interesante si se compara con equipos comerciales de monitorización médica, que pueden superar varios miles de euros.
Implementación hardware
El montaje se realizó sobre protoboards, conectando todos los módulos al Arduino UNO. En algunos casos fue necesario soldar los pines con estaño para garantizar conexiones estables y evitar falsos contactos durante las pruebas.
Los componentes principales integrados fueron:
- Módulo MAX3010X: encargado de la lectura de la frecuencia cardíaca.
- Módulo AD8232: para la captura de la señal ECG mediante electrodos adhesivos colocados sobre el cuerpo del usuario.
- Sensor de temperatura digital: calibrado mediante pruebas sucesivas para asegurar lecturas coherentes.
- Pantalla OLED: muestra la información en tiempo real de forma clara y compacta.
- LED rojo y zumbador activo: actúan como sistema de alerta cuando se detectan valores fuera de rango.
Implementación software
El desarrollo del software siguió un enfoque incremental y modular. Cada sensor se probó de forma individual antes de integrar todo el sistema en un único programa. Las librerías principales utilizadas fueron:
#include <Wire.h>
#include "MAX30105.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
La estructura del programa se organiza en tres funciones principales:
leerMAX(); // Lectura del pulso
leerTemp(); // Lectura de temperatura
mostrarDatos(); // Visualización en OLED y gestión de alarmas
Se definieron umbrales para detectar valores anómalos y activar las alarmas correspondientes:
const float TEMP_ALTA = 40.0;
const float BPM_BAJO = 50.0;
const float BPM_ALTO = 97.0;
const long UMBRAL_DEDO = 70000;
La pantalla se actualiza aproximadamente cada segundo, ofreciendo una visualización estable. El umbral del dedo permite verificar si el usuario está correctamente colocado sobre el sensor antes de procesar cualquier lectura.
Código empleado
#include <Wire.h>
#include "MAX30105.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// MAX3010x
MAX30105 sensorPulso;
long anteriorIR = 0;
unsigned long ultimoLatidoMAX = 0;
float bpmMAX = 0;
float mediaMAX = 0;
bool subiendoMAX = false;
// AD8232
const int pinECG = A0;
const int LOmas = 10;
const int LOmenos = 11;
// DS18B20
#define PIN_TEMP 2
OneWire oneWire(PIN_TEMP);
DallasTemperature sensorTemp(&oneWire);
// LED y BUZZER
const int pinBuzzer = 6;
const int pinLedRojo = 7;
// Rangos
const float TEMP_ALTA = 40.0;
const float BPM_BAJO = 50.0;
const float BPM_ALTO = 97.0;
const long UMBRAL_DEDO = 70000;
unsigned long ultimaPantalla = 0;
unsigned long ultimaTemp = 0;
float temperatura = 0;
void setup() {
Serial.begin(9600);
delay(1000);
pinMode(LOmas, INPUT);
pinMode(LOmenos, INPUT);
pinMode(pinBuzzer, OUTPUT);
pinMode(pinLedRojo, OUTPUT);
sensorTemp.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Sistema iniciado");
display.display();
if (!sensorPulso.begin(Wire, I2C_SPEED_STANDARD)) {
display.clearDisplay();
display.setCursor(0, 0);
display.print("ERROR MAX3010x");
display.display();
} else {
sensorPulso.setup(0xFF, 8, 2, 100, 411, 16384);
sensorPulso.setPulseAmplitudeRed(0xFF);
sensorPulso.setPulseAmplitudeIR(0xFF);
sensorPulso.setPulseAmplitudeGreen(0);
}
}
void loop() {
leerMAX();
leerTemp();
if (millis() - ultimaPantalla >= 1000) {
ultimaPantalla = millis();
mostrarDatos();
}
delay(20);
}
void leerMAX() {
long ir = sensorPulso.getIR();
if (ir < UMBRAL_DEDO) {
bpmMAX = 0;
mediaMAX = 0;
anteriorIR = ir;
subiendoMAX = false;
ultimoLatidoMAX = 0;
return;
}
long cambio = ir - anteriorIR;
if (abs(cambio) > 5000) {
anteriorIR = ir;
return;
}
if (cambio > 80) {
subiendoMAX = true;
}
if (subiendoMAX && cambio < -80) {
subiendoMAX = false;
unsigned long ahora = millis();
if (ultimoLatidoMAX == 0) {
ultimoLatidoMAX = ahora;
anteriorIR = ir;
return;
}
unsigned long dif = ahora - ultimoLatidoMAX;
if (dif > 450 && dif < 1300) {
bpmMAX = 60000.0 / dif;
if (bpmMAX > 45 && bpmMAX < 140) {
if (mediaMAX == 0) mediaMAX = bpmMAX;
mediaMAX = mediaMAX * 0.85 + bpmMAX * 0.15;
}
}
ultimoLatidoMAX = ahora;
}
anteriorIR = ir;
}
void leerTemp() {
if (millis() - ultimaTemp >= 1000) {
ultimaTemp = millis();
sensorTemp.requestTemperatures();
temperatura = sensorTemp.getTempCByIndex(0);
}
}
void mostrarDatos() {
long ir = sensorPulso.getIR();
int valorECG = analogRead(pinECG);
bool dedoPuesto = ir >= UMBRAL_DEDO;
bool electrodosDesconectados = digitalRead(LOmas) == 1 || digitalRead(LOmenos) == 1;
bool tempAlta = temperatura >= TEMP_ALTA && temperatura != -127;
bool pulsoMalo = dedoPuesto && mediaMAX != 0 && (mediaMAX < BPM_BAJO || mediaMAX > BPM_ALTO);
digitalWrite(pinLedRojo, electrodosDesconectados ? HIGH : LOW);
if (tempAlta || pulsoMalo) {
tone(pinBuzzer, 1000);
} else {
noTone(pinBuzzer);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Temperatura: ");
display.print(temperatura, 2);
display.print(" C");
display.setCursor(0, 12);
display.print("Pulso: ");
if (!dedoPuesto) {
display.print("sin dedo");
} else if (mediaMAX == 0) {
display.print("detectando...");
} else {
display.print(mediaMAX, 0);
display.print(" BPM ");
if (mediaMAX < BPM_BAJO) display.print("BAJO");
else if (mediaMAX > BPM_ALTO) display.print("ALTO");
else display.print("OK");
}
display.setCursor(0, 24);
display.print("ECG valor: ");
if (electrodosDesconectados) {
display.print("0");
} else {
display.print(valorECG);
display.print(" ");
if (valorECG < 50 || valorECG > 970) display.print("PELIGROSO");
else display.print("OK");
}
display.setCursor(0, 36);
display.print("Electrodos: ");
if (electrodosDesconectados) {
display.print("DESCONECT");
} else {
display.print("CONECTADOS");
}
display.display();
}
Fases del desarrollo
El proyecto se llevó a cabo en las siguientes etapas:
- Selección y fijación de componentes — Se eligieron los módulos necesarios y se prepararon las conexiones en la protoboard.
- Comprobación individual de cada módulo — Se verificó el funcionamiento de cada sensor por separado para detectar posibles fallos de conexión.
- Integración del sensor de pulso y ECG — Se añadieron y probaron los módulos de medición cardíaca.
- Integración del sensor de temperatura — Se ajustó el código para obtener lecturas periódicas y visualizarlas correctamente.
- Conexión de la pantalla OLED — Se habilitó la visualización en tiempo real, aumentando la autonomía del prototipo.
- Pruebas del sistema completo — Se comprobó que todos los componentes trabajaban correctamente de forma conjunta.
- Presentación final — Se organizó el montaje y se preparó documentación visual del funcionamiento.
Problemas encontrados y soluciones
Durante el desarrollo surgieron varios desafíos técnicos:
- Pines sin soldar: algunos módulos no tenían los pines soldados, lo que impedía una conexión firme a la protoboard. Se resolvió soldando los pines con estaño.
- Inestabilidad en la lectura del pulso: las lecturas variaban según la colocación y presión del dedo. Se añadieron umbrales de validación para filtrar lecturas incorrectas.
- Señal ECG irregular: la señal era inestable si los electrodos no estaban bien posicionados o el usuario se movía. Se realizaron pruebas exhaustivas de colocación.
- Integración de todos los módulos: combinar todos los sensores en un único programa resultó más complejo que las pruebas individuales. Se solucionó separando el código en funciones específicas para cada componente.
Funcionamiento general
El sistema arranca cuando el usuario coloca el dedo en el sensor de pulso y conecta los electrodos del módulo ECG. A partir de ese momento:
- El sensor MAX3010X verifica que el dedo está correctamente colocado antes de calcular la frecuencia cardíaca.
- El sensor de temperatura realiza lecturas periódicas y actualiza el valor en pantalla.
- El módulo AD8232 captura la señal ECG básica relacionada con la actividad cardíaca.
- La pantalla OLED muestra todos los datos en tiempo real.
- Si algún valor supera los límites definidos, el LED rojo y el zumbador se activan como alerta visual y sonora.
Casos de uso
A pesar de ser un prototipo académico, el sistema puede aplicarse en varios escenarios reales:
- Monitorización en casa: comprobación rápida de pulso, temperatura y señal ECG como orientación inicial.
- Apoyo previo a la atención médica: primera comprobación antes de acudir a un profesional sanitario.
- Entornos de bajos recursos: el bajo coste y la facilidad de montaje lo convierten en una herramienta educativa y de demostración muy accesible.
- Residencias y centros de cuidado: vigilancia básica y rápida de parámetros vitales.
Mejoras futuras
El prototipo actual puede evolucionar en varias direcciones:
- Conectividad IoT: incorporar WiFi o Bluetooth para enviar datos a una aplicación móvil o plataforma en la nube.
- Diseño PCB: sustituir la protoboard por una placa de circuito impreso más robusta y compacta.
- Batería recargable: para convertir el dispositivo en algo verdaderamente portátil y autónomo.
- Algoritmos avanzados de detección: análisis más detallado de la señal ECG para identificar posibles arritmias u otras irregularidades cardíacas.
Conclusiones
Este proyecto ha demostrado que es posible construir un sistema funcional de monitorización básica de pacientes con un presupuesto muy reducido y componentes de fácil acceso. A lo largo del desarrollo, el equipo adquirió experiencia práctica en la integración de hardware y software, aprendiendo a trabajar con múltiples módulos simultáneamente y a resolver los problemas que surgen en un entorno real de desarrollo.
El resultado es un prototipo capaz de medir temperatura, pulso y señal ECG, mostrar la información en pantalla y generar alertas ante valores anómalos. Aunque se trata de un trabajo académico, abre la puerta a comprender cómo los sistemas empotrados pueden tener un impacto real y accesible en el ámbito de la salud.
Video
A continuación podéis ver el prototipo en funcionamiento:
Proyecto desarrollado en el marco de la asignatura Sistemas Empotrados. Los autores son Álvaro Ramírez Armijos, Daniel Rodríguez Buritica, David Arévalo Rey y Pablo Doval Mancheño.