ESP_NTP_Weather (v1.14) & Timestamp UNIX

Actualización del firmware de la miniestación meteorológica, añadiendo la previsión del tiempo y salida/puesta del sol. El firmware puede compilarse tanto para ESP8266 como para ESP32 utilizando el IDE de Arduino. Incluye autodetección de librerías y configuración automática según el microcontrolador. Explicación del tiempo UNIX, Epoch y timestamp. Funcionamiento del protocolo NTP y problema del año 2038 (Y2038).

Estación Meteorológica NTP con ESP: reloj sincronizado por NTP y estado del tiempo local

Origen de los servidores horarios y el tiempo UNIX

En los sistemas informáticos y de telecomunicaciones, mantener la coherencia temporal entre dispositivos distribuidos geográficamente es esencial. Desde los años 60, con la expansión de redes y sistemas electrónicos interconectados, surgió la necesidad de una referencia temporal común y precisa.

Para resolver este problema se estableció el Tiempo Universal Coordinado (UTC) y se creó el concepto de epoch UNIX, una referencia absoluta desde la cual se mide el tiempo en segundos.

El epoch UNIX comienza el 1 de enero de 1970 a las 00:00:00 UTC. Desde ese momento, el tiempo se mide como el número de segundos transcurridos, conocido como timestamp UNIX.

Por ejemplo:

1700000000 (timestamp UNIX) → 14/11/2023 06:13:20 UTC

Este formato simplifica el cálculo de diferencias horarias, conversiones y sincronizaciones entre sistemas. Es utilizado por la mayoría de los sistemas operativos modernos, bases de datos y servidores.

El NTP (Network Time Protocol) fue desarrollado en 1985 por David Lennox Mills. Es un protocolo que permite sincronizar los relojes de los dispositivos conectados a Internet con una precisión de milisegundos, consultando servidores jerárquicos (llamados stratum). Los servidores NTP de alto nivel (stratum 1) están directamente conectados a relojes atómicos o señales GPS.

Un esquema simplificado del funcionamiento de NTP sería:

Los microcontroladores (ESP32, ESP8266) utilizan esta infraestructura para sincronizar su hora local mediante bibliotecas que interpretan y corrigen el timestamp UNIX recibido.

La conversión entre UTC y hora local depende del desplazamiento horario y de la aplicación de horario de verano. El desplazamiento se expresa en segundos (por ejemplo, +3600 segundos para UTC+1).

localTime = utcTime + timezoneShift;

Problema del año 2038 (Y2038)

El problema del año 2038 (Y2038) es un fallo de desbordamiento de la representación de tiempo en sistemas que almacenan la marca temporal (timestamp) como un entero con signo de 32 bits que cuenta los segundos desde el 1 de enero de 1970 00:00:00 UTC (tiempo Unix). Este entero alcanzará su valor máximo el 19 de enero de 2038 a las 03:14:07 UTC. Un segundo después, el valor se desbordará y provocará comportamientos erróneos en sistemas que no gestionen correctamente el desbordamiento.

Causa del problema

El tipo de dato ‘time_t’ se utiliza ampliamente en sistemas Unix y en lenguajes como C y C++ para representar tiempos. En arquitecturas de 32 bits, ‘time_t’ se implementa como un entero con signo de 32 bits, cuyo rango es de -2.147.483.648 a 2.147.483.647. Este último valor corresponde exactamente al 19 de enero de 2038 a las 03:14:07 UTC. Al sumarse un segundo más, el valor se desborda y se convierte en negativo, lo que produce fechas incorrectas (por ejemplo, en 1901) o fallos del sistema.

Escenarios de fallo típicos

  1. Logging: marcas de tiempo incorrectas en los registros.
  2. Expiración de credenciales o tokens errónea.
  3. Jobs programados que fallan o se ejecutan en el pasado.
  4. Bases de datos con índices temporales incorrectos.
  5. Dispositivos embebidos en bucles de reinicio por errores de tiempo.

ESP_NTP_Weather (v1.14)

En esta actualización se ha priorizado el mantener la compatibilidad con el ES8266, teniendo que realizar algunos procesos mucho más elaborados de los que se requieren con el ESP32. Aunque el ESP32 puede manejar JSON completos con facilidad, el objetivo del proyecto era mantener compatibilidad total con ESP8266.

El ESP8266 tiene una memoria RAM reducida (≈40 KB disponibles), lo que impedía almacenar la respuesta JSON completa del forecast, que supera fácilmente los 15–25 KB.

Problemas detectados:

  • Fragmentación del buffer al intentar usar ArduinoJson.
  • Reinicios por Watchdog al manipular cadenas grandes.
  • Pérdida de datos cuando el parsing se hacía de forma secuencial.

Solución:

La solución que adopté al final fue realizar la lectura por streaming, procesando el JSON “en bruto” mediante búsqueda de fragmentos relevantes con indexOf() y extracción manual. Con este método se redujo en gran medida el uso de memoria, pero a cambio este método requiere una lógica mucho más precisa y sensible a errores. Utilicé un sistema de ventanas dinámicas, relocalizando la búsqueda y “recortando” el buffer cuando superaba cierto tamaño, manteniendo solo la región útil y sincronizando la búsqueda, usando el campo dt_txt como “ancla”.

Utilizando ‘OpenWeatherMap’


Descargar el firmware

Puedes descargar de forma gratuita el firmware, accediendo al siguiente enlace: ESP_WeatherClock_NTP

¿Dónde fabricar el PCB?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos, pero no en todas podemos conseguir pequeñas tiradas a buen precio. Por suerte, ahora disponemos de Internet y es mucho más fácil que antes. Podemos buscar empresas en cualquier parte del mundo, y es más fácil encontrar un fabricante que haga nuestros prototipos (PCB) a buen precio. Una de las empresas más grandes del sector es PCBWay.

Logo: PCBWay

https://pcbway.com/g/r7N1ct

Estación Meteorológica NTP con ESP: reloj sincronizado por NTP y estado del tiempo local

Este proyecto presenta una miniestación meteorológica con reloj NTP integrado, basada en el módulo ESP01 y un display OLED de 0,96 pulgadas. El kit, disponible a bajo coste en plataformas como AliExpress, permite mostrar la hora exacta sincronizada por Internet y datos meteorológicos actualizados en tiempo real.

