¿Qué pasa si a un monitor de ECG casero le quitas la limitación de la pantalla chica y le das un navegador? Pasas de mirar una curva de 4 pulgadas en el escritorio a ver el trazado en grande desde el notebook o el celular, y además a registrar las mediciones para analizarlas después en una planilla. Ese es el salto de este proyecto: un ESP32 que lee un ADS1292R, calcula frecuencia cardiaca, intervalo R-R y frecuencia respiratoria, las muestra en una TFT ILI9488 y, al mismo tiempo, sirve un dashboard web por WiFi con registro exportable a Excel.
Al terminar vas a entender cómo un front end analógico mide ECG y respiración con los mismos tres electrodos, cómo repartir el trabajo del ESP32 para que la pantalla y el WiFi no arruinen el muestreo, y cómo validar todo con un simulador antes de pensar en una persona.
Advertencia médica, léela antes de seguir. Esto es un prototipo educativo, no un equipo médico certificado. No sirve para diagnosticar ni para vigilar a un paciente. Las primeras pruebas se hacen con un simulador de ECG y respiración por impedancia. No conectes a una persona a un prototipo enchufado al USB, a un depurador, a un cargador o a la red eléctrica sin aislación del lado del paciente verificada de forma independiente, limitación de corriente, protección de entradas y una revisión de seguridad hecha por alguien calificado. Que funcione a batería, por sí solo, no lo vuelve seguro.

El concepto: un instrumento con dos caras
El sistema tiene cuatro bloques: la interfaz de electrodos, el front end analógico ADS1292R, el ESP32 (procesamiento y WiFi) y las dos interfaces de usuario, la local en la TFT y la remota en el navegador. Este proyecto es la continuación de un monitor anterior del mismo autor que solo dibujaba en la pantalla; lo nuevo es el servidor web y el registrador de datos.

El reparto de canales es fijo: el canal 2 del ADS1292R lleva el ECG y el canal 1 la señal de respiración ya demodulada. El ESP32 lee ambos a 500 muestras por segundo y los procesa por separado.
La decisión de diseño que más importa es invisible en el diagrama: el ADS1292R y la TFT van en buses SPI distintos. Redibujar una pantalla de 480 × 320 píxeles toma milisegundos, y si compartiera bus con el sensor, cada actualización de la TFT podría retrasar la lectura de una muestra. Con 500 SPS tienes exactamente 2 ms entre muestras; perder una deforma el trazado y puede confundir al detector de latidos. Por eso, además, la adquisición corre en una tarea dedicada de FreeRTOS, que permite detectar cuadros perdidos y sostener el flujo estable de 500 SPS mientras otra tarea atiende el WiFi y la pantalla.
Cómo se mide un corazón (y una respiración) con tres cables
El ECG
Un electrocardiograma registra diferencias de potencial que genera el corazón, del orden de los milivoltios en la piel. Para que un microcontrolador las procese hay que amplificarlas y digitalizarlas con mucha resolución y poco ruido. La onda típica tiene la onda P, el complejo QRS y la onda T.

El firmware se concentra en el QRS, que es lo más prominente, y en la separación entre picos R sucesivos. Ese tiempo es el intervalo R-R, y de él sale la frecuencia: BPM = 60.000 / R-R en milisegundos. Un R-R de 800 ms equivale a 75 BPM.
La respiración por impedancia
Aquí está lo que distingue al ADS1292R del ADS1292 a secas. El chip inyecta una excitación pequeña de alta frecuencia por el mismo camino de los electrodos. Cuando el pecho se expande, la impedancia eléctrica del tórax cambia levemente; el ADS1292R demodula esa variación y entrega una señal lenta que sube y baja con cada respiración. Esta técnica se llama neumografía por impedancia y es la que usan muchos monitores de cabecera, porque no necesita un sensor extra en el pecho.

El firmware filtra esa señal, detecta ciclos sucesivos y calcula las respiraciones por minuto (RPM).
Dónde van los electrodos
Se usa un cable de 3 electrodos. RA y LA forman el par diferencial del ECG y también participan en la medición de respiración; RL lo usa el circuito de pierna derecha (RLD) para reducir la interferencia de modo común, típicamente el zumbido de 50 Hz de la red.
- RA: brazo derecho o zona superior derecha del pecho.
- LA: brazo izquierdo o zona superior izquierda del pecho.
- RL: pierna derecha o una posición de referencia baja del lado derecho.

Electrodos sueltos, gel seco, movimiento del cable o mala ubicación afectan a las dos mediciones. Si la respiración sale errática pero el ECG se ve bien, lo primero que conviene revisar es el contacto: la señal de impedancia es mucho más sensible al movimiento que el ECG.
Hardware
El ADS1292R
Es un front end analógico de bajo consumo, de 2 canales y 24 bits, diseñado para ECG y biopotenciales. Integra ADC delta sigma, amplificadores de ganancia programable, referencia y oscilador internos, detección de electrodo desconectado (lead off), pierna derecha activa y el circuito de respiración por impedancia.

