▷ #ESP32 - SINCRONIZAR RTC INTERNO CON SERVIDOR NTP

⭐⭐⭐⭐⭐ #ESP32 - SINCRONIZAR RTC INTERNO CON SERVIDOR NTP

Para muchos proyectos se requiere  un manejo de tiempo preciso, como ejemplo tenemos activar un sistema de riego a una hora determinada del día, o realizar una medición por un periodo de minutos o segundos. Para todos estos casos el uso de un reloj RTC es de suma importancia. En nuestro blog ya explicamos como utilizar el RTC interno del ESP32, lo puede ver en el siguiente enlace. 

Si bien con eso tenemos un RTC preciso y confiable, el tener que ajustar la la hora y fecha manualmente para mantenerlos actualizados, provoca un mayor trabajo y una constante programación del dispositivo.

La solución ante tales complicaciones la podemos encontrar en la sincronización con servidores NTP, aprovechando que nuestro dispositivo cuenta con una antena WIFI, por medio de internet podemos ajustar nuestro RTC a la fecha real, de tal manera que siempre se mantenga actualizado.

  • ¿Qué es NTP?

Network Time Protocol (NTP) es un protocolo de Internet para sincronizar los relojes de los sistemas informáticos, entre los que podemos encontrar computadoras, tables o los celulares que utilizamos todos los días. La ventaja de estos servidores, es que son gratuitos y solo debemos preocuparnos de tener una conexión al internet para sincronizar nuestro RTC interno. A continuación veremos como podemos realizar dicha sincronización en nuestros ESP32.

  • Parámetros necesarios para sincronización NTP

NTP_SERVER: Se refiere a la dirección URL donde esta alojado nuestro servidor NTP,  en nuestro caso utilizaremos el servidor pool.ntp.org debido a su disponibilidad y confiabilidad, sin embargo, el lector puede utilizar cualquier otro servidor NTP a su elección.

GMT_OFFSET: Es el desplazamiento entre nuestra zona horaria y el GMT. O lo que colonialmente les decimos solamente zona horaria. En nuestro caso que vivimos en Ecuador dicho valor seria de GMT -5, aclarando que dicho 5 se refiere a horas.

DAYLIGHT_OFFSET: Desplazamiento para el horario de verano, esto aplica mayor mente para los paises en los hemisferios norte en donde debido a la inclinación de la tierra, en ciertas temporada del año, se tiene mas luz solar, y en esos casos se debe ajustar los relojes ante el cambio. Para Ecuador al estar en la mitad del mundo no nos vemos afectados, y podemos ignorarlos.

  • Librería ESP32Time

Esta librería nos ofrecerá todas las herramientas necesarias para sacar provecho a nuestro RTC interno, el link de descarga al igual a toda la documentación la puede encontrar en el siguiente enlace:

https://www.arduinolibraries.info/libraries/esp32-time

Recomendamos al lector revisarlo para aprender a profundidad sobre la libreria y todas las características que ofrece.

El método de instalación es el mismo de siempre. Entramos al link, y descargamos el rar de la versión que deseamos, abrimos nuestro Arduino-IDE, nos dirigimos a Programa -> Incluir Librería ->  Añadir biblioteca zip y seleccionamos el rar que descargamos. 


Código - Sincronizar Fecha y Hora con servidor NTP
  • Explicación del código

Primero debemos incluir las librerías, ESP32Time para utilizar nuestro RTC interno y WIFI para la configuración, conexión y sincronización vía internet.


Creamos un objeto del tipo ESP32Time, este objeto representara nuestro RTC y es donde podremos configurar, consultar los diferentes datos nuestro RTC.



Colocamos nuestras credenciales WIFI para conectarnos a internet.







Ahora definimos los parámetros para configurar nuestro Servidor NTP, recordar que el GMT_OFFSET y DAYLIGHT_OFFSET deben ser colocados en segundos. Por ello en Ecuador al tener GTM -5 realizamos la operación -5 horas multiplicado por 3600 que representa 1 hora en segundos.


En nuestro void setup iniciamos nuestro serial, para poder visualizar luego los datos obtenidos.




Nos conectamos a nuestra red WIFI utilizando la función WIFI.begin con los parámetros creados al inicio. Y nos quedamos en un bucle While hasta que se logre conectar correctamente.


Una vez estamos seguros de estar conectados a internet, podemos actualizar nuestro RTC interno con la función configTime pasamos los parámetros de nuestro NTP creados al inicio. Con esto nuestro RTC interno ya estará actualizado, luego de eso tenemos que actualizar nuestra estructura ESP32time para que refleje la fecha-hora de nuestro RTC, por ello utilizando la función getLocalTime extraemos la información de nuestro RTC interno en una estructura tm, colocamos un if en caso de que el proceso falle. Si todo salió bien tendremos en tm la fecha-hora de nuestro RTC interno actualizado, ahora debemos actualizar nuestra variable rtc utilizando la función setTimeStruct y pasando como parámetro el tm con la información. Una vez realizado este proceso, ya tenemos nuestro ESP32Time completamente actualizado con la fecha de internet.


Nos desconectamos del internet. Cabe aclarar que esto lo realizamos para demostrar al lector que solo necesitamos el internet para actualizar nuestro RTC y no para todo su funcionamiento. Si en caso de ser necesario o el lector desea dejar activado el WIFI, no ocurrirá ningún problema. Luego cerramos el void setup();

Finalmente, entramos a nuestro void loop luego de haber actualizado nuestro RTC, utilizando la función getTime obtenemos la fecha-hora con el siguiente formato.


  • Ejecución del código

Compilamos el código y lo subimos a la placa. Abrimos el monitor serial y podemos observar como nuestro RTC interno se sincronizo con la hora en internet de manera efectiva.



Con una gran precisión a nivel de segundos, como se puede mostrar a continuación.









Comentarios

Popular Posts

▷ Especificaciones del módulo ESP32

▷ #ESP32 - REAL-TIME CLOCK #RTC INTERNO

▷ #ESP32 - Display OLED 128x64

▷ #ESP32 - Over-The-Air programming #OTA

▷ SISTEMAS EMBEBIDOS, PROYECTOS PROPUESTOS (2021 PAO1)

▷ SOLUCIÓN EVALUACIÓN FUNDAMENTOS DE ELECTRICIDAD Y SISTEMAS DIGITALES, 1er Parcial (2021 PAO1)

▷ PROTEUS PCB DESIGN

▷ SOLUCIÓN EVALUACIÓN SISTEMAS EMBEBIDOS, 1er Parcial (2020 PAO 2)

▷ SOLUCIÓN EVALUACIÓN SISTEMAS DIGITALES 1, 1er Parcial (2021 PAE)