Reloj Pac-Man con ESP32 & UTF-8

Actualización del firmware (v1.44) para el Reloj-Texto construido con 4 matrices LED, y controlado con el microprocesador ESP32. Con esta actualización, el display podrá mostrar los caracteres latinos de uso más frecuente: áéíóúü ÁÉÍÓÚÜ cÇ ñÑ. También se incluyen los avisos con voz sintetizada, y efectos gráficos Pac-Man.

Reloj-Texto con dos alarmas y 2 husos horarios

UNICODE & UTF-8

La conexión entre diferentes redes de ordenadores provocó la necesidad de crear un estándar que contemplara el juego de caracteres gráficos de cualquier lengua, incluyendo ideogramas, caracteres árabes, chinos, etc.

Caracteres UNICODE

El año 1991 se anunció públicamente la creación de Internet, y ese mismo año el Consorcio Unicode y la ISO desarrollaron ambos un estándar para codificar los caracteres:  Unicode – ISO / IEC 10646. Ambos estándares se pueden considerar equivalentes, si tenemos en cuenta que el repertorio, los nombres de caracteres y los puntos de código del estándar ‘Unicode Versión 2.0’, coinciden exactamente con los de ISO / IEC 10646-1: que fue publicado en 1993.

Actualmente, la codificación dominante es UTF-8, que es una codificación de ancho variable diseñada para la compatibilidad con versiones anteriores de ASCII, y para evitar las complicaciones con las marcas de orden de bytes que existen con UTF-16 y UTF-32 . Además, el 93% de todas las páginas web están codificadas en UTF-8 y el Grupo de trabajo de ingeniería de Internet (IETF) requiere que todos los protocolos de Internet identifiquen las codificación UTF-8. También el Consorcio de correo de Internet (IMC), recomienda que todos los programas de correo electrónico puedan mostrar y crear correo utilizando UTF-8.

Codificación UTF-8

Los primeros 127 caracteres de cualquier tabla de caracteres de procedencia anglosajona o latina, son comunes y su origen es la tabla de caracteres ASCII. Este conjunto de caracteres se pueden codificar dentro de una matriz binaria de 7 bit., y son los caracteres que por defecto muestra cualquier display.

Caracteres ASCII de 7 bits

Si queremos mostrar los caracteres específicos de cualquier lengua, por ejemplo las letras acentuadas, tendremos que ampliar de tamaño la matriz del display que almacena los caracteres en memoria, y asociar una posición específica a cada uno de los caracteres dentro de esa matriz.  De esta forma, la tabla de caracteres que almacena el display no se corresponderá con el código del carácter que recibamos a través del interface Web. Así el procesador del display tendrá que comprobar el código del carácter que recibe, y si es superior al 127,  reposicionar el código para apuntar al gráfico que tenemos asociado a ese código entrante, dentro de la matriz gráfica del display. El tamaño de la matriz gráfica del display suele ser de 8 bit, y con esto es posible almacenar 127 caracteres extra, que podrían ser letras acentuadas, logotipos o cualquier dibujo.

Integración UTF-8 en el display

Si pretendemos que los caracteres de este reloj se puedan programar a través de un interface Web, es necesario utilizar una codificación de caracteres estándar, y la más versátil es la codificación UTF-8 de 2 Bytes.

Este reloj utiliza 3 tipos de fuentes gráficas, dos de ellas limitadas a los 10 números, utilizadas para mostrar los dígitos de la hora en formato estrecho y ancho, y la otra es la que almacena los caracteres ASCII, desde el espacio cuyo código es 32 en decimal, hasta el 126 que es la tilde de la letra eñe, más conocida como virgulilla ~. A continuación, y a partir del código 127, es donde se almacenan los caracteres extra.

Hay muchas formas de almacenar las fuentes gráficas en un display, pero la forma más eficiente es asociar un Byte a los 8 pixeles que tiene cada columna de la matriz LED. Así es más rápida la gestión que tiene que hacer el procesador para desplazar los textos por el display.

La fuente de textos y gráficos de este display es de ancho variable, entre 2 y 5 pixel de ancho por 8 pixel de altura. Así se limita el ancho a las letras que no lo necesiten, por ejemplo el espacio, y se pueden mostrar más caracteres en el display.  Para localizar los caracteres en la matriz, todos ellos ocupan 6 Bytes. El primer Byte indica el ancho del carácter, que se corresponde al número de Bytes que tiene que leer el procesador para formar la letra en el display.

