ShIoTiny: un reloj sin resorte o tiempo real y cómo trabajar con él



¿De qué trata este artículo?

Continuamos la serie de artículos sobre ShIoTiny , un controlador visualmente programable basado en el chip ESP8266 .

Este artículo habla sobre el reloj en tiempo real en el controlador ShIoTiny , la sincronización horaria y el uso de nodos para trabajar con el reloj.

Sitio del proyecto ShIoTiny

Artículos anteriores de la serie.

ShIoTiny: pequeña automatización, Internet de las cosas o "seis meses antes de las vacaciones"

ShIoTiny: nodos, enlaces y eventos o características de programas de dibujo

ShIoTiny: ventilación de habitación húmeda (proyecto de ejemplo)

ShIoTiny y el mundo circundante: conectar sensores a entradas binarias, rebote de contactos y otros problemas

ShIoTiny y el mundo: sensores analógicos o ADC para los más pequeños

Firmware binario, circuitos del controlador y documentación

Entrada


Hoy hablamos de tiempo. No se trata del tiempo, en el sentido en que los filósofos han estado discutiendo al respecto durante siglos y el borde final no es visible para este debate. Y sobre la hora que vemos en el reloj y según la cual vamos al trabajo, a la escuela o tenemos prisa en una cita.

La cosa es que faltan el reloj en tiempo real no volátil en el chip ESP8266 y el controlador ShIoTiny . Esta lesión de nacimiento del controlador ShIoTiny es completamente mi culpa. Pero lo hecho, hecho está.

Tan pronto como el firmware vio la luz, el público, indignado por mi actitud hacia el tiempo real, comenzó a asomar mi nariz ante esta falla.

Dado que los errores deben corregirse, y esta vez al menos no con sangre, fui a conocer al número cada vez mayor de usuarios de mi firmware e hice lo que pude. Es decir, agregué nodos al firmware del controlador ShIoTiny que hacen que sea más o menos conveniente trabajar con esto en tiempo real.

Acerca de ShIoTiny Watch


Como ya se mencionó, no hay "horas con una batería" en ShIoTiny . Pero al mismo tiempo, se implementa la cuenta regresiva de segundos a partir del 1 de enero de 1970.

Este es el mismo tiempo llamado tiempo UNIX, almacenado en variables del tipo time_t en lenguajes C / C ++ y que debe finalizar el 19 de enero de 2038 en sistemas de 32 bits.

Pero no tengas miedo. Creo que para 2038 todos tendrán tiempo de hacer que time_t escriba 64 bits y el problema se resolverá en los próximos 292 mil millones de años. Bueno, hay algo más que se nos ocurrirá.

Tenga en cuenta que la hora en el formato time_t a veces se llama (en mi artículo también): marca de tiempo o, en ruso, una marca de tiempo .

Pero volvamos a nuestro controlador. Por lo tanto, hay un reloj, pero este reloj se restablece a 0 después de apagar la alimentación. Esto lleva a la conclusión trivial de que el principal problema de contar el tiempo en el controlador ShIoTiny es la necesidad de sincronizar el reloj del controlador cuando se enciende la alimentación. El resto son problemas puramente técnicos.

Sincronización de tiempo


Una forma establecida desde hace mucho tiempo para sincronizar la hora en Internet son los servidores NTP . Y la primera idea era hacer un nodo que sincronizara la hora con un servidor NTP dado.

Pero, respirando un poco de aire fresco y reflexionando sobre mi calabaza, me di cuenta de que este enfoque es ideológicamente incorrecto.

No es un hecho que el usuario quiera extraer el controlador con el firmware ShIoTiny en Internet. Y el tiempo para la sincronización se puede enviar no solo desde el servidor NTP , sino también a través de UDP-multicast, o con una calidad de conexión conocida, a través de MQTT .

Por lo tanto, se tomó una decisión fatídica: separar los nodos para recibir el tiempo del servidor NTP y establecer la hora del sistema.

En total, se desarrollaron dos nodos para la sincronización horaria: el nodo para recibir la hora del servidor NTP Hora NTP



y el nodo de instalación del reloj del sistema Set Time



El nodo que recibe el tiempo del servidor NTP como parámetros recibe el nombre o la dirección IP del servidor NTP y, separados por una coma, el período de tiempo del servidor NTP en minutos. Por defecto, el tiempo se solicita al servidor NTP cada 60 minutos o 1 hora. En la salida, este nodo establece 0 hasta que se sincronice la hora o la marca de tiempo sea el resultado de la última sincronización con el servidor.

El nodo de instalación del reloj del sistema recibe una marca de tiempo como entrada y establece el reloj del sistema de acuerdo con esta etiqueta.

La figura muestra el esquema más simple para sincronizar el reloj del sistema con un servidor NTP .



El período de sincronización no está configurado y es de 60 minutos de forma predeterminada. La figura muestra la marca de tiempo.

Observo que no puede haber más de un nodo para recibir el tiempo de un servidor NTP y más de un nodo para configurar la hora del sistema en el esquema del programa.

Si necesita un esquema de sincronización exótico, puede usar UDP-multicast o MQTT . Los esquemas son completamente similares.

Para la sincronización UDP-multicast , aproximadamente lo mismo que en la figura.



Y para la sincronización a través de MQTT (no aconsejo, por supuesto, pero en casos extremos), tal.



