Obtenga la fecha y hora del servidor NTP usando ESP8266 NodeMCU

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.

Obtenga la fecha y hora del servidor NTP usando ESP8266 NodeMCU

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:

  1. El dispositivo cliente, por ejemplo el ESP8266, se conecta al servidor NTP utilizando el Protocolo de datagramas de usuario (UDP) en el puerto 123.
  2. Luego, el cliente envía un paquete de solicitud al servidor NTP.
  3. 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.
  4. Luego, un cliente puede extraer la fecha y hora actuales de esto.
Obtenga la fecha y hora del servidor NTP usando ESP8266 NodeMCU

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.

Obtenga la fecha y hora del servidor NTP usando ESP8266 NodeMCU
Instalación de la placa ESP8266 en el IDE de Arduino
Hay varias plataformas de desarrollo disponibles para programar el ESP8266. Puedes elegir: Arduino IDE – destinado a aquellos que están familiarizados con ArduinoEspruino…

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.

Obtenga la fecha y hora del servidor NTP usando ESP8266 NodeMCU

Filtra tu búsqueda escribiendo “cliente ntpc'. Buscar Cliente NTP de Fabrice Weinberg. Haga clic en esta entrada y luego seleccione «Instalar».

Obtenga la fecha y hora del servidor NTP usando ESP8266 NodeMCU

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.

Obtenga la fecha y hora del servidor NTP usando ESP8266 NodeMCU

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());
Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

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:

  1. 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.
  2. El cliente luego envía un paquete de solicitud al servidor NTP.
  3. 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.
  4. 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.

2 comentarios en «Obtenga la fecha y hora del servidor NTP usando ESP8266 NodeMCU»

Deja un comentario