Para facilitar la interpretación visual de los gráficos, los 5 Bytes de cada carácter se suelen escribir en formato binario, pero también se podría escribir en formato hexadecimal o decimal si se quisiera reducir el tamaño del archivo en el editor.

En el gráfico siguiente. vemos el esquema de codificación de caracteres UNICODE, junto con UTF-16 y UTF-8.

Cuando se asigna un código a un carácter, se dice que dicho carácter está codificado. El espacio para códigos tiene 1.114.112 posiciones posibles (0x10FFFF). En el grafico anterior vemos el espacio de códigos dividido en tramos, con el fin de mostrar los diferentes esquemas de codificación UTF. Los puntos de código se representan utilizando notación hexadecimal agregando el prefijo U+.

Actualmente los sistemas operativos limitan la tabla UNICODE a los primeros 65.536 caracteres (0xFFFF), y el valor hexadecimal se muestra añadiendo ceros a la izquierda si es necesario, hasta completar los 4 dígitos hexadecimales.

Es conveniente aclarar, que los sistemas operativos disponen de diferentes tablas de caracteres, algunas de ellas son privadas, y no se deberían utilizar en un documento público con acceso a Internet, ya que no son un estándar.

Internamente en un PC se podría crear un documento utilizando cualquier fuente de caracteres, con el fin de mostrar algún gráfico en especial. El problema es si ese mismo documento se abriese utilizando una fuente de caracteres diferente; porque algunos caracteres ya no serían los mismos.

Si queremos codificar caracteres en UTF-8, limitando su longitud máxima a dos Bytes por carácter, sólo podremos codificar los primeros 2.048 caracteres UNICODE, y recibiremos caracteres de 11 bits. Así cuando recibamos un Byte en UTF-8 que comience con 110, sabremos que se trata de un carácter doble, y los 5 bits siguientes de ese Byte serán los 5 bits más significativos del carácter UNICODE que estamos recibiendo, sin olvidar que este carácter  tiene una longitud de 11 bits. A continuación recibiremos el segundo Byte, el cuál empezará con los bits 10, y a continuación recibiremos los 6 bits menos significativos del carácter UNICODE.

Decodificación UTF-8

  1. Cuando el bit más significativo de un Byte en UNICODE comience con un 0, la longitud del código UTF-8 no cambia, manteniendo el mismo valor UNICODE, y respetando así su compatibilidad con la tabla ASCII.
  2. Si se recibe un Byte en UTF-8 que empieza con los bits 110, su longitud será de 2 Bytes, y el segundo Byte empezará siempre por 10.
  3. Si se recibe un Byte en UTF-8 que empieza con los bits 1110, su longitud será de 3 Bytes, y los dos Bytes siguientes al primero empezarán con 10.
  4. Si se recibe un Byte en UTF-8 que empieza con los bits 11110, su longitud será de 4 Bytes y los 3 Bytes siguientes al primero empezarán con 10.

Esquema de montaje

Para que este display Reloj-Texto funcione, sólo hay conectar 5 hilos entre un lateral del display LED y el módulo ESP32. El sonido de la alarma y el audio sintetizado sale por el pin GPIO26 del módulo ESP32, y hay que conectarlo a un amplificador de audio con su altavoz.

Firmware (v1.44)

El archivo que necesitas para programar el ESP32, lo puedes descargar de forma gratuita desde el repositorio GitHubClock-Text_ESP32

Interface Web y ajustes

Este reloj se controla a través de cualquier dispositivo móvil, siempre que esté conectado a la misma red WiFi. El reloj dispone de 2 interfaces Web diferentes, pudiendo elegir su modo de funcionamiento. El reloj funciona de forma muy parecida en ambos modos, presentando la hora de acuerdo al formato que se haya configurado, y cada 30 segundos mostrando un rotación de texto.

  • Cuando el display está configurado en modo RELOJ: el texto será el día de la semana y la fecha; pero sólo en caso de que estuviese habilitada su presentación, porque en caso contrario el reloj siempre mostrará la hora.

Interface RELOJ: se puede modificar el huso horario al cuál se debe sincronizar el reloj, realizar los ajustes de formato y presentación de la hora, y modificar el brillo del display.

  • Cuando el display está funcionando  en modo MENSAJE: cada 30 segundos intercalará una rotación del texto que tenga programado.

