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

Reloj FC-209 – RECOPILACIÓN

Recopilación de todos los videos relacionados con el reloj LED (FC-209), explicando por encima lo que se puede encontrar en cada uno de ellos. Además se presenta la última actualización del firmware, tanto para el kit FC-209 como para el reloj de pared. También se crean ambas versiones de firmware con los textos en inglés.

RECOPILACIÓN

Construye un Reloj LED – EC1204B

Se describe el montaje del kit de reloj en una carcasa de plástico semitransparente, en la cual se alberga una batería de litio (recuperada de un PC), con el fin de alimentar el reloj de forma autónoma. Se empieza describiendo con el esquema y de forma básica el funcionamiento del reloj. Posteriormente se explica el funcionamiento del módulo ‘Step Up’, utilizado para elevar la tensión de la batería de litio y conseguir los 5V estabilizados que  alimentan el reloj. También se instala un módulo de carga TP4056 con protección, el cual se explicó con detalles entre el video Power Bank #1 y Linterna LED #2 – MEJORAS. Se mide el consumo del reloj, y se calcula la autonomía máxima de la batería, a partir de su capacidad. Finalmente se muestra la construcción de la serigrafía frontal, realizada con una CNC y se describe el funcionamiento y ajustes de este kit de reloj, utilizando el firmware con el que viene programado el reloj de fábrica.

Firmware para el Reloj LED: EC1204B

Se realiza un nuevo firmware para sustituirlo por el que viene instalado de fábrica, es la versión 1. Después de realizar un estudio de todo el hardware, se decide elevar la frecuencia del reloj de cuarzo, y sustituir el sensor de temperatura original DS18B20, por otro de mayor precisión. Al realizar estos cambios, la versión 1 del firmware no es compatible con el kit original, porque sería necesario sustituir estos dos componentes. Posteriormente se detalla a fondo el funcionamiento del chip DS1302, RTC o reloj en tiempo real, y se explica el proceso a seguir para reprogramar el micro-controlador utilizando el puerto ICSP (In-Circuit Serial Programming) que incorpora dicho kit. Finalmente se detallan todas las funciones y mejoras incorporadas en el nuevo firmware, explicando el modo de configuración y su funcionamiento.

Firmware Reloj LED #2 (Temperatura, Hora de Verano)

Se actualiza el firmware anterior, incorporando la posibilidad de que el reloj realice el cambio automático de la hora inverno/verano. Esta es la versión 2, y tampoco es compatible con el kit original. Se analiza a fondo el funcionamiento y comunicaciones entre el sensor de temperatura y el micro-controlador, comparando las diferencias que existen entre el sensor original DS18B20 y el instalado. Finalmente se calibra el sensor de temperatura mediante el menú de configuración y se detalla el proceso que sigue el reloj cuando tiene que actualizar la hora, estando apagado y encendido, comprobando también su funcionamiento.

Firmware Reloj LED #3 (Brillo nocturno)

Se actualiza de nuevo el firmware, incorporando la posibilidad de programar las horas en las que el display reduce su brillo. Con esto se evitan las molestias por exceso de iluminación, cuando se utiliza como despertador en una habitación oscura. Esta es la versión 3, y tampoco es compatible con el kit original. Se realizan de nuevo medidas de consumo del reloj, pero ahora con bajo brillo, y se calcula el incremento de la autonomía de su batería, debido a la reducción del consumo.

Firmware Reloj #4 (Compatible FC-209)

Debido a las numerosas peticiones que recibo, realizo un nuevo firmware totalmente compatible con el kit de reloj FC-209. Esta es la versión 4, y es la primera que se puede utilizar con el kit original. A pesar de que el sensor de temperatura original es menos preciso, con el DS18B20 se amplía el rango de medidas, pudiendo mostrar temperaturas entre -10 y 125ºC. Como existe la posibilidad de sustituir el chip de temperatura por otro externo con encapsulado metálico, es posible utilizar un sensor externo para medir la temperatura de componentes electrónicos o fluidos.

Cronómetro LED #5 (FC-209)

Se incorpora la posibilidad de utilizar el kit FC-209 como reloj o cronómetro. La opción de cronómetro se debe habilitar pulsando el botón central MODE, en la fase de arranque. En caso de no tocar nada, el módulo arrancará en modo reloj y tendrá las mismas funciones que tenía en la versión anterior, versión 4. Esta es la versión 5, y también es compatible con el kit FC-209. Una vez que se entra en el modo cronómetro, es posible configurar el modo del contador, pudiendo contar el tiempo hacia delante o hacia atrás. La resolución del cronómetro es de centésimas de segundos, mostrando este valor al final, en modo alterno cuando se detiene la cuenta.

Reloj LED de pared #1

