## Problema
Cada año, miles de personas desarrollan cáncer de piel por exposición solar acumulada.
El índice UV sube y baja sin que nadie lo note hasta que ya es tarde.
Los trabajadores al aire libre — construcción, agricultura, turismo — no tienen forma de saber en tiempo real cuándo deben refugiarse.
Las apps del clima dan promedios diarios, no alertas por minuto.
El resultado: quemaduras, envejecimiento prematuro y riesgo oncológico que se pudo evitar.
## Solución
Construí un sistema que mide el índice UV en tiempo real y te habla cuando necesitas protegerte.
Un sensor conectado a un microcontrolador ESP32 lee la radiación cada pocos segundos.
Los datos viajan por MQTT a un servidor central que los procesa al instante.
Cuando el índice supera un umbral peligroso, el sistema genera una recomendación personalizada usando inteligencia artificial y te la dice con voz sintética.
No necesitas mirar una pantalla. El sistema te avisa mientras trabajas.
La arquitectura productor-consumidor permite que el sensor, la interfaz gráfica y la voz corran en hilos separados sin bloquearse entre sí.
Si el sensor falla tres veces seguidas, el sistema se detiene solo y reporta el error.
## Tecnologías
Python como orquestador principal por su ecosistema de bibliotecas para IoT, IA y voz.
MQTT sobre HTTP porque el protocolo publish-subscribe consume menos ancho de banda y permite comunicación bidireccional en tiempo real con el ESP32.
OpenAI para generar recomendaciones contextuales — no es un if-else, es una recomendación adaptada al nivel exacto de radiación y al tiempo de exposición.
ElevenLabs para síntesis de voz natural, porque una alerta hablada se procesa más rápido que un texto en pantalla cuando estás concentrado en tu trabajo.
Tkinter para la interfaz gráfica local, sin depender de un navegador o conexión a internet.
## Resultado
El sistema entrega una recomendación de salud cada 5 lecturas de sensor, en menos de 2 segundos desde que se recibe el dato.
El margen de error en la detección de fallas es cero: si el sensor deja de enviar datos, el sistema lo detecta en 30 segundos y se apaga.
Cada sesión de monitoreo genera un registro histórico exportable en CSV para análisis posterior.
El costo de operación por hora es el de una conexión MQTT y una llamada a la API de OpenAI — menos de $0.01 USD.
No es un prototipo de laboratorio. Es un sistema que puede correr en una Raspberry Pi junto al trabajador, sin conexión a la nube, y salvarle la piel.
Elegí implementar una arquitectura productor-consumidor con colas de mensajes en memoria (queue.Queue) en lugar de usar un patrón basado en eventos o un bus de mensajes externo como Redis. Esto me permitió mantener el sistema liviano y sin dependencias adicionales para un proyecto de tesis donde la simplicidad de despliegue era prioritaria. La alternativa de Redis habría sido más escalable para múltiples instancias, pero para un solo nodo con ESP32 local, las colas en memoria ofrecen menor latencia y cero configuración de infraestructura.
Opté por MQTT como protocolo de comunicación entre el ESP32 y el servidor Python en vez de HTTP REST o WebSockets. MQTT es ideal para dispositivos IoT con recursos limitados porque tiene overhead mínimo, soporta calidad de servicio (QoS) y permite publicación-suscripción asíncrona. HTTP habría requerido polling constante desde el servidor o endpoints expuestos, lo cual es ineficiente para lecturas periódicas de sensores. Además, MQTT maneja naturalmente la desconexión del ESP32 con mensajes Last Will.
Decidí integrar OpenAI y Elevenlabs para generar recomendaciones de salud y síntesis de voz en tiempo real, en lugar de usar reglas predefinidas o un motor TTS offline. La generación de recomendaciones con IA permite adaptar el mensaje al contexto específico del usuario (nivel UV, tiempo de exposición), algo que reglas estáticas no logran con la misma riqueza. Para la voz, evalué pyttsx3, pero su calidad era inferior y no soportaba voces naturales; Elevenlabs ofrece voces más realistas que mejoran la experiencia del usuario final.
Implementé el manejo de errores con un contador de fallos consecutivos y un timeout en la cola de datos, en vez de reintentos infinitos o excepciones silenciosas. Esto evita que el sistema se quede colgado si el ESP32 deja de enviar datos o si la red falla. La alternativa de reintentar indefinidamente habría ocultado problemas operativos, mientras que lanzar excepciones sin control habría detenido todo el sistema. Con un límite de 3 errores consecutivos y un timeout de 30 segundos, el sistema se detiene de forma controlada y registra la falla para diagnóstico.