En este artículo, exploraremos cómo obtener la fecha y hora del servidor NTP utilizando el ESP8266 NodeMCU. El NodeMCU es un versátil módulo de desarrollo basado en el ESP8266 que nos permite conectarnos a Internet y acceder a la hora actual de forma precisa. Sigue leyendo para descubrir cómo sincronizar la hora en tu proyecto de IoT de forma sencilla y efectiva.
De vez en cuando te encontrarás con una idea en la que mantener el tiempo es una prioridad absoluta. Por ejemplo, imagine un relé que debe activarse en un momento específico o un registrador de datos que necesita almacenar valores a intervalos precisos.
Lo primero que me viene a la mente es utilizar un chip RTC (Reloj en tiempo real). Sin embargo, dado que estos chips no son completamente precisos, deberá realizar ajustes manuales periódicos para mantenerlos sincronizados.
En cambio, es preferible utilizar ese Protocolo de tiempo de red (PNT). Si su proyecto ESP8266 tiene acceso a Internet, puede obtener la fecha y la hora (con una precisión de unos pocos milisegundos UTC). GRATIS. Además, no necesita ningún hardware adicional.
¿Qué es un NTP?
NTP es una abreviatura de Protocolo de tiempo de red. Es un protocolo de Internet (IP) estándar para sincronizar los relojes de las computadoras a través de una red.
Este protocolo sincroniza todos los dispositivos en red. hora universal coordinada (UTC) en unos pocos milisegundos (50 milisegundos en la Internet pública y menos de 5 milisegundos en un entorno LAN).
La Hora Universal Coordinada (UTC) es un estándar de hora global similar a GMT (hora media de Greenwich). UTC no cambia; es lo mismo en todo el mundo.
La idea aquí es utilizar NTP para configurar los relojes de la computadora en UTC y luego aplicar cualquier zona horaria local o compensación del horario de verano. Esto nos permite sincronizar los relojes de nuestros ordenadores independientemente de la ubicación o las diferencias de zona horaria.
arquitectura NTP
NTP utiliza una arquitectura jerárquica. Cada nivel de la jerarquía se denomina capa.
En la parte superior se encuentran dispositivos de medición del tiempo de alta precisión, como relojes atómicos, GPS o relojes controlados por radio, los llamados relojes de hardware Stratum-0.
Los servidores Stratum 1 tienen una conexión directa a un reloj de hardware Stratum 0 y, por lo tanto, proporcionan la hora más precisa.
Cada capa de la jerarquía se sincroniza con la capa superior y actúa como servidor para las computadoras de las capas inferiores.
¿Cómo funciona NTP?
NTP puede funcionar de diferentes maneras. La configuración más común es operar en modo cliente-servidor.
El principio de funcionamiento básico es el siguiente:
- El dispositivo cliente, por ejemplo el ESP8266, se conecta al servidor NTP utilizando el Protocolo de datagramas de usuario (UDP) en el puerto 123.
- Luego, el cliente envía un paquete de solicitud al servidor NTP.
- En respuesta a esta solicitud, el servidor NTP envía un paquete de marca de tiempo. Un paquete de marca de tiempo contiene una variedad de datos, como una marca de tiempo UNIX, precisión, retraso o zona horaria.
- Luego, un cliente puede extraer la fecha y hora actuales de esto.
Preparando el IDE de Arduino
Debes tener el complemento ESP8266 instalado en tu IDE de Arduino antes de continuar con este tutorial. Si aún no lo ha instalado, siga las instrucciones a continuación.
Instalación de la biblioteca del cliente NTP
El Biblioteca de cliente NTP simplifica el proceso de recuperación de hora y fecha de un servidor NTP. Siga los pasos a continuación para instalar esta biblioteca en su IDE de Arduino.
Navegar a Bosquejo > Incluir biblioteca > Administrar bibliotecas… Espere a que el administrador de la biblioteca descargue el índice de la biblioteca y actualice la lista de bibliotecas instaladas.
Filtra tu búsqueda escribiendo “cliente ntpc'. Buscar Cliente NTP de Fabrice Weinberg. Haga clic en esta entrada y luego seleccione «Instalar».
Obtener fecha y hora del servidor NTP
El siguiente esquema le muestra exactamente cómo obtener la fecha y la hora del servidor NTP.
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char *ssid = "YOUR_SSID";
const char *password = "YOUR_PASS";
const long utcOffsetInSeconds = 3600;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
void setup(){
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
}
void loop() {
timeClient.update();
Serial.print(daysOfTheWeek[timeClient.getDay()]);
Serial.print(", ");
Serial.print(timeClient.getHours());
Serial.print(":");
Serial.print(timeClient.getMinutes());
Serial.print(":");
Serial.println(timeClient.getSeconds());
//Serial.println(timeClient.getFormattedTime());
delay(1000);
}
Antes de comenzar a cargar el boceto, deberá realizar algunos cambios para asegurarse de que funcione para usted.
- Modifique las siguientes dos variables con sus credenciales de red para permitir que el ESP8266 se conecte a una red existente.
const char* ssid = "YOUR_SSID"; const char* password = "YOUR_PASS";
- Ajuste el desplazamiento UTC para su zona horaria (en segundos). Mira esto Lista de compensaciones horarias UTC. A continuación se muestran algunos ejemplos para diferentes zonas horarias:
- Para UTC -5.00: -5 * 60 * 60: -18000
- Para UTC+1.00: 1*60*60: 3600
- Para UTC +0.00: 0 * 60 * 60: 0
const long utcOffsetInSeconds = 3600;
Después de cargar el boceto, presione el botón RST en su NodeMCU. El monitor serie debe mostrar la fecha y la hora cada segundo.
Explicación del código
Echemos un vistazo rápido al código para ver cómo funciona. Primero, incluyamos las bibliotecas necesarias para este proyecto.
- NTPCliente.h es una biblioteca de tiempo que maneja la sincronización del servidor NTP sin problemas.
- ESP8266WiFi.h es una biblioteca que contiene los métodos WiFi específicos de ESP8266 que usaremos para conectarnos a una red.
- WiFiUdp.h La biblioteca maneja tareas del protocolo UDP, como abrir un puerto UDP, enviar y recibir paquetes UDP, etc.
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
Algunas constantes están definidas, p. B. SSID, contraseña de WiFi y compensación UTC. daysOfTheWeek
También se define una matriz 2D.
const char *ssid = "YOUR_SSID";
const char *password = "YOUR_PASS";
const long utcOffsetInSeconds = 3600;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
También se especifica la dirección del servidor NTP. piscina.ntp.org es un gran proyecto NTP abierto para este tipo de cosas.
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
pool.ntp.org selecciona automáticamente los servidores horarios que se encuentran físicamente cerca de usted. Sin embargo, si desea seleccionar un servidor específico, utilice una de las subzonas pool.ntp.org.
Área | nombre de host |
Mundial | piscina.ntp.org |
Asia | asia.pool.ntp.org |
Europa | europa.pool.ntp.org |
América del norte | norteamerica.pool.ntp.org |
Oceanía | oceania.pool.ntp.org |
Sudamerica | américa del sur.pool.ntp.org |
En el área de configuración, primero establecemos comunicación serial con la PC y luego nos conectamos a la red WiFi mediante la llamada WiFi.begin()
Función.
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
Una vez conectado el ESP8266 a la red, utilizamos el begin()
Función para inicializar el cliente NTP.
timeClient.begin();
Ahora llamemos a esos update()
Función para obtener la fecha y hora actuales. Esta función envía un paquete de solicitud a un servidor NTP y analiza el paquete de marca de tiempo recibido en un formato legible.
timeClient.update();
Puede obtener la fecha y hora actuales llamando a los métodos del objeto del cliente NTP.
Serial.print(daysOfTheWeek[timeClient.getDay()]);
Serial.print(", ");
Serial.print(timeClient.getHours());
Serial.print(":");
Serial.print(timeClient.getMinutes());
Serial.print(":");
Serial.println(timeClient.getSeconds());
Obtenga la fecha y hora del servidor NTP usando ESP8266 NodeMCU
Cada cierto tiempo, encontrarás una idea donde mantener la hora es una prioridad. Por ejemplo, considera un relé que debe activarse en un momento específico o un registrador de datos que debe almacenar valores a intervalos precisos.
Lo primero que viene a la mente es usar un chip RTC (Reloj en Tiempo Real). Sin embargo, como estos chips no son perfectamente precisos, debes realizar ajustes manuales regularmente para mantenerlos sincronizados.
En lugar de esto, es preferible utilizar el Protocolo de Tiempo de Red (NTP). Si tu proyecto ESP8266 tiene acceso a Internet, puedes obtener la fecha y hora (con una precisión de unos pocos milisegundos de UTC) de forma GRATUITA. Además, no necesitas hardware adicional.
¿Qué es un NTP?
NTP es la abreviatura de Protocolo de Tiempo de Red. Es un Protocolo de Internet estándar (IP) para sincronizar los relojes de computadoras en una red.
Este protocolo sincroniza todos los dispositivos en red con el Tiempo Universal Coordinado (UTC) en unos pocos milisegundos (50 milisegundos en Internet público y menos de 5 milisegundos en un entorno LAN).
El Tiempo Universal Coordinado (UTC) es un estándar de tiempo global que es similar al GMT (Greenwich Mean Time). UTC no cambia; es el mismo en todo el mundo.
La idea aquí es usar NTP para configurar los relojes de computadora a UTC y luego aplicar cualquier desplazamiento de zona horaria local o desplazamiento de horario de verano. Esto nos permite sincronizar nuestros relojes de computadora independientemente de las diferencias de ubicación o zona horaria.
Arquitectura NTP
NTP utiliza una arquitectura jerárquica. Cada nivel en la jerarquía se conoce como estrato.
En la parte superior se encuentran dispositivos de precisión de cronometraje elevado, como relojes atómicos, GPS o relojes de radio, conocidos como relojes de hardware de estrato 0.
Los servidores de estrato 1 tienen una conexión directa a un reloj de hardware de estrato 0 y, por lo tanto, proporcionan el tiempo más preciso.
Cada estrato en la jerarquía se sincroniza con el estrato superior y actúa como un servidor para computadoras en estratos inferiores.
¿Cómo funciona el NTP?
NTP puede operar de varias formas. La configuración más común es operar en modo cliente-servidor.
El principio operativo fundamental es el siguiente:
- El dispositivo cliente, como el ESP8266, se conecta al servidor NTP a través del Protocolo de Datagrama de Usuario (UDP) en el puerto 123.
- El cliente luego envía un paquete de solicitud al servidor NTP.
- En respuesta a esta solicitud, el servidor NTP envía un paquete de marca de tiempo. Un paquete de marca de tiempo contiene una variedad de datos, como una marca de tiempo UNIX, precisión, retraso o zona horaria.
- Un cliente puede extraer la fecha y hora actual de él.
Para continuar leyendo sobre cómo obtener la fecha y hora del servidor NTP utilizando ESP8266 NodeMCU, consulta la fuente actualizada.
¡Interesante artículo! ¡Gracias por compartir este conocimiento técnico!
¡Qué útil! Definitivamente tengo que probar esto en mi propio NodeMCU. ¡Gracias por la info!