Se muestra un nuevo diseño de reloj, utilizando las mismas características del kit FC-209, pero ampliando su tamaño para que pueda utilizarse como reloj de pared. Este firmware NO es compatible con el kit de reloj FC-209. Esta es la versión 6, exclusiva para este modelo de reloj, pero funciona exactamente igual que la versión 5 en el kit FC-209.

Al ampliar de tamaño el display, es mejor construir todo el frontal con diodos LED, en lugar de utilizar display’s de 7 segmentos. Con este aumento de tamaño se acentúa el efecto de parpadeo, provocado por la baja velocidad del procesador, por lo que se aumenta la frecuencia del cristal de cuarzo, igual que se hizo en  las 3 primeras versiones del firmware, pero en este caso se mantiene el mismo modelo de sensor de temperatura. Otra modificación, es el uso de una batería recargable en lugar de la pila de botón. En este firmware se habilita el control de carga de la batería tampón, a través del chip DS1302. Para poder alimentar más de dos diodos en serie, como es el caso, se necesita subir la tensión de alimentación por encima de 5V, por lo que también se necesita instalar un módulo Step-UP.

En el video se muestran los detalles de construcción del circuito impreso que se necesita, así como el ensamblado de los diodos led en el frontal y sus cableados. Finalmente se realizan las pruebas de funcionamiento.

Reloj LED de pared #2

Se construye la carcasa frontal del reloj de pared, y se monta un anclaje para poder colgarlo. También se muestra el grabado de la serigrafía y mecanizado del frontal, realizado todo con una CNC. Luego se pinta la serigrafía, y se muestra el reloj ya colgado y funcionando.

Termómetro digital para fluidos

Se utiliza un nuevo kit de reloj, para poder utilizarlo principalmente como medidor de temperatura de componentes electrónicos y fluidos. Se sustituye el chip de temperatura original, por otro externo del mismo modelo, pero encapsulado en acero inoxidable. También se realiza el mecanizado con la CNC, pero como en este caso se utilizará el kit con un  alimentador externo de 5V, su tamaño es bastante reducido y fácil de transportar. Finalmente se realiza el calibrado del sensor de temperatura, utilizando como referencia los 0ºC que tiene el hielo en fusión.

Firmware for LED Clock – ENGLISH

Debido a las múltiples peticiones que recibí de algunos seguidores no hispanos, hice una versión del último firmware del kit FC-209, pero traduciendo todos sus textos en inglés.

Última actualización del firmware del reloj LED

Se incorporan un par de sugerencias que he recibido en los últimos meses. La primera de ellas y la más solicitada, es la posibilidad de presentar la temperatura en modo alterno con la hora, y la otra es la opción de poder mostrar los CEROS de las decenas de hora en el display, es decir, que se encienda el cero de la izquierda de las horas entre las 0 y las 9 de la mañana. Ambas opciones serán configurables, de manera que se podrá elegir entre la presentación anterior o la nueva.

Existe una variante entre el firmware del kit de reloj FC-209 y el reloj de pared, aunque sus prestaciones son las mismas. De manera que hay dos modelos de firmware, uno para cada modelo.

·        Kit FC-209: J_RPM_v5B_EC1204B.HEX

·        Reloj de pared: J_RPM_v6B_EC1204B.HEX

Configuración del Reloj LED (v5B-v6B)
Configuración del Reloj LED (v5B-v6B)

 

También he creado dos versiones con los textos en inglés:

·        Kit FC-209:  J_RPM_v5eB_EC1204B.HEX

·        Reloj de pared: J_RPM_v6eB_EC1204B.HEX

Flow diagram (v5B-v6B)
Flow diagram (v5B-v6B)

Detalles de la presentación alterna

Cuando se active el modo de presentación alterno, la temperatura se mostrará de forma síncrona con el reloj, y lo hará cada 5 segundos. Entre el segundo 5 y el 55 de cada minuto, nunca se mostrará en el segundo ‘0’ de cada minuto, y lo hago así con el fin de mostrar siempre el cambio del minuto al paso por el segundo ‘0’ y no interrumpir la escucha de las señales horarias en caso de que estuvieran activadas. La temperatura sólo aparecerá durante un segundo de cada 5, en total 11 veces en cada minuto.

Por otra parte, como la lectura de la temperatura requiere de un tiempo y no es conveniente utilizar interrupciones cuando se está realizando la lectura, la presentación del display se detiene durante ese período de tiempo, siempre inferior a 1 segundo, pero provoca que la aparición de la temperatura en el display sea inferior a 1 segundo. Dependiendo de la velocidad del sensor de temperatura ese efecto podría pasar desapercibido, cosa que no sucede con el chip original que se incluye en el kit, ya que es demasiado lento. Me refiero al sensor de temperatura DS18B20 que se incluye en el kit de reloj.