Interface MENSAJE: se puede ajustar la velocidad de desplazamiento del texto, modificar el contenido del mensaje, y fijar la hora y repeticiones de sus dos alarmas.

Ambos interfaces disponen de un botón para cambiar su modo de funcionamiento, teniendo en cuenta que el reloj primero se reiniciará, sincronizando de nuevo la fecha y hora con el servidor NTP que le corresponda al uso horario ajustado. Al reiniciar el reloj, el punto de acceso WiFi al que se conecta,  podría asignar una dirección IP diferente a la anterior. También se han incorporado dos botones nuevos, uno para mostrar la hora con voz, muy interesante para personas invidentes, y el otro para forzar el borrado del display en cualquier momento, mediante la aparición de Pac-Man.

Con esta nueva versión (v1.44), es posible escribir textos utilizando letras acentuadas y la letra Ñ, tanto en mayúsculas como en minúsculas. Además, si el reloj está configurado con el huso horario de España y el formato de presentación de la hora es el Europeo, los textos del día de la semana y fecha, aparecerán traducidos al Español.

¿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.

PCB de prototipo gratis y con plazo de entrega rápido: https://www.pcbway.es/

Logo: PCBWay

 

 

 

En hora con DCF77

Desde hace años, los sistemas de sincronización horaria han ido evolucionando. No hace mucho tiempo, todos los relojes de uso doméstico había que ponerlos en hora de forma manual cada cierto tiempo. Cada vez que se hacía un cambio oficial de la hora, teníamos que ajustar de forma manual la hora del PC, el reloj de todos electrodomésticos,  los equipos de audio y grabación de video, el reloj del automóvil, etc. Actualmente con Internet, esto ha cambiado mucho. Todos los equipos que disponen de una conexión a Internet, tienen la posibilidad de mantener con gran precisión la información de fecha y hora, y ajustar los cambios de hora de forma automática. Sin embargo, desde hace muchos años existen sistemas de sincronización horaria, incluso anteriores a la aparición del GPS. Uno de los sistemas más utilizados en Europa, es el DCF77.

¿Qué es DCF77?

DCF77 es una estación de radio situada en Alemania, que transmite en onda larga (LW). Comenzó a funcionar como una estación de frecuencia estándar el 1 de enero de 1959, y a partir de junio de 1973 se incorporó en la transmisión la información de la fecha y la hora.

Cobertura DCF77

El transmisor DCF77 está controlado por Physikalisch-Technische Bundesanstalt (PTB), el laboratorio nacional de física de Alemania, y transmite en funcionamiento continuo (24 horas).

Transmisor DCF77

El transmisor es operado por Media Broadcast GmbH (anteriormente una subsidiaria de Deutsche Telekom AG ), en nombre del laboratorio nacional de física PTB.

Physikalisch-Technische Bundesanstalt (PTB)

La frecuencia portadora de la señal DCF77 es de 77,5 kHz (aproximadamente 3.868,3 m. de longitud de onda) y se genera a partir de relojes atómicos locales que están vinculados con los relojes maestros alemanes en el el laboratorio nacional de física de Alemania en Braunschweig. La señal horaria del DCF77 se utiliza para la difusión del tiempo legal nacional en Alemania.

Reloj atómico CS2

La transmisión DCF77 marca segundos al reducir la potencia de la portadora durante un intervalo que comienza cada segundo. La duración de la reducción se varía para transmitir un bit de código por segundo, codificando toda la información de fecha y hora a lo largo de cada minuto.

Modulación de amplitud

La señal DCF77 utiliza la codificación de cambio de amplitud para transmitir información de tiempo, codificada digitalmente al reducir la amplitud de la portadora hasta un 15% de lo normal (−16,5 dB) durante 0,1 o 0,2 segundos al comienzo de cada segundo. Una reducción de 0,1 segundos indica un 0 binario; y una reducción de 0,2 segundos indica un 1 binario. Como un caso especial, el último segundo de cada minuto se marca sin reducción de la potencia portadora. La portadora DCF77 está sincronizada de modo que el cruce por cero ascendente se produce al inicio de cada segundo. Todos los cambios de modulación también ocurren al aumentar los cruces por cero.

Modulación en amplitud DCF77