- ADC de 24 bits, 2 canales diferenciales simultáneos.
- Tasa de datos programable de 125 SPS a 8 kSPS.
- Ganancia programable: 1, 2, 3, 4, 6, 8 y 12.
- Interfaz SPI.
- Respiración por impedancia integrada, lead off y RLD.
Por qué no basta un AD8232. El AD8232 es el clásico módulo de ECG para empezar: entrega una señal analógica que lees con el ADC del microcontrolador. Funciona bien para ver la curva, pero el ADC de 12 bits del ESP32 es ruidoso y poco lineal, y el AD8232 no mide respiración. El ADS1292R digitaliza dentro del chip con 24 bits y te entrega los datos limpios por SPI, junto con el estado de los electrodos. La contracara es la complejidad: hay que configurar registros y respetar los tiempos.
La pantalla ILI9488 de 4 pulgadas
TFT a color de 480 × 320 píxeles con controlador ILI9488 e interfaz SPI. En este proyecto la TFT pasa a segundo plano: muestra los valores numéricos, el estado de los electrodos y las advertencias, mientras el trazado grande vive en el navegador.

Lista de componentes
- ESP32 DevKit (1)
- Módulo ADS1292R con cable de 3 electrodos (1)
- Pantalla TFT ILI9488 de 4 pulgadas SPI (1)
- Resistencias de 22 Ω (15)
- Resistencia de 1 kΩ (1)
- Resistencias de 10 kΩ (5)
- Condensadores electrolíticos de 10 µF (5)
- Condensadores cerámicos de 100 nF (5)
- Tiras de pin header hembra para montar los módulos
Conexiones
El autor reúne todo en una placa portadora, pero las conexiones son las mismas si armas en protoboard.

ADS1292R al ESP32 (bus SPI del sensor)
| Señal del módulo | GPIO del ESP32 | Función |
|---|---|---|
| SCK / SCLK | 14 | Reloj SPI del ADS |
| MOSI / DIN | 13 | Comandos y configuración hacia el ADS1292R |
| MISO / DOUT | 35 | Estado y datos de conversión desde el ADS1292R |
| CS | 27 | Selección del chip |
| DRDY | 34 | Aviso de dato listo hacia el ESP32 |
| START | 25 | Control de conversión |
| PWDN/RESET | 26 | Reset y apagado |
| GND | GND | Referencia común |
El SPI del sensor trabaja a 500 kHz en modo 1. Fíjate en que MISO y DRDY usan los GPIO 34 y 35: en el ESP32 esos pines son solo de entrada y no tienen pull up interno, lo que calza justo con señales que solo llegan desde el sensor. DRDY baja cuando hay una conversión lista; la tarea de adquisición lee entonces la palabra de estado y los dos canales, revisa encuadre y tiempos y pasa los datos aceptados al procesamiento.
ILI9488 al ESP32 (bus SPI de la pantalla)
| Pin de la ILI9488 | GPIO del ESP32 |
|---|---|
| SCK | 18 |
| SDI / MOSI | 23 |
| SDO / MISO | 19 |
| CS | 33 |
| DC / RS | 32 |
| RESET | 4 |
| GND | GND |
| VCC y LED (retroiluminación) | Según la alimentación verificada de tu módulo |
Los GPIO 18, 19 y 23 son el bus VSPI nativo del ESP32, así que la pantalla corre por hardware dedicado a buena velocidad, mientras el sensor usa otro conjunto de pines.
Dos puentes de soldadura que no puedes olvidar
LOGIC SEL. El módulo trae un puente que elige el voltaje lógico de la interfaz. Como el ESP32 trabaja a 3,3 V, une el pad central con el lado +3,3 V con un poco de soldadura, y nunca los lados de 3,3 V y 5 V a la vez. El ADS1292R acepta una alimentación digital de 1,7 V a 3,6 V; algunos módulos traen conversión de niveles para trabajar con 5 V, pero con el ESP32 la posición correcta es 3,3 V.
CLKSEL. Define si el ADS1292R usa su oscilador interno o un reloj externo. Según la hoja de datos, CLKSEL en alto elige el interno. Configúralo así: el circuito queda más simple y el pin CLK no necesita señal del microcontrolador.
Placa de circuito impreso
El esquemático se hizo en EasyEDA y se pasó a una PCB de doble cara con componentes mayormente pasantes, todos por el lado frontal, lo que facilita el armado.