Por ese motivo, con el fin de mejorar la visibilidad de la temperatura, la lectura sólo se realizará cada 10 segundos, de manera que entre dos presentaciones sucesivas, una de ellas siempre será instantánea y aparecerá durante 1 segundo completo. Dependiendo del segundo en el que se arranque el reloj, la lectura podría coincidir en los segundos acabados en ‘0’ o en ‘5’, ya que la primera vez que pase por alguno de ellos tendrá que leer el valor, pero al paso por el segundo ‘0’ se sincronizará y siempre leerá en los segundos acabados en ‘5’. Los segundos acabados en ‘0’ mostrarán la temperatura leída anteriormente, excepto en el segundo ‘0’ de cada minuto como ya he mencionado antes. Por otra parte, en el caso de que la temperatura sobrepase alguno de los dos umbrales de alarma, el aviso acústico se realizará sólo cuando el valor acaba de ser leído. Es decir, la alarma de temperatura sólo sonará en los segundos acabados en ‘5’

Cronómetro LED #5 (FC-209)

Utilizando los mismos componentes  del kit de reloj FC-209 (hardware), podemos convertir el reloj en un cronómetro de precisión… sólo tenemos que reprogramar el micro-controlador AT89S52. Si programamos en el cronómetro las funciones de cuenta hacia delante, cuenta atrás y auto-arranque, podríamos utilizar el cronómetro como marcador de tiempo en eventos deportivos.

Cronómetro de 24 segundos
Cronómetro de 24 segundos

Haciendo unas pequeñas modificaciones en el hardware, sería posible convertir este pequeño reloj en un marcador de gran tamaño, y utilizarlo en un recinto deportivo. Después de sopesar las posibles opciones, decidí incluir la funcionalidad del cronómetro dentro de la última versión del firmware (v4). De esta manera no será necesario sustituir el micro-controlador cuando queramos utilizar este kit de reloj (FC-209) como cronómetro. La versión 5 del firmware, se puede descargar de forma gratuita desde el siguiente enlace: J_RPM_v5_EC1204B.HEX

Como este reloj sólo dispone de dos pulsadores para realizar maniobras, ya que el tercer pulsador es el del Reset del micro-controlador, es necesario definir cuál será su modo de funcionamiento (Reloj/Cronómetro) en la fase de arranque, y mantenerlo fijo hasta un nuevo reinicio. Como la función principal es la de Reloj-Temperatura, definimos este modo como ‘arranque por defecto’. Es decir, si no tocamos ningún pulsador en la fase de conexión, funcionará como Reloj-Temperatura. Para cambiar de modo reloj a cronómetro, realizaremos los siguientes pasos:

  • Pulsaremos el botón ‘RESET’
  • Cuando aparezca el mensaje rotante, mantendremos pulsado el botón ‘MODE’
Configuración del Reloj LED (v5)
Configuración del Reloj LED (v5)

Una vez que que hayamos entrado en el modo ‘cronómetro’, ya podremos configurar sus parámetros de funcionamiento. Estos valores se guardarán en el chip de memoria del reloj (DS1302), y estos serán los nuevos valores de arranque del cronómetro. Al igual que sucede con los parámetros del reloj, tendremos que tener conectada la pila de ‘tampón’ en el chip, si no queremos perder todos los datos cuando falte la alimentación.

Capacidad real de una batería con ARDUINO

Medir la capacidad real de una batería con ARDUINO. Para que este sistema pueda funcionar de forma autónoma (sin PC), se utiliza el módulo ‘LCD Keypad Shield’ para mostrar la información en su display. Midiendo la capacidad real de una batería nueva, podremos saber la fiabilidad del fabricante y además calcular el tiempo de funcionamiento que tendrá cualquier dispositivo que utilicemos con dicha batería.

LCD Keypad Shield - Esquema
LCD Keypad Shield – Esquema

El módulo ‘LCD Keypad Shield’ está diseñado para poder insertarlo encima del módulo ARDUINO, sin la necesidad de realizar ninguna conexión adicional. Como podemos ver en el esquema anterior, este módulo LCD  transfiere las entradas/salidas de ARDUINO que no utiliza (incluso el conector ICSP y el pulsador RESET) hacia su circuito impreso, permitiendo la inserción de conectores para poder utilizar estas conexiones sin tener que soldar cables en el módulo ARDUINO. LCD Keypad Shield dispone de 6 pulsadores, el pulsador Reset y 5 más para realizar maniobras, así como un diodo Led para indicar cuando está alimentada la placa. Los 5 pulsadores de maniobras están conectados a una red de resistencias alimentadas con 5V, y la salida va conectada a la entrada analógica ‘0’ de ARDUINO. Dependiendo del pulsador que se accione, aparecerá una tensión diferente en esta entrada analógica. Si leemos el valor desde ARDUINO utilizando la sentencia: analogRead(0), obtendremos un valor diferente con cada pulsación. Añadiendo una simple rutina en el código, podremos detectar la posición de cualquier botón. En la imagen anterior se muestran los valores que he medido en mi ARDUINO -tus medidas pueden variar ligeramente-, así como la rutina que podrías utilizar para detectar la pulsación de los botones.