Sin embargo, el firmware original del kit presenta varias limitaciones: deriva horaria si se está lejos de China, falta de cambio automático de horario estacional, servidor meteorológico fijo en China y una interfaz web muy limitada. Para solucionar estos problemas, decidí desarrollar un nuevo firmware completamente mejorado, compatible con ESP01, ESP8266 y ESP32, capaz de conectarse a cualquier servidor NTP y a servicios meteorológicos globales como OpenWeatherMap.

⚙️ Montaje del kit

El kit consta de tres placas principales:

  1. PCB base, donde se sueldan los componentes SMD (regulador de tensión y 2 condensadores de desacoplo) y tres conectores.

  2. Display OLED, que requiere la soldadura de su conector de 4 pines.

  3. Módulo ESP01, completamente ensamblado y programado.

La alimentación se realiza mediante un conector micro-USB, utilizando únicamente los pines de tensión. El kit incluye además tornillería, caja protectora y el cable USB.

Sincronización NTP y funcionamiento básico

Al encender el dispositivo, este se conecta automáticamente a la red WiFi configurada y sincroniza la hora con un servidor NTP.


El display muestra la fecha y hora local exactas, junto con una previsión meteorológica de tres días.

Limitaciones del firmware original

  • El firmware original no realiza cambio automático entre horario de verano e invierno y solo permite configurar manualmente una zona horaria.
  • Además, depende de servidores chinos, lo que genera retardo al sincronizar la hora y datos meteorológicos inexactos fuera de Asia.
  • Su interfaz web apenas permite ajustar la hora y la ubicación, sin acceso remoto ni visualización de datos.

Nuevo firmware mejorado

El nuevo firmware permite:

  • Sincronización con cualquier servidor NTP.

  • Ajuste automático de horario estacional.

  • Conexión con OpenWeatherMap para obtener datos meteorológicos globales.

  • Acceso completo a la estación desde la red local mediante una interfaz web avanzada.

  • Compatibilidad con pantallas OLED de 0,96” (128×64) y 0,6” (64×48).

De esta forma, el kit se convierte en una estación meteorológica completa, fiable y adaptable a cualquier necesidad.

Configuración del firmware original

El video explica detalladamente cómo configurar el firmware original mediante la conexión WiFi del kit y la web qweather.com, donde deben generarse las credenciales y API keys necesarias.


Este proceso resulta complejo y limitado, motivo por el cual decidí desarrollar el nuevo firmware.

Configuración del nuevo firmware

La nueva versión del firmware simplifica todo el proceso:

  • La estación se conecta automáticamente a la red WiFi configurada.

  • Se accede al servidor web local para seleccionar zona horaria, API key y ciudad.

  • El firmware se sincroniza automáticamente con OpenWeatherMap para mostrar datos de temperatura, humedad, presión, viento y estado del cielo.

Compilación y programación

El firmware puede compilarse tanto para ESP8266 como para ESP32 utilizando el IDE de Arduino.
Incluye autodetección de librerías y configuración automática según el microcontrolador.
Solo es necesario definir la resolución del display en la librería Adafruit SSD1306.h.

Para programar el ESP01, se recomienda emplear su programador USB específico o un adaptador FTDI, asegurando el modo “programación” conectando GPIO0 a GND antes de alimentar el módulo.

Conclusiones

Con este nuevo firmware, el pequeño kit meteorológico se transforma en una estación completa, precisa y personalizable, capaz de funcionar con distintos módulos ESP y pantallas OLED.
El proyecto mantiene un bajo consumo y una gran flexibilidad, ideal para quienes buscan un reloj-estación meteorológica sincronizado por Internet.

Descargar el firmware

Puedes descargar de forma gratuita el firmware, accediendo al siguiente enlace: ESP_WeatherClock_NTP

¿Dónde fabricar el PCB?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos, pero no en todas podemos conseguir pequeñas tiradas a buen precio. Por suerte, ahora disponemos de Internet y es mucho más fácil que antes. Podemos buscar empresas en cualquier parte del mundo, y es más fácil encontrar un fabricante que haga nuestros prototipos (PCB) a buen precio. Una de las empresas más grandes del sector es PCBWay.

Logo: PCBWay

https://pcbway.com/g/r7N1ct

Excedente Solar para ACS

En muchas viviendas unifamiliares equipadas con paneles solares fotovoltaicos, el sistema de calefacción y producción de agua caliente sanitaria (ACS) aún depende de una caldera de gasoil. Esta combinación ha sido habitual durante años, pero el contexto energético está cambiando rápidamente, especialmente con la evolución de los precios de la electricidad y del gasóleo, así como de las condiciones de compensación por los excedentes solares vertidos a la red.

Recientemente, algunas comercializadoras han reducido el precio de compensación por dichos excedentes —pasando, por ejemplo en mi caso, de 0,11 €/kWh a tan solo 0,07 €/kWh—, lo cual impacta directamente en la rentabilidad de inyectar energía sobrante a la red. En este nuevo escenario, aprovechar esa energía solar excedente dentro de la propia vivienda cobra mucho más sentido, tanto desde el punto de vista económico como energético.

Una de las formas más eficaces de autoconsumo es utilizar esa electricidad solar para alimentar un termo eléctrico que produzca agua caliente sanitaria. Esta opción no solo permite almacenar energía en forma de calor, sino que además puede reducir notablemente la dependencia del gasoil, cuyos costes por litro se mantienen elevados.

Calentar 100 litros de agua desde 20 °C hasta 55 °C

A continuación os muestro los cálculos comparativos que hice, analizando el coste real de calentar 100 litros de agua, primero con gasoil y luego con electricidad, utilizando los precios que actualmente estoy pagando por el gasoil y la energía eléctrica.

Con estos cálculos podremos evaluar si resulta más conveniente utilizar solo la caldera de gasoil para el ACS o, por el contrario, aprovechar al máximo la energía solar excedente para alimentar un termo eléctrico de 100 litros de agua, precalentando así la entrada de agua fría de la caldera y reducir el consumo de gasoil.

Calor necesario (calorías)

Lo primero es calcular las calorías necesarias, para incrementar los 35ºC que hay entre los 20 y 55º, en un depósito de 100 litros de agua. El resultado es de 3500 kcal.