Espero que ahora todo esté claro con la sincronización del reloj del sistema del controlador ShIoTIny . Pasemos a los nodos de tiempo de recepción y procesamiento.

Que hora es


La pregunta es simple, pero a veces no es fácil de responder. Después de todo, el tiempo en cada punto de la Tierra es diferente. Nuestra vasta patria incluye desde Kaliningrado hasta Kamchatka hasta 11 zonas horarias.

El servidor NTP , dependiendo de la configuración, puede devolver una marca de tiempo asociada con diferentes zonas horarias. Por lo general, esta marca de tiempo está vinculada a UTC - hora universal.

Pero generalmente necesitamos la hora local de la región donde funciona nuestro controlador. ¿Cómo estar aquí?

Y es muy simple: para obtener la marca de tiempo del reloj del sistema del controlador ShIoTIny , se desarrolló el nodo Get Time , en el que puede establecer la zona horaria como una compensación horaria de -12 horas a +12 horas en relación con el reloj del sistema del controlador.

Supongamos que obtenemos la hora del servidor pool.ntp.org y sincronizamos el reloj del sistema, como en nuestro ejemplo anterior. Este servidor devuelve la hora universal. Necesitamos locales, como Tomsk, como el mío. Sé que Tomsk está en la zona horaria UTC + 7 . Entonces, configuremos la unidad receptora de tiempo para compensar +7 o solo 7. Como en la figura a continuación.



Y si viviéramos en la provincia canadiense de Alberta, el turno sería de -7 horas. Recuerde lo principal: la zona horaria se establece en el nodo para obtener el tiempo en horas . Y se configura en forma de un desplazamiento relativo a la hora del reloj del sistema. La marca de tiempo se establece en la salida de la unidad de recepción de tiempo. Puede haber varios nodos para obtener tiempo en un circuito.

Mira el reloj


Es muy conveniente que la máquina trabaje con el tiempo en el formato de marcas de tiempo time_t . Después de todo, este es solo un número entero que muestra la cantidad de segundos relativos al punto de partida: 1 de enero de 1970. En este formato, puede encontrar fácilmente la distancia entre dos puntos de tiempo, contar períodos, etc. Esto es solo la suma y resta de enteros.

Pero el hombre no es una máquina. Se siente mucho más cómodo con la representación habitual del tiempo en forma de año, mes, día, horas, minutos y segundos. Entonces los humanos estamos dispuestos.

Por lo tanto, se introdujeron los nodos de la traducción de la marca de tiempo en las unidades de cambio de tiempo familiares para la persona, y viceversa, la síntesis de la marca de tiempo de las unidades de cambio de tiempo comprensible para la persona. Estos nodos se denominan, respectivamente, Tiempo dividido y Tiempo de sintetizador .

Cómo funciona todo esto queda claro en la siguiente figura.



Observo que los nodos Tiempo dividido y Tiempo de sintetizador meses (mes) y días de la semana (wday) se cuentan desde cero. Por meses: 0-enero, 11-diciembre. Para los días de la semana 0-domingo, 6-sábado.
Otros resultados: día del mes (día), año (año), hora (hora), min (minuto), seg (segundo): se cuentan en la forma habitual. Horas, minutos, segundos - de 0 a 59. Día del mes - dependiendo del mes desde el primer día hasta el 30 o 31 y, para febrero, hasta el 28 o 29.
Bueno, un año, él es el año. 2019 ahora.
Espero que todo esté claro.

Ejemplo del sistema


Para no ser infundado, daré un ejemplo del uso de relojes. Por supuesto, simplificado.

Supongamos que tenemos una habitación húmeda que queremos ventilar por la fuerza. Pero no siempre, sino solo cuando la humedad es superior a un nivel determinado y solo de noche. Por la noche, para no molestar a las personas durante el día con el ruido de los fanáticos. Bueno, aquí estamos los estetos y nos preocupamos por las personas.

Intentemos implementar esto.



Todas las partes del circuito nos son familiares. La hora se sincroniza desde el servidor NTP . Si bien no está sincronizado, el nodo NTP Time devuelve 0 y el relé de habilitación del ventilador está desactivado. Para esto, el elemento superior Y según el esquema es el responsable.

Una vez que se sincroniza la hora, el encendido / apagado del ventilador está determinado por la hora actual y el nivel de humedad. Tan pronto como el nivel de humedad exceda el 70% y el tiempo sea de 23:00 a 06:00 , el ventilador se encenderá y no ventilará la habitación.

Por supuesto, es mejor reemplazar las constantes de tiempo y humedad en un proyecto real con los parámetros almacenados en FLASH y configurados, por ejemplo, de acuerdo con MQTT . Sí, y el estado actual del sistema (nivel de humedad, corriente, hora, estado del ventilador) tampoco hace daño publicar en la red para controlar el sistema desde un teléfono inteligente. Pero esto ya te dejo espacio para tu imaginación.

Conclusión


Así que presentamos nuestro controlador con tiempo real más cerca.

Quiero agradecer a todos los que me enviaron cartas de crítica constructiva y consejos sobre actualizaciones de software. Gracias chicos!

Como de costumbre, la crítica constructiva es bienvenida. Además, los comentarios y sugerencias son bienvenidos.

Puede enviar todas las críticas, comentarios, sugerencias como de costumbre en un comentario o por correo electrónico: shiotiny@yandex.ru .

Source: https://habr.com/ru/post/467545/


All Articles