Sistema de monitoreo de signos vitales en tiempo real. Un ESP32 lee temperatura corporal, frecuencia cardíaca y saturación de oxígeno (SpO₂) y los publica vía MQTT sobre TLS a un broker HiveMQ Cloud. Un dashboard Next.js suscripto al broker visualiza los datos en gráficas en vivo y los persiste en Firebase Firestore.
┌──────────────────────────────────────────────────────────────────────┐
│ HARDWARE (ESP32) │
│ │
│ ┌─────────────┐ I²C ┌──────────┐ │
│ │ MAX30102 │ ────────► │ │ WiFi + TLS (MQTTS :8883) │
│ │ HR / SpO₂ │ │ ESP32 │ ──────────────────────────► │
│ └─────────────┘ │ │ │
│ ┌─────────────┐ 1-Wire │ │ │
│ │ DS18B20 │ ────────► │ │ │
│ │ Temp │ └──────────┘ │
│ └─────────────┘ ▲ │
│ ┌─────────────┐ │ │
│ │ Botón │ GPIO 33 ──────┘ │
│ └─────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
│
MQTT over TLS (HiveMQ Cloud)
│
┌──────────────────┴──────────────────┐
│ Tópico: esp32/telemetry │
│ { bpm, spo2, temp, status } │
└──────────────────┬──────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────────┐
│ WEB DASHBOARD (Next.js) │
│ │
│ MQTT Client (WebSocket) ──► Estado React ──► ApexCharts (live) │
│ │ │
│ ▼ │
│ Firebase Firestore │
│ (persistencia histórica) │
└──────────────────────────────────────────────────────────────────────┘
- El ESP32 muestrea el MAX30102 en ventanas de 100 muestras a 400 Hz.
- Aplica el algoritmo de Maxim para calcular BPM y SpO₂.
- Filtra los resultados con un EMA (α = 0.30) y validación fisiológica.
- Cada 5 segundos (o al presionar el botón) publica el JSON al tópico
esp32/telemetry. - El dashboard recibe el mensaje vía MQTT-WS, actualiza las gráficas en tiempo real y guarda la lectura en Firestore.
- Al recargar la página, el dashboard pre-carga el historial desde Firestore.
ESP32 Arduino Day School/
├── esp32/ # Firmware Arduino para ESP32
│ ├── esp32.ino # Sketch principal
│ ├── secrets.h # Credenciales (ignorado por git)
│ └── README.md # Guía de hardware, pines y librerías
│
├── web/ # Dashboard Next.js
│ ├── src/
│ │ └── app/ # App Router de Next.js
│ ├── .env.example # Variables de entorno de ejemplo
│ └── README.md # Guía de instalación y configuración web
│
├── screenshots/ # Capturas del dashboard
│ ├── Dashboard.jpeg
│ └── History.jpeg
│
└── README.md # Este archivo
| Aspecto | Detalle |
|---|---|
| Lenguaje | C++ (Arduino framework) |
| Sensores | MAX30102 (HR/SpO₂ vía I²C), DS18B20 (temperatura vía 1-Wire) |
| Pin temperatura | GPIO 32 |
| Pin botón | GPIO 33 (INPUT_PULLUP) |
| I²C | GPIO 21 (SDA) / GPIO 22 (SCL) |
| Filtro | EMA α=0.30 + ventana deslizante 100 muestras |
| Protocolo IoT | MQTTS (TLS, puerto 8883) |
| Publicación | Cada 5 s o al presionar el botón |
📄 Ver esp32/README.md para la guía completa de pines, librerías y flasheo.
| Aspecto | Detalle |
|---|---|
| Framework | Next.js (App Router) |
| Runtime | Bun |
| Gráficas | ApexCharts (tiempo real) |
| Auth & BD | Firebase Authentication + Firestore |
| MQTT | HiveMQ Cloud vía WebSocket seguro (WSS :8884) |
| Lenguaje | TypeScript |
📄 Ver web/README.md para instalación, variables de entorno y configuración MQTT.
| Tópico | Dirección | Descripción |
|---|---|---|
esp32/telemetry |
ESP32 → Dashboard | Temperatura, BPM, SpO₂ y estado |
app/commands |
Dashboard → ESP32 | Comandos (ej. { "minutes": 5 }) |
# 1. Abre esp32/esp32.ino en Arduino IDE
# 2. Crea secrets.h con tus credenciales:
# WiFi SSID, WiFi Password, HiveMQ host/user/pass
# 3. Instala las librerías (OneWire, DallasTemperature, MAX30102, ArduinoJson, PubSubClient)
# 4. Selecciona tu placa ESP32 y sube el sketchcd web
cp .env.example .env.local # Edita con tus credenciales
bun install
bun dev # Abre http://localhost:3000- Cuenta en HiveMQ Cloud con un clúster activo
- Proyecto en Firebase con Firestore + Authentication habilitados
- Arduino IDE ≥ 2.x con soporte para ESP32
- Bun ≥ 1.0