Q = mcΔT

  • Q = energía en kilocalorías (kcal)
  • m = masa del agua en kg (100 litros de agua ≈ 100 kg)
  • c = calor específico del agua = 1 kcal/kg°C
  • ΔT = diferencia de temperatura = 55 °C – 20 °C = 35 °C

Q = 100 x 1 x 35 = 3500 kcal

Energía aportada por el Gasoil C

Teniendo en cuenta que el poder calorífico el Gasoil C es de aproximadamente 10.000 kcal por Kg y su densidad es de 0,84, cada litro de Gasoil quemado aportará 8.400 kcal.

El poder calorífico del Gasoil C es aproximadamente:

  • 10 kcal por gramo, o
  • 10.000 kcal por kg
  • Su densidad es de aproximadamente 0,84 kg/l

Cada litro de Gasoil aporta:

10.000 kcal/kg 0,84 kg/l  = 8.400 kcal/l

 

 Litros necesarios de Gasoil

Dividimos las 3500 kcal que necesitamos para calentar los 100 litros de agua entre las 8400 kcal por litro de Gasoil, y como resultado obtenemos 0,4179 litros.

Litros de Gasoil = Q/energía por litro = 3500/8400 ≈ 0,4179 litros

Se necesitan aproximadamente 0,42 litros de gasoil C para calentar 100 litros de agua desde 20 °C hasta 55 °C, suponiendo un rendimiento del 100%. En general, el rendimiento de las calderas a Gasoil está entre el 86 y 94 por ciento.

Con un rendimiento del 90%:

0,42/ 0,9 ≈ 0,47 litros

Con un 90% de eficiencia, se necesitarían aproximadamente 0,47 litros de Gasoil C.

  • Precio por litro de Gasoil (con IVA): 1,065 €/litro

Coste Gasoil C = 0,47 × 1,065 = 0,50055 €

 

Energía eléctrica en kWh con un termo eléctrico

Q = 100 x 1 x 35 = 3500 kcal

Para calcular el coste que supondría calentar los 100 litros de agua con un termo eléctrico, convertimos la energía necesaria de kcal a kilovatios-hora (kWh), y nos da 4,07 kWh.

1 kcal = 1,162 × 10−3 kWh

3500 kcal × 0,001162 kWh/kcal ≈ 4,07 kWh

Un termo eléctrico suele tener una eficiencia alta, cercana al 100% (entre 95% y 100%), porque casi toda la electricidad se convierte en calor dentro del agua. Si consideramos, por ejemplo, un 95% de eficiencia:

4,07 / 0,95 ≈ 4,28 kWh

Coste electricidad

Si calculamos el coste que esto supondría, partiendo del precio actual por el que estoy pagando la electricidad, el importe total con IVA sería de 0,71295€

  • Precio base sin IVA: 0,137666 €/kWh
  • Con IVA (21%):

0,137666 × 1,21 = 0,16658 €/kWh

  • Consumo estimado (con 95% de eficiencia): 4,28 kWh

Costo electricidad = 4,28 × 0.16658 = 0,71295 €

Comparativa 

Costo Gasoil: 0,50055 €

Costo Electricidad: 0,71295 €

Calentar 100 litros de agua con electricidad te costaría ~0.71 €, mientras que con gasoil C sería ~0.50 €, una diferencia de ~30% más barato con gasoil C.

Así el gasto eléctrico sería un 30% mayor, en comparación con el gasoil. Por lo que en ningún caso me compensaría sustituir la caldera de gasoil por un termo eléctrico.

Sin embargo, si utilizo el termo eléctrico para precalentar el agua fría que le entra a la caldera, utilizando únicamente la energía excedente que aportan los paneles solares el resultado cambia.

Precio utilizando la energía excedente solar

Calculando el precio que me paga la compañía comercializadora por los kWh, actualmente 7 céntimos por kWh, el costo en electricidad sería de 0,2996€

Con la electricidad a 0,07 €/kWh (IVA incluido) y el gasoil al mismo precio que antes: 1,065 €/litro (IVA incluido)

Costo gasoil = 0,47 × 1,065 = 0,50055 €

Costo electricidad = 4,28 × 0,07 = 0,2996 €

Esto supondría un ahorro de un 40% sobre el gasoil.

Conclusión

Con electricidad a 0,07 €/kWh (IVA incluido), calentar el agua cuesta casi un 40% menos que con gasoil C.

Los datos analizados reflejan con claridad que, en un contexto donde el precio de compensación de los excedentes solares ha bajado y el precio del gasoil se mantiene elevado, instalar un termo eléctrico para la producción de ACS representa una opción más eficiente y económica.

Mientras que calentar 100 litros de agua con gasoil (a 1,065 €/litro) cuesta aproximadamente 0,50 €, el mismo volumen puede calentarse con energía eléctrica a un coste de solo 0,30 € cuando se dispone de electricidad a 0,07 €/kWh (precio típico en instalaciones con autoconsumo y excedentes). Este ahorro directo se suma al beneficio añadido de reducir el consumo de combustibles fósiles, con su impacto ambiental y logístico asociado.

Si calculamos ahora el umbral en el que ambos precios se igualan,  los excedentes de energía solar debería suponer 0,11695 €/kWh. Como este precio ya no se consigue, siempre compensa instalar un termo eléctrico, como apoyo a la caldera de gasoil.

Además, utilizar la electricidad generada en la propia instalación solar para cubrir necesidades térmicas incrementa significativamente el grado de autoconsumo y autosuficiencia energética, aprovechando al máximo los recursos disponibles antes de verter el excedente a la red por un precio reducido.

En resumen, la integración de un termo eléctrico como apoyo o sustituto parcial de la caldera de gasoil para el ACS se consolida como una inversión lógica, sostenible y rentable, especialmente en viviendas con producción fotovoltaica y baja remuneración por excedentes.

Material necesario

Para incorporar un termo eléctrico en la instalación del agua sanitaria, con el único fin de precalentar el agua fría de entrada a una caldera de gasoil y reducir costes, es necesario utilizar un termo eléctrico básico. Es decir, un depósito de almacenamiento de agua con su resistencia calefactora,  controlado mediante un termostato mecánico, y sin electrónica de control.