El autor montó el ESP32, el ADS1292R y la ILI9488 sobre tiras de pin header hembra, para poder sacarlos o reemplazarlos después, y repartió los condensadores de desacoplo de 10 µF y 100 nF como indica el esquemático. Esos condensadores no son decorativos: en una señal de microvoltios, el ruido de la fuente aparece directo en el trazado. Si armas en protoboard, pon un cerámico de 100 nF lo más cerca posible de la alimentación de cada módulo.
Software
El firmware completo se descarga desde el tutorial original (enlace en Recursos). Deja todos los archivos juntos en la misma carpeta del sketch de Arduino antes de compilar y subir al ESP32.
Lo que hace, a grandes rasgos: configura el ADS1292R, lee ECG y respiración a tasa fija, filtra, detecta latidos y ciclos respiratorios, calcula BPM, R-R y RPM, actualiza la TFT y sirve el dashboard. También vigila los electrodos, las señales recortadas o inválidas, el ritmo de adquisición y la comunicación con el sensor. Si la señal no permite una medición confiable, muestra un aviso en vez de seguir enseñando un valor viejo.
Lo que debes revisar en settings.h
WIFI_SSIDyWIFI_PASSWORD: la red a la que se une el ESP32.WIFI_AP_SSIDyWIFI_AP_PASSWORD: el punto de acceso propio que levanta el ESP32 si no logra unirse a la red.NOTCH_HZ: el filtro de la frecuencia de la red. En Chile la red es de 50 Hz, así que va en 50; si lo dejas en 60, el zumbido de la red queda pasando.RESP_ENABLED: activa el procesamiento de respiración. Déjalo activo.RESP_PHASE_CODE: la fase de demodulación de la respiración. Depende del módulo y de su red analógica, así que hay que verificarla con tu hardware.ECG_PIXELS_PER_UV: el tamaño del trazado en el navegador.ECG_POLARITY: cámbialo si el ECG sale invertido por la orientación de los electrodos.STARTUP_SELF_TEST: si corre la prueba interna del ADS1292R al encender.
El firmware está calibrado para 500 SPS y ganancia 6. El escalado, los filtros, los chequeos de tiempo y la detección dependen de esos valores: no los cambies por separado sin revisar también el procesamiento.
Cómo se procesan las señales
ECG. Primero se quita la deriva lenta de la línea base (la que producen la respiración y el movimiento), después se aplica el notch de la red y un pasabajos. Hay un filtro extra solo para que el trazado se vea suave, mientras el detector de latidos trabaja sobre la señal de banda más ancha. El detector de QRS aplica límites de tiempo para que dos picos de ruido muy juntos no cuenten como latidos: fisiológicamente, entre dos latidos reales siempre hay un período refractario de un par de cientos de milisegundos.
Respiración. Cambia mucho más lento que el ECG (de 12 a 20 ciclos por minuto en reposo, contra 60 a 100 latidos), así que tiene su propio camino de filtrado de baja frecuencia. Su fase y sus umbrales hay que validarlos en el hardware real o con un simulador.
Vigilancia continua. El firmware revisa la palabra de estado, el lead off, el recorte, la amplitud, el ruido excesivo, el ritmo de muestreo y la continuidad del flujo, y relee de vez en cuando los registros del ADS1292R. Si algo falla, informa el estado e intenta recuperarse solo.
El dashboard web, que es lo nuevo
Al encender, el ESP32 intenta unirse a la red de settings.h; si lo logra, levanta un servidor HTTP local y el dashboard queda disponible para cualquier equipo de la misma red. Si no, crea su propio punto de acceso. No necesita internet ni un servidor en la nube: todo pasa entre el ESP32 y tu navegador.
La interfaz se adapta a notebook, tablet y celular. En una pantalla 16:9 de notebook caben el trazado, la frecuencia cardiaca, la respiración, el R-R, el estado y los controles del registrador sin hacer scroll.
- Trazado en vivo: un interruptor de filtro permite comparar el ECG procesado con uno menos filtrado, donde se nota el zumbido de la red y el ruido de alta frecuencia. Ese interruptor cambia solo lo que ves, no los cálculos.
- Tres mediciones: frecuencia cardiaca en BPM, respiración en RPM y R-R en milisegundos. Los íconos de corazón y pulmón se animan al ritmo de cada una.
- Estados: adquiriendo, listo, electrodo desconectado, señal recortada, señal baja, frecuencia inestable y otras fallas.
- Modo día y noche: el navegador recuerda el tema elegido.
El registrador con exportación a Excel
Graba lo que el monitor ya calcula: BPM, RPM, R-R, la marca de tiempo, el tiempo transcurrido y el estado de la señal. El intervalo se elige desde el dashboard: 0,1; 0,2; 0,5; 1; 2; 3; 5 o 10 segundos. Con Start y Stop controlas la sesión, y con Export Excel generas un archivo .xlsx nativo dentro del mismo navegador, sin pasar por ningún sitio externo.
Ojo: guarda las mediciones numéricas, no la onda cruda de 500 SPS. Si quieres la onda completa, mira la sección de variantes.
Pruebas: siempre primero con simulador
- Conecta un simulador de ECG y respiración en lugar de una persona. Así revisas adquisición, cálculo de frecuencia, respiración, TFT, dashboard, detección de electrodos y registrador sin riesgo.
- Al encender, el ADS1292R hace sus chequeos y el firmware confirma que recibe un flujo constante de muestras. Cuando la adquisición se estabiliza, la TFT muestra los valores y puedes abrir el dashboard.
- En el navegador, confirma que el trazado avanza sin saltos y que BPM, RPM y R-R siguen lo que configuraste en el simulador.
- Desconecta un electrodo: el monitor debe avisar un error de electrodo o señal, no seguir mostrando el valor anterior como válido.
- Inicia el registrador, elige un intervalo, deja que junte varias mediciones y exporta. Abre el Excel y revisa las columnas de tiempo, BPM, RPM y R-R.
Problemas típicos. Si el ESP32 no encuentra el sensor, revisa el puente LOGIC SEL y que CLKSEL esté en reloj interno. Si el trazado sale invertido, cambia ECG_POLARITY. Si ves una ondulación regular encima del ECG, casi seguro es la red: confirma NOTCH_HZ en 50 y aleja los cables del cargador. Si la respiración sale plana, prueba otros valores de RESP_PHASE_CODE.
Cualquier experimento posterior con electrodos en una persona requiere aislación eléctrica y un diseño de seguridad para el paciente adecuados. Este proyecto no es un monitor clínico ni de diagnóstico.
Variantes y mejoras
- Guardar la onda completa en una microSD. El registrador del navegador solo guarda números. Con un módulo microSD por SPI (puede compartir el bus de la pantalla con su propio CS) puedes escribir las muestras crudas de ambos canales en un CSV y analizarlas después en Python, por ejemplo para probar otros algoritmos de detección de QRS sobre los mismos datos.
- Variabilidad de la frecuencia cardiaca (HRV). El firmware ya tiene la serie de intervalos R-R. Calcular el RMSSD (la raíz del promedio de las diferencias al cuadrado entre R-R sucesivos) sobre una ventana de un minuto y mostrarlo en el dashboard es un agregado chico, y es una de las métricas más usadas en estudios de estrés y recuperación deportiva.
- Versión de entrada con AD8232. Si solo quieres aprender la parte web, puedes reemplazar el ADS1292R por un AD8232 leído por el ADC del ESP32. Pierdes la respiración y parte de la calidad de señal, pero el dashboard y el registrador se adaptan con pocos cambios y el armado es mucho más simple.
Personalización para Chile
En Chile consigues en MechatronicStore la placa y todos los componentes pasivos del montaje:
- ESP32 con Wifi y Bluetooth ESP WROOM-32 ESP32S, micro USB (SKU N-303): el cerebro del proyecto; lee el ADS1292R, maneja la TFT y sirve el dashboard por WiFi. Cumple la función del "ESP32 DevKit" del original; revisa que tu placa tenga libres los GPIO de las tablas de conexión.
- Resistencias 1/4W 22 Ω (SKU GK5-20): las 15 resistencias en serie del montaje.
- Resistencias 1/4W 1 kΩ (SKU GK3-17): la resistencia de 1 kΩ del esquemático.
- Resistencias 1/4W 10 kΩ (SKU GK2-15): las cinco de 10 kΩ.
- Capacitor electrolítico 10 µF 25 V (SKU GF2-7): desacoplo de la alimentación.
- Condensadores cerámicos 100 nF (SKU GF17V24): desacoplo cerca de cada módulo; clave para bajar el ruido en una señal de microvoltios.
- Fila de 40 pines pin header hembra 2,54 mm (SKU GD2-3): para montar los módulos y poder sacarlos después.
El módulo ADS1292R con su cable de electrodos y la pantalla ILI9488 de 4 pulgadas no están en el catálogo. Si quieres partir con algo disponible hoy, el sensor de ECG AD8232 sirve para la variante de entrada descrita arriba, aunque no mide respiración.
Recursos
- Tutorial original (inglés): IoT Based ECG & Respiration Monitor with ESP32 & ADS1292R, de How2Electronics. Esta guía está inspirada en él.
- Proyecto anterior del mismo autor (solo pantalla TFT): DIY ECG Monitor with ADS1292R, ESP32 & TFT Display
- Esquemático (PDF): descargar desde Google Drive
- Archivos Gerber de la PCB: descargar desde Google Drive
- Firmware completo: el enlace de descarga está en la sección "Source Code / Program" del tutorial original.
Versión chilena con componentes en stock local en MechatronicStore.