LCD Keypad Shield & ARDUINO
LCD Keypad Shield & ARDUINO

El módulo LCD utiliza su propia tabla de caracteres (ROM), pero también dispone de 8 caracteres programables (RAM). Los caracteres programables los podemos utilizar para generar cualquier carácter o símbolo que necesitemos mostrar en la pantalla y no se encuentre en la tabla de caracteres (ROM) del display. En la imagen anterior se muestran los detalles para programar estos caracteres, así como las sentencias que se deben utilizar con la librería: LiquidCrystal.h en ARDUINO.

Sistema de medida: Capacidad real de una batería
Sistema de medida: Capacidad real de una batería

Para medir la autonomía de la batería, vamos a utilizar ARDUINO como cronómetro de precisión. La conexión/desconexión del cronómetro se realiza de forma automática, utilizando una entrada digital como control. El sistema de detección del estado de la batería será el incluido dentro del módulo TP4056 (módulo de carga para 3,7V con protección). El módulo TP4056  además controlar la carga de la batería, mostrando su estado mediante dos indicadores LED, desconecta la batería de cualquier dispositivo que conectemos a su salida cuando la batería llega a umbral mínimo de tensión (<2,5V).  Entre la salida de tensión del módulo TP4056 y ARDUINO conectaremos un pequeño interface, consistente en un transistor NPN, 2 resistencias y un condensador (ver esquema). Para facilitar el cálculo y obtener precisión en la medida, utilizaremos una carga electrónica para conseguir que la corriente permanezca constante, independientemente de la tensión que tenga la batería.

El cronómetro incrementará el contador de tiempo, siempre que tengamos tensión a la salida del módulo TP5056. Cuando el cronómetro se detenga podremos calcular la capacidad real de la batería, convirtiendo el valor de tiempo medido en horas y multiplicándolo por la corriente que hayamos seleccionado en la carga (la corriente en amperios para Ah). Es importante destacar que al final del ciclo de descarga, cuando el cronómetro se detenga, la carga se desconectará de la batería… y esta empezará a recuperarse más rápido o despacio dependiendo de la carga que le hayamos desconectado. Al subir de nuevo la tensión de la batería, llegará un momento en el que se supere el umbral de reposición del módulo TP4056, se conectará de nuevo y el cronómetro seguirá incrementando el tiempo. Cuando esto suceda, se producirán ciclos intermitentes de cadencia cada vez más larga, y al final se detendrá por completo. Si queremos conocer la capacidad de la batería con bajo consumo, podemos esperar hasta el final. Pero si necesitamos comprobar la autonomía con el consumo que hemos seleccionado en la carga (porque es el consumo de nuestro dispositivo), tendremos que hacer el cálculo cuando se desconecte el cronómetro por primera vez.

En la siguiente imagen se muestran las medidas comparativas que he realizado con dos baterías de origen chino, rotuladas con una capacidad de 9800 mAh. Las dos baterías son nuevas y pertenecen al mismo lote. Las medidas las he realizado con una corriente constante de 500 mA, y el tiempo que se muestra es el de la primera desconexión. Al medir la capacidad de dos baterías iguales, nos aseguramos que la batería que hemos utilizado no está defectuosa (ambas medidas son parecidas). Al realizar dos medidas utilizando la misma batería, comprobamos la precisión del sistema de medida que estamos utilizando (valores casi idénticos).

Resumen de las medidas
Resumen de las medidas

En la última línea se muestra la capacidad que he medido en otra batería de tipo TR 14500, de una ‘supuesta’ capacidad de 1200 mAh.

Medidas con umbral de tensión ajustable

Si queremos medir la capacidad de otros tipos de batería, con tensiones diferentes, o simplemente necesitamos comprobar el tiempo de funcionamiento de cualquier batería hasta llegar a una tensión umbral determinada, podríamos montar el circuito que se muestra a continuación.

Sistema de medida opcional, con umbral de tensión ajustable
Sistema de medida opcional, con umbral de tensión ajustable

Como podemos ver, sólo tendremos que sustituir el módulo de carga TP4056 por el circuito de control que se muestra en la imagen. Mediante el potenciómetro de ajuste (22K), fijaremos el umbral mínimo de tensión a la que se debe desconectar de la carga electrónica,  y detener la cuenta del tiempo (cronómetro).

Descargar el código de ARDUINO : Crono_Battery