Esto es muy importante, porque el encendido y apagado del termo eléctrico lo haremos a través de un controlador de tensión de red externo. El controlador de red sólo suministrará tensión eléctrica cuando tengamos una potencia solar excedente, suficiente para conectar el termo sin consumir energía proveniente de la compañía.

Esquema del interruptor de red inteligente

Para controlar el encendido del termo eléctrico, he utilizado el interruptor de red que monté hace unos meses, adaptando el segundo umbral de control de potencia al consumo del termo eléctrico que he instalado.

Energía SOLAR, aprovechando los excedentes

Como el termo eléctrico que he montado es de 1500W, he modificado el segundo umbral de encendido del controlador, para que conecte la alimentación sólo cuando exista una potencia excedente superior a 1700W, en lugar de los 2200W que tenía antes.

Fijación del Termo

El termo eléctrico incluye 2 escarpias de acero con su taco metálico de expansión, pero sólo son válidas para colocarlas en un muro de carga macizo. Como la pared que tengo es un tabique muy fino,  hecho con rasillas de tan solo 4,5 cms de  espesor, he tenido que construir dos soportes de acero a partir de 2 escuadras.

Para repartir toda la carga en una superficie mayor, cada soporte va fijado a la pared con 3 tornillos de acero. Además, los tacos atraviesan la pared y los huecos del ladrillo los he rellenado con un adhesivo bicomponente de Epoxi -Sikadur 31-, es como un taco químico. También he utilizado este adhesivo para pegar los soportes a la pared, fijar los tornillos al soporte y reforzar el otro extremo de la pared, antes de repararla y pintar.

Llenado y Purgado del Termo

Este es el proceso que he seguido para llenar el termo de agua:

  • Con la llave de ByPass abierta y las dos de corte cerradas, conecté el latiguillo de entrada del agua fría con la válvula de alivio del termo.
  • El latiguillo del agua caliente lo conecté con la salida del termo, pero el otro extremo lo dejé apuntando hacia un cubo, para evitar que se derramara el agua por el suelo.

  • Después hay que abrir la llave de corte del agua fría, hasta que se llene el termo. Por el latiguillo de salida del agua caliente del termo se irá purgando todo el aire. Cuando empiece a salir agua por el latiguillo, se cierra la llave de corte del agua fría y se rosca ligeramente el latiguillo en la rosca del tubo de cobre, pero sin apretar.

  • Colocando el cubo debajo del latiguillo del agua caliente, se abren ligeramente las dos llaves de corte, la del agua fría y caliente, para acabar de purgar el aire de los tubos. Cuando empiece a salir agua, ya se puede apretar la rosca del manguito del agua caliente.
  • Y para terminar, se abren por completo las dos llaves de corte, se cierra la llave del ByPass y se comprueba que no haya fugas de agua. Después de esto, ya se puede conectar el termo a la red eléctrica.

¿Dónde fabricar el PCB?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos, pero no en todas podemos conseguir pequeñas tiradas a buen precio. Por suerte, ahora disponemos de Internet y es mucho más fácil que antes. Podemos buscar empresas en cualquier parte del mundo, y es más fácil encontrar un fabricante que haga nuestros prototipos (PCB) a buen precio. Una de las empresas más grandes del sector es PCBWay.

Logo: PCBWay

https://pcbway.com/g/r7N1ct

 

ESP32: Reloj / Cronómetro

Construcción de un Reloj/Cronómeto de precisión, controlado con un módulo ESP32. Este cronómetro dispone de un pulsador, permitiendo su manejo en modo local y también a distancia. Para el control remoto se puede utilizar cualquier teléfono móvil o PC, que esté conectado a la misma red local que el módulo ESP32.

Hasta ahora, todos los relojes que he construido con el ESP32 necesitaban un acceso a Internet vía Wi-Fi para funcionar. En este caso, cuando el reloj funcione en modo cronómetro no será imprescindible disponer del acceso Wi-Fi. A través de su pulsador se pueden controlar todas las funciones del cronómetro,  y lo único que se perdería sin el acceso a Wi-Fi es el control remoto.

Reloj Pac-Man con ESP32 & UTF-8

Crono_ESP32.ino

Al principio del fichero Crono_ESP32.ino están los comentarios, indicando algunos link de compra de los módulos y descarga de librerías

hw_timer_t >>> Es la variable del ‘timer’ que se utiliza para crear las interrupciones de 100 mSeg del cronómetro

has_expired >>> Es la variable booleana que gestionará el ‘void loop’ para incrementar con precisión los 100mSeg. del cronómetro cuando esté en marcha.

Mode_CRONO >>> Es la variable booleana necesaria para gestionar si está funcionando como reloj o cronómetro.

pinPulsa >>> Define el pin GPIO donde está conectado el pulsador del cronómetro.

WifiManager.h >>> Es la librería necesaria para configurar le red WiFi a la que irá conectado el módulo ESP32.

Void IRAM_ATTR >>> Es la rutina de la interrupción, que se ejecutará siguiendo con precisión un intervalo de tiempo. Cada 100mSeg. se pondrá en alto la variable booleana: has_expired

void setup()

Se inicializa el puerto serie y se carga la configuración del reloj, almacenada en la memoria EEPROM del módulo ESP32.

Se configura el LED azul del módulo ESP32 como salida, para indicar de forma visual los incrementos y estado del cronómetro. También se configura el pin al que va conectado el pulsador como entrada en modo Pull-Up.

timer = timerBegin(0, 80, true) >>> Como el cristal de cuarzo del ESP32 es de 80 MHz, dividimos entre 80 para tener como referencia 1MHz, para que el Timer 0 se desborde cada microsegundo.

timerAttachInterrupt(timer, &timerInterrupcion, true) >>> Aquí activamos la interrupción del timer, y hacemos la llamada a la rutina: void IRAM_ATTR timerInterrupcion() 

timerAlarmWrite(timer, 100000, true) >>> Aquí activamos el disparo del timer cada 100.000 uSeg. = cada décima de segundo se producirá la ejecución de la rutina: void IRAM_ATTR timerInterrupcion() 

timerAlarmEnable(timer) >>> Se habilita la alarma del timer.

Librerías personalizadas

En la misma carpeta del proyecto se incluyen dos librerías, personalizadas para este Reloj/Cronómetro:

fonts_es.h >>> Contiene las dos fuentes de caracteres que utiliza el reloj, incluyendo los caracteres especiales que se utilizan en español, como son las letras acentuadas, Ç y Ñ; tanto en minúsculas como en mayúsculas .

max7219.h >>> Contiene las rutinas necesarias para mostrar y animar los caracteres en las 4 matrices LED, gestionadas en serie con sus respectivos circuitos integrados MAX7219.  Es importante indicar en esta librería la posición en las que van montadas las matrices LED sobre el circuito impreso… en este caso van rotadas 90º.

https://github.com/J-RPM/ESP32_Crono/

ESQUEMA

En el esquema se muestran con las conexiones que tenemos que hacer entre el módulo ESP32 y el PCB que contiene las 4 matrices LED. Son las mismas conexiones que tenía el anterior firmware del reloj, lo único nuevo son los dos hilos de conexión del pulsador con el módulo ESP32.

Caja 3D

Para hacer la carcasa del Reloj/Cronómetro utilicé el mismo diseño 3D que hice para el reloj, sin diseñar el tamaño y posición del agujero del pulsador. Así es posible mecanizar la caja a gusto de cada uno, para utilizar cualquier modelo de pulsador, eligiendo su posición… o mecanizar un paso de cable en la caja para colocar un pulsador en el exterior.

Caja 3D, para el PCB de 8 dígitos LED de 7 segmentos

https://www.thingiverse.com/thing:4655690

¿Necesitas fabricar un circuito impreso?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos (PCB), pero no en todas podemos conseguir pequeñas tiradas a buen precio. Por suerte, ahora disponemos de Internet y es mucho más fácil que antes. Podemos buscar empresas en cualquier parte del mundo, y es más fácil encontrar un fabricante que haga nuestros prototipos (PCB) a buen precio. Una de las empresas más grandes del sector es PCBWay.

 https://www.pcbway.es/

Logo: PCBWay

ESP32 con EleksTubeHAX

Actualización del reloj «RGB Glow Tube DIY Clock» (EleksTube IPS) con el firmware: EleksTubeHAX. Con este firmware, el reloj sincroniza automáticamente la hora a través de un servidor NTP. También consulta por Internet su localización, para ajustar de forma automática la hora local, actualizando el offset horario de invierno y verano. Además incluye el protocolo MQTT, y es posible controlar el reloj de forma remota desde un PC o dispositivo móvil con acceso a Internet. Este reloj, con el firmware original, se puede comprar en PCBWay por menos de 50€ … https://pcbway.com/s/8SNBE7

Reloj de estilo retro, con ESP32

Puntos separadores HH:MM:SS

Una de las cosas que se echa de menos en este reloj, es que no muestra los puntos separadores de las horas, minutos y segundos. Hice varias pruebas para intercalar los puntos, pero todas ellas de forma pasiva, utilizando como fuente de luz la iluminación RGB trasera de los 6 tubos.

La idea era montar algo sencillo, y que se pudiese desmontar sin tocar nada del interior.  Hice dos soportes con PLA de color negro, de la altura de los zócalos sobre los que se encajan los tubos de cristal. Los dos soportes los fijé al cristal con cinta adhesiva de doble cara, en la parte trasera de los tubos. Una pieza va pegada entre los tubos de las unidades de hora y la decena de los minutos, y la otra entre los tubos que muestran las unidades de minutos y la decena de segundos.

Luego me faltaba decidir cómo iba a hacer la pieza que mostrase los dos puntos. Empecé las pruebas con metacrilato transparente y plástico blanco, cortando con la CNC unas placas que reflejaran la luz trasera de los LED RGB, pintando los dos puntos de color negro. En ambos casos, el aspecto del reloj quedaba muy feo.

Al final utilicé PTEG de color blanco para hacer los dos puntos con la impresora 3D. Los hice alargados con forma de cono, y luego pinté con rotulador indeleble de color negro el soporte y el frente de los conos. Así la luz trasera de los tubos iluminan los laterales blancos de los conos, y visto el reloj de frente destacan mucho más los puntos negros.

EleksTube IPS con los puntos separadores

Piezas 3D

https://www.thingiverse.com/thing:6242912

Diseño 3D, con los puntos separadores para el reloj EleksTube

¿Actualizar el firmware?

En la revisión que hice del reloj con el firmware de fábrica, me di cuenta que la gestión de sus pulsadores era muy confusa, y además se le podría sacar más rendimiento al ESP32 que utiliza como procesador.

Buscando en el repositorio GitHub, encontré dos versiones de firmware muy elaboradas, que podrían ser compatibles con este reloj. Revisando el código de ambas versiones, comprobé que ha colaborado mucha gente en este desarrollo, pero la actualización final proviene del mismo autor: Aljaz Ogrin.

Cambios con respecto al firmware original

– La configuración con los pulsadores es extremadamente sencilla, porque la hora se ajusta automáticamente por Internet y los 4 pulsadores siempre realizan los cambios al presionar el botón, no al soltarlo. Es necesario pulsar y soltar por producir un cambio.

Configuración mediante los pulsadores, con el firmware: EleksTubeHAX

– El reloj sincroniza la hora a través de un servidor NTP, pudiendo conectar con cualquier router WiFi que disponga de la opción WPS. El reloj detecta respuestas del servidor NTP erróneas, y no se actualiza con una hora errónea. La versión 0.3 de firmware permite también escribir el SSID y PASSWORD de la red WiFi dentro del firmware. La versión 0.7 sólo permite la conexión WPS, pero esta opción es la más segura, porque las credenciales de la red WiFi no son visibles al leer el archivo binario (firmware). Otra ventaja de la conexión WPS, es que permite cambiar la red WiFi sin tener que modificar el firmware.

– El reloj detecta su ubicación a través de Internet, para seleccionar de forma automática su zona horaria y mostrar la hora local, corrigiendo automáticamente el Offset horario de invierno y verano.

– Las imágenes con los números de la hora son archivos BMP de 24 bit. Estos archivos se comprimen y convierten a binario desde una aplicación hecha a medida del firmware. Este formato permite  reducir el tamaño de los archivos, porque el firmware del reloj se encargará de centrar las imágenes pequeñas. Así es posible cargar y gestionar más de 3 fuentes de caracteres desde el reloj.