Hasta el año 2006 también hubo una identificación de la estación con el código Morse, que se enviaba durante los minutos 19, 39 y 59 de cada hora. Finalmente se suspendió, ya que la estación es fácilmente identificable por su señal característica. Se generaba un tono de 250 Hz mediante la onda cuadrada que modula la portadora entre el 100% y el 85% de potencia, y el distintivo de llamada era «DCF77«.

Modulación de fase

Además de la modulación en amplitud, durante 792,78 mSeg. y a partir de 200 mSeg., cada bit de código de tiempo se transmite utilizando un espectro ensanchado de secuencia directa. El bit se mezcla con una secuencia de chips pseudoaleatorios de 512 bits, y se codifica en la portadora utilizando el cambio de fase de ±13°. La secuencia de chips contiene cantidades iguales de cada fase, por lo que la fase promedio permanece sin cambios. Cada chip abarca 120 ciclos de la portadora, por lo que la duración exacta es de los ciclos 15.500 a 76.940 de 77.500. Los últimos 560 ciclos (7,22 mSeg) de cada segundo no están modulados en fase.

Modulación en amplitud y fase del transmisor DCF77

Dentro de la modulación de fase, el bit 59 se transmite como un bit 0 ordinario, y los primeros 10 bits (segundos 0–9) se transmiten como 1 binario.

Cuando se compara con la modulación de amplitud, la modulación de fase hace un mejor uso del espectro de frecuencia disponible y da como resultado una distribución de tiempo de baja frecuencia más precisa con menos sensibilidad a las interferencias. Sin embargo, muchos receptores DCF77 no utilizan la modulación de fase. La razón de esto es la disponibilidad mundial de las señales (referencia horaria precisa) transmitidas por los sistemas de navegación global por satélite como el Sistema de Posicionamiento Global (GPS) y GLONASS .

Interpretación del código de tiempo

El tiempo se representa en decimal codificado en binario. Representa el tiempo civil, incluidos los ajustes de horario de verano. El tiempo transmitido es el correspondiente al minuto siguiente. Por ejemplo, a las 23:59 del próximo 31 de Diciembre de 2019, se transmitiría la información de las 00:00 del 1 de Enero de 2020.

Codificador DCF77

La modulación de fase generalmente codifica los mismos datos que la modulación de amplitud, pero difiere para los bits 59 a 14, inclusive. El bit 59 (sin modulación de amplitud) se modula en fase como un bit 0. Los bits 0–9 se modulan en fase como 1 bits, y los bits 10–14 se modulan en fase como 0 bits. La información de protección civil y la información meteorológica no se incluye en los datos modulados en fase.

Dos indicadores advierten que los cambios ocurrirán al final de la hora actual: un cambio de zonas horarias y una inserción de segundo intercalar (esta operación se realiza para ajustar los relojes con el calendario solar). Estas indicaciones están presentes durante toda la hora anterior al evento. Esto incluye el último minuto antes del evento, durante el cual los otros bits del código de tiempo (incluidos los bits indicadores del huso horario) codifican la hora del primer minuto después del evento. Los bits de zona horaria pueden considerarse una representación codificada en binario del desplazamiento UTC . El conjunto Z1 indica UTC+2 , mientras que Z2 indica UTC+1. En el caso de un segundo intercalar, se inserta un bit 0 durante el segundo 59, y el bit faltante especial se transmite durante el segundo salto, segundo 60.

Los primeros 20 segundos son indicaciones especiales. Los minutos se codifican en los segundos 21–28, las horas durante los segundos 29–34 y la fecha en los segundos 36–58. Aunque el código de tiempo solo incluye dos dígitos del año, es posible deducir dos bits de siglo utilizando el día de la semana. Aún así existe ambigüedad cada 400 años, ya que en el calendario gregoriano se repiten semanas cada 400 años, pero esto sería suficiente para determinar qué años de los que terminan en 00, son años bisiestos.

Sincronización de redes con DCF77

DCF77 se creó para cubrir la necesidad que existía de disponer de un sistema de sincronización vía radio, con gran cobertura y la precisión de un reloj atómico. La señal DCF77 se utiliza para sincronizar sistemas de seguimiento a satélites, telescopios, redes transmitiendo en isofrecuencia (SFN), etc.

Red de transmisores en isofrecuencia

¿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.

Logo: PCBWay

https://www.pcbway.es/

Ahora el servicio de montaje en PCBWay por $ 30, con envío GRATUITO mundial:
https://www.pcbway.es/quotesmt.aspx

Transmisor experimental DCF77