– El nuevo firmware hace una precarga de la siguiente imagen a mostrar en el búfer, para hacer una actualización más rápida. El tiempo del cambio de imagen se ha reducido de los 150 ms originales a aproximadamente 30 ms. Como el reloj refresca los dígitos de forma secuencial desde la unidad de segundos hasta la decena de horas, el segundo que provoca un cambio en la decena de horas presenta un efecto barrido de los números desde la derecha hacia la izquierda de (150×6) 900ms, y ahora se reduce a (30×6) 180 ms. Cuando se realiza un cambio de estilo, las imágenes guardadas en el búfer ya ni sirven y se borran. En este caso, el tiempo de carga de los 6 dígitos es el mismo que antes.

– Incorpora el modo nocturno, configurable antes de compilar el firmware, para atenuar el brillo de las pantallas y la luz de fondo de forma automática durante las horas nocturnas.

– Se incorpora la compatibilidad con MQTT (IoT): Desde un teléfono móvil se pueden cambiar las fuentes del reloj  y controlar el encendido/apagado del reloj. El protocolo MQTT es compatible con: SmartNest, SmartThings, Google Assistant, Alexa, etc… y también puede incluirse en la red de automatización del hogar.

– Los errores de conexión WiFi y MQTT se muestran con un texto de color rojo, insertado en la parte inferior de los dígitos de los segundos. Al apagar el reloj desde el pulsador se mantiene todo funcionando, sólo se apagan los displays y la iluminación RGB, manteniendo la conexión WiFi y la gestión remota a través del protocolo MQTT.

– El firmware cuenta de forma automática el número de estilos de reloj que tiene cargados, y no es necesario volver a programar el reloj cuando se actualizan las imágenes.

– La versión v0.7 puede configurarse para funcionar con  el reloj «EleksTube IPS» original y el reloj «SI HAI» (imitación china). La versión v0.3 incluye también el reloj «NovelLife SE» (otra imitación). El cambio que existe entre los diferentes fabricantes de este reloj, es la asignación de los pines de ESP32.


Esto es lo que se pierde con respecto a la versión del firmware original:

  • No permite mostrar el mes y día, siempre se muestra la hora.
  • No se puede elegir un color diferente para cada LED RGB y tampoco modificar la velocidad de cambio de sus efectos.
  • El efecto ‘Chasing’ de los LED RGB no existe, pero a cambio se  incluyen 2 efectos nuevos y un modo Test.
  • No dispone de la opción de mostrar 6 imágenes fijas.

Programar con el IDE Arduino

Antes de modificar el firmware del reloj, es muy importante disponer de  un archivo de respaldo por si algo falla. En el artículo y video anterior mostraba los detalles de todo el proceso, lo único que tendría que añadir, es que lugar de hacerlo a 115200 bps lo hagáis a 921.600 bps. El ESP32 funciona perfectamente a esa velocidad, y así el tiempo que tardará será inferior a 1 minuto.

He hecho un resumen para simplificar todo el proceso de configuración que hay que hacer en el IDE de Arduino, para que funcione con el ESP32 y sea compatible con el firmware: EleksTubeHAX.

Lo he probado con las versiones de Arduino (v1.8.12) y (v1.8.13)… es posible que con otras versiones se produzcan errores al compilar el programa 

1 –  El primer paso sería cargar las librerías del ESP32 en el IDE de Arduino. En la pestaña: Archivo/Preferencias, habría que desplegar el Gestor de URLs para comprobar si ya tenemos o no el link que apunta a las librerías de espressif:

https://dl.espressif.com/dl/package_esp32_index.json

Si no estaba en la lista, habría que añadir la URL y guardar los cambios

2 – Acceder al Gestor de tarjetas desde el menú: Herramientas/Placa/. Cuando finalice la carga de datos, escribir en la línea superior ‘esp32’. Buscar: esp32 by Espressif Systems. Aunque ya tengáis esta librería instalada, es importante actualizar a la versión 1.0.6. Yo tenía instalada la última versión, la 2.0.11,  y me costó mucho tiempo encontrar el problema. Al compilar aparecían errores en algunas instrucciones del WiFi y también en la librería TFT_eSPI.

3 – Para que sea posible cargar las imágenes en el reloj desde el IDE de Arduino, es necesario incluir el archivo: esp32fs.jar dentro de la carpeta ‘tool’ de la instalación. A continuación os pongo el link de descarga de la versión 1.1, porque la versión 1.0 no funciona.

Link de descarga de la versión 1.1

Detalles del lugar donde hay que copiar el archivo

Después de copiar el archivo y reiniciar el IDE de Arduino, tendría que aparecer la opción: ESP32 Sketch Data Upload. Si la versión del archivo es la correcta, al hacer click aparecerá otra ventana con un desplegable que muestra 4 opciones.

Las imágenes del reloj son los  archivos binarios que se encuentran en la carpeta ‘data’ del programa EleksTubeHEX. Para cargar estos archivos en el reloj, habría que seleccionar la opción: SPIFFS.

Las imágenes del reloj contienen los diferentes estilos de  las fuentes numéricas que se utilizan para mostrar la hora. Estas imágenes se pueden actualizar cuando se quiera, y no es necesario volver a cargar el firmware.

4 – Lo siguiente sería instalar las 7 librerías que se muestran en la gráfica enmarcados en rojo, seleccionando el nombre y comprobando que sea el mismo autor. Las versiones que se utilizaron en el desarrollo son las que están entre paréntesis, pero yo he actualizado todas a la versión más alta y no he tenido problemas.

5-  Ya por último, tendríamos que seleccionar la placa: ESP32 Dev Module y configurar todos los parámetros que se muestran en la gráfica enmarcados en rojo. El puerto ‘Com’ habría que seleccionar al que estuviera conectado vuestro reloj. Se puede comprobar si el reloj responde,  al hacer click en la opción: Obtén información de la placa

Librería: TFT_eSPI

Después de instalar todas las librerías, habría que modificar dos archivos que se encuentran dentro de la carpeta TFT_eSPI, y siempre que se actualice la librería TFT_eSPI habría que hacer lo mismo.

Son los archivos:  User_Setup_Select.h y User_Setup.h, y se pueden editar  con cualquier editor de texto que no introduzca formatos, por ejemplo con el Notepad de Windows.

En ambos archivos, User_Setup_Select.h y User_Setup.h,  hay que añadir la misma línea. Para que se incluya la librería GLOBAL_DEFINES.h que se encuentra dentro de la misma carpeta del programa EleksTubeHAX.

Además de esto, en el archivo User_Setup_Select.h se deja todo como está, pero al final del archivo hay que comentar la definición de todos los pines.

En el archivo User_Setup.h, hay que añadir la misma línea que en el otro archivo y mantener #define USER_SETUP_INFO «User_Setup». El resto del archivo hasta el final, tiene que estar todo comentado.

… ver más detalles en el video del final

SPIFFS (Serial Peripheral Interface Flash Fail System)

SPIFFS es un sistema de archivos muy simple, creado para microcontroladores con memoria flash.  Se accede mediante el bus SPI y los datos se guardan directamente en la estructura de la memoria. SPIFFS permite acceder a la memoria flash del ESP32, pudiendo leer, escribir y eliminar datos.

MQTT

MQTT (Message Queing Telemetry Transport) es un protocolo de mensajería simple, diseñado para dispositivos con poca memoria y con bajo ancho de banda. Permite enviar comandos para controlar salidas digitales, o leer y escribir datos en dispositivos electrónicos con tecnología IoT (Internet de las cosas).

MQTT fue creado por el Dr. Andy Stanford-Clark de IBM y Arlen Nipper de Arcom (ahora Eurotech) en 1999 como un mecanismo para conectar dispositivos empleados en la industria petrolera.

Gestión de los mensajes MQTT

En los mensajes MQTT hay 3 apartados separados por una barra, como si se tratara del Path de acceso a cualquier archivo del PC. A este conjunto Path, en MQTT se denomina Topic, o Tema en español. A continuación del Topic se enviaría la orden a ejecutar, denominado Mensaje en MQTT. Por ejemplo, un mensaje MQTT podría ser:

MiCasa/Cocina/Lavadora/Encender

Para que funcione el sistema MQTT es necesario un gestor que reciba y distribuya los mensajes, en MQTT sería el Broker.

Broker es el dispositivo central que permite y restringe las conexiones; y también recibe, filtra, redirige y publica mensajes a todos los dispositivos conectados. Los clientes inician una conexión TCP/IP con el Broker, el cual mantiene un registro de los clientes conectados. Esta conexión se mantiene abierta hasta que el cliente la finaliza. Por defecto, MQTT emplea el puerto 1883 y el 8883 cuando funciona sobre TLS.

Si se está enviando un mensaje a un Broker de Internet, la primera parte del tema/topic debe ser el ID del dispositivo que está enviando el mensaje, y el usuario puede personalizar las siguientes partes del tema. Cuando se da de alta algún dispositivo IoT en Smartnest, se le asigna un ID único para evitar conflictos entre dispositivos que pudieran tener el mismo Topic. En este nuevo firmware del reloj, el Broker es un servidor alojado en la Web de Smartnest.

El Broker de Smartnest define los Topic y Mensajes en lugar del usuario, con el fin de generar un interface gráfico común para todos los clientes, y dar acceso a través de Internet. Por ese motivo es necesario elegir el Tema que mejor se adapte a las necesidades de cada dispositivo. Por ejemplo, este reloj utiliza el Topic de un termostato.

Conversión de los grados recibidos por MQTT, al estilo de gráficos a mostrar

La temperatura de ajuste del termostato se puede modificar entre 10 y 40 grados, con saltos de 0,5º. Estos valores son interpretados por el reloj para seleccionar el estilo del gráfico a mostrar. Para hacer esto el firmware aplica internamente una fórmula al mensaje MQTT, dividiendo el valor recibido entre 5, sin decimales y restando 1. Si recibe un valor entre 10 y 14,5 grados, selecciona el estilo 1 (los saltos son de 5 en 5 grados). Si se fija la temperatura del termostato al máximo, 40 grados, el reloj mostraría el estilo 7. El reloj permite almacenar un máximo de 16 estilos. En caso de recibir un número mayor al número de estilos que tiene en memoria, seleccionaría el último. En caso de recibir un valor de temperatura igual o mayor de 90º, elegiría de forma aleatoria uno de los estilos de su memoria.

Para utilizar el Broker de Smartnest es necesario registrarse en www.smartnest.cz, pero es gratis para los primeros 5 dispositivos.

Cofiguración con el Broker Smartnest

Para habilitar la conexión MQTT en el reloj, es necesario personalizar los datos del archivo de configuración del reloj. En la versión v0.3 es el archivo USER_DEFINES.h  y en la versión v0.7 es el archivo GLOBAL_DEFINES.h.

Yo he cargado la última versión (v0.7), porque se han corregido algunos errores y además se incluye la gestión del sensor de temperatura DS18B20, aunque yo no lo voy a usar. Para que el reloj envíe la temperatura real por MQTT, habría que conectar el sensor a un pin del ESP32, y luego habilitarlo en el archivo de configuración.

Estos son los datos MQTT que hay modificar en el archivo de configuración:

  • Descomentar la línea: #define MQTT_ENABLED
  • Luego copiaremos ID del dispositivo que hemos dado de alta en Smartnest, el termostato, y lo pegaremos entre comillas a continuación de: #define MQTT_CLIENT
  • El nombre de usuario con el que nos hemos dado de alta, lo escribiremos entre comillas al final de:  #define MQTT_USERNAME
  • La contraseña con el que nos hemos dado de alta en Smartnest, la escribiremos entre comillas a continuación de: #define MQTT_PASSWORD. En lugar de escribir la contraseña en el firmware, es mejor poner el API-Key que asigna Smartnest a cada usuario.

COntrol remoto desde Smartnest

Con estos datos ya se recibiría la información que envía el reloj en la Web de Smartnest. Pero si queremos también enviar órdenes al reloj, tendremos que configurar el router WiFi  al que se conecta el reloj.

  • Lo primero es asociar la MAC del reloj con una IP fija, para que el router le asigne siempre la misma.
  • Luego habría que abrir el puerto TCP 1883, y asociarlo con la dirección IP que le hayamos asignado al reloj.

Configuración final

Para terminar de configurar el reloj, abrimos el archivo de configuración: GLOBAL_DEFINES.h para la versión 0.7.

  • Dejamos comentado el modelo de reloj HAI_CLOCK, para compilar con los datos de EleksTube.
  • Las horas de inicio y fin en la que el reloj cambiará a modo nocturno, se pueden modificar a nuestro gusto. También los segundos para detectar la pérdida de conexión con Internet y su reconexión.
  • No hace falta registrarse para disponer de un acceso a la geolocalización, accedemos a este link:

https://app.abstractapi.com/api/ip-geolocation/tester

Allí vemos nuestro código de consulta, y debajo una  URL para comprobar la información que devuelve. Podemos hacer hasta 5000 peticiones al mes con el mismo código si pagar.  Copiamos nuestro código de acceso, y lo pegamos entre las comillas a continuación de: #define GEOLOCATION_API_KEY

Ahora solo queda guardar los cambios del archivo: GLOBAL_DEFINES.h, y ya podemos compilar el programa en el IDE de Arduino y actualizar su firmware… pero recuerda que también hay que cargar las imágenes, para que el reloj pueda mostrar la hora.

Cargar las imágenes al reloj

Además de actualizar el firmware, es necesario cargar las 10 imágenes de cada estilo. El nuevo firmware necesita un archivo binario (.clk) por cada imagen.

Todos los archivos tienen que estar en la carpeta ‘data’ de ‘EleksTubeHAX’ …\Arduino\EleksTubeHAX\data

  • Los archivos se identifican con 2 dígitos y su extenxión .clk
  • La unidad del número del archivo se corresponde con la imágen que contiene, y la decena es el número de estilo. Los estilos del reloj van en orden ascendente, empezando por el estilo 1 (10.clk , 11.clk, 12.clk, etc.). No se puede crear el estilo 3 y enviar, si la carpeta ‘data’ no contiene también los estilos 1 y 2.
  • El número de estilos máximos a cargar depende del tamaño de los archivos. La capacidad máxima disponible para almacenar las imágenes en el reloj es 2,2MB aproximadamente.
  • Los archivos binarios se generan con un software hecho a medida para este firmware, y ya no se puede utilizar el software: EleksTube IPS.exe para actualizar las imágenes. En la descarga de archivos del repositorio GitHub, se incluye el software conversor de imágenes BMP a CLK:

…\Prepare_images\Convert_BMP_to_CLK.exe

Convert_BMP_to_CLK.exe

La cabecera de los archivos binarios que genera este conversor de imágenes, es de 6 Bytes: Las letras ASCII ‘CK ‘ los pixeles de ancho de la imagen, su origen X, los pixeles de alto y su posición Y.

Antes de colocar cada imagen en su display, el firmware lee sus cabeceras, y aplicando las fórmulas que se muestran en la imagen siguiente, desplaza el inicio donde tiene que empezar a cargar los datos del archivo, para centrar la imagen en el display.

Paso 1, para el centrado de imágenes del reloj EleksTube

De esta forma todos los bordes de la imagen que sean de color negro, se pueden recortar del archivo BMP,  antes de cargarlos en el software para convertirlos a código binario.

Paso 2, para el centrado de imágenes del reloj EleksTube

Al reducir el tamaño de las imágenes, es posible almacenar fuentes más pequeñas en la memoria del ESP32, y ampliar el número de estilos a elegir.

Conversor de imágenes BMP a CLK

Con el firmware de fábrica, el archivo binario que se carga en el reloj contiene las 30 imágenes de los 3 estilos, y tiene un tamaño de 1.507.328 Bytes. Si hacemos las cuentas, el mapa de color de las imágenes que se muestran en el reloj, es de 12 bits.

Ahora las imágenes BMP de 24 bit se comprimen a 16 bits. Por lo tanto, con la actualización del firmware también se mejora en la calidad de las imágenes.

En la siguiente imagen, he simulando el degradado de tonos azules que podríamos ver en el cielo al atardecer.

Comparativa del color RGB

De izquierda a derecha, se puede comparar la calidad con la que se mostraría en los displays del reloj.

  • La imagen original BMP de 24 bits, sin comprimir
  • Comprimida a 16 bits, como se mostraría con esta actualización
  • Comprimida a 12 bits, como se mostraría con el software de fábrica

Convertir imágenes BMP a CLK

En la siguiente imagen se muestra la carpeta de trabajo, para convertir las imágenes BMP en archivos CLK.

Archivos BMP y convertidos a binario, del estilo 3 del reloj

  • Crea una carpeta de trabajo, para utilizarla con el software: Convert_BMP_to_CLK.exe
  • Copia en la carpeta de trabajo las 10 imágenes BMP de 135×240 pixel y 24 bits, del estilo que quieras convertir a binario. Renombra los archivos poniendo como nombre el número de estilo (decena), y el valor numérico que contiene la imagen (unidad). En el ejemplo serían los 10 números del estilo 3.
  • Si los bordes de las imágenes no son negros, como es el caso del ejemplo, las imágenes no se pueden recortar. En el caso contrario puedes recortar los bordes negros, teniendo en cuenta que el contenido de la imagen resultante se centrará sobre la pantalla negra del reloj.
  • Abre los 10 archivos BMP de uno en uno con el software conversor, y conviértelos a binario.
  • Copia o mueve los 10 archivos .clk a la carpeta ‘data’ del firmware: EleksTubeHAX.

…\Arduino\EleksTubeHAX\data

¿Dónde fabricar el PCB?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos, pero no en todas podemos conseguir pequeñas tiradas a buen precio. Por suerte, ahora disponemos de Internet y es mucho más fácil que antes. Podemos buscar empresas en cualquier parte del mundo, y es más fácil encontrar un fabricante que haga nuestros prototipos (PCB) a buen precio. Una de las empresas más grandes del sector es PCBWay.

Logo: PCBWay

Concurso de creadores 2023

El plazo para presentar los proyectos finaliza el 15 de Enero de 2024

PCBWay abre de nuevo la participación al concurso de creadores. Por el simple hecho de participar, se asignarán 500 beans (créditos) en tu cuenta de PCBWay, los cuales podrás canjear en la tienda por un Raspberry Pi Pico.

Además del premio por la participación, PCBWay repartirá un total de 16 premios: 1 primer premio al mejor proyecto, 2 segundos premios, 3 premios para los clasificados como terceros y 10 premios más para los proyectos más populares.

Consulta todos los detalles y las bases del concurso, pulsando el siguiente link:

Acceso al concurso de creadores PCBWay