- Protocolo de tiempo de red (NTP)
- Componentes requeridos
- Diagrama de circuito y conexiones
- Explicación del código
RTC o Real Time Clock es el módulo más utilizado en electrónica y dispositivos integrados para realizar un seguimiento del tiempo. Pero el problema con RTC es que los microchips de las computadoras no son tan precisos y solo pueden proporcionar la hora del dispositivo local. Por otro lado, usar Internet para obtener la hora de los servidores NTP es una mejor solución para obtener la hora, ya que es más precisa y puede proporcionar la hora de cualquier área geográfica del mundo. Solo necesitamos un módulo Wi-Fi y acceso a Internet para obtener la hora de cualquier lugar del mundo mediante el uso de servidores NTP. En este tutorial, usaremos ESP8266 NodeMCU para obtener la fecha y hora actual de los servidores NTP y mostrarla en la pantalla OLED.
Protocolo de tiempo de red (NTP)
NTP es uno de los protocolos de Internet (IP) de red más antiguos para sincronizar relojes entre redes de computadoras. Fue diseñado por David L. Mills de la Universidad de Delaware en 1981. Este protocolo se puede utilizar para sincronizar muchas redes con la Hora Universal Coordinada (UTC) en unos pocos milisegundos. UTC es el estándar de tiempo principal por el cual el mundo regula el reloj y la hora. UTC no cambia y varía para diferentes ubicaciones geográficas. NTP utiliza UTC como referencia de tiempo y proporciona una hora precisa y sincronizada en Internet.
NTP funciona en un modelo cliente-servidor jerárquico. El modelo superior tiene relojes de referencia conocidos como "stratum0" como relojes atómicos, ondas de radio, GPS, GSM que recibe la hora del satélite. Los servidores que reciben la hora de stratum0 se denominan "stratum1" y los servidores que reciben la hora de stratum1 se denominan "stratum2" y así sucesivamente. Esto continúa y la precisión del tiempo continúa disminuyendo después de cada etapa. NTP selecciona automáticamente la mejor de varias fuentes de tiempo disponibles para sincronizar, lo que lo convierte en un protocolo capaz de tolerancia a fallas.
Entonces, aquí en este proyecto, estamos obteniendo tiempo del servidor NTP usando ESP8266 NodeMCU y mostrándolo en la pantalla OLED. Este mismo tipo de reloj de Internet se crea utilizando ESP32 en el tutorial anterior.
ESP8266 puede acceder a servidores NTP a través de Internet para obtener la hora exacta. Aquí NTP funciona en modo cliente-servidor, ESP8266 funciona como dispositivo cliente y se conecta con servidores NTP usando UDP (Protocolo de datagramas de usuario). El cliente transmite un paquete de solicitud a los servidores NTP y, a cambio, NTP envía un paquete de marca de tiempo que consta de información como precisión, zona horaria, marca de tiempo UNIX, etc. Luego, el cliente separa los detalles de fecha y hora que se pueden usar en aplicaciones según los requisitos.
Componentes requeridos
- Pantalla OLED monocromática de 7 pines SSD1306 de 0,96 "
- ESP8266 NodeMCU
- Cable micro USB
- Tablero de circuitos
- Cables de puente macho a macho
Diagrama de circuito y conexiones
Esta pantalla OLED de 7 pines se comunica con el módulo ESP8266 mediante el protocolo SPI, a continuación se muestra el diagrama de circuito y la tabla de conexiones para conectar los pines OLED SPI con NodeMCU para mostrar la hora de Internet.
No. |
Pantalla OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3 V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) o SDA (I2C) |
D7 |
5 |
REINICIAR |
D3 |
6 |
corriente continua |
D2 |
7 |
CS |
D8 |
Para obtener más información sobre esta pantalla OLED monocromática de 7 pines y su interfaz con ESP8266 NodeMCU, siga el enlace.
Explicación del código
Primero tenemos que descargar e instalar la biblioteca NTP en ESP8266. Hay muchas bibliotecas disponibles para NTP Client. Puede instalar cualquiera de ellos desde Arduino IDE. En este tutorial he instalado la biblioteca NTPClient de Taranais porque es fácil de usar y tiene funciones para obtener la fecha y la hora de los servidores NTP. ESP8266 NodeMCU se puede programar fácilmente usando Arduino IDE.
Para instalar la biblioteca NTP, primero descargue la biblioteca usando el enlace anterior y luego instálela usando Arduino IDE. Para instalarlo, vaya a Sketch> Incluir biblioteca> Agregar biblioteca.ZIP , luego abra la carpeta Zip yendo a la ubicación donde ha descargado la carpeta zip y reinicie Arduino IDE.
La biblioteca NTPClient viene con ejemplos. Abra Arduino IDE y Goto Examples> NTPClient> Advanced . El código proporcionado en este esquema muestra la hora del servidor NTP en el monitor en serie. Usaremos este boceto para mostrar la hora y fecha actuales en la pantalla OLED.
El código completo está disponible al final de este tutorial, aquí he explicado algunas partes importantes del código.
La biblioteca ESP8266WiFi proporciona rutinas Wi-Fi específicas de ESP8266 para conectarse a la red. WiFiUDP.h maneja el envío y la recepción de paquetes UDP. Como estamos usando el protocolo SPI para interconectar OLED con NodeMCU, importaremos la biblioteca “SPI.h”. Y "Adafruit_GFX.h" y "Adafruit_SSD1306.h" se utilizan para la pantalla OLED.
#incluir
Nuestro tamaño OLED es 128x64, por lo que estamos configurando el ancho y la altura de la pantalla en 128 y 64 respectivamente. Por lo tanto, defina las variables para los pines OLED conectados a NodeMCU para la comunicación SPI.
#define SCREEN_WIDTH 128 // Ancho de pantalla OLED, en píxeles #define SCREEN_HEIGHT 64 // Altura de pantalla OLED, en píxeles // Declaración para pantalla SSD1306 conectada mediante software SPI (caso predeterminado): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Pantalla Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Reemplaza "your_ssid" y "your_password" con tu SSID y contraseña de Wi-Fi en las siguientes líneas de código.
const char * ssid = "your_ssid"; const char * contraseña = "su_contraseña";
Configure la conexión Wi-Fi dando SSID y contraseña a la función WiFi.begin . La conexión de ESP8266 tarda un tiempo en conectarse a NodeMCU, por lo que tenemos que esperar hasta que se conecte.
WiFi.begin (ssid, contraseña); while (WiFi.status ()! = WL_CONNECTED) { retraso (500); Serial.print ("."); }
Para solicitar la fecha y la hora, inicialice el cliente de hora con la dirección de los servidores NTP. Para una mayor precisión, elija la dirección de los servidores NTP que están cerca de su área geográfica. Aquí usamos " pool.ntp.org " que proporciona servidores de todo el mundo. Si desea elegir servidores de Asia, puede utilizar “ asia.pool.ntp.org ”. timeClient también toma la diferencia horaria UTC en milisegundos de su zona horaria. Por ejemplo, la compensación UTC para India es +5: 30, por lo que convertimos esta compensación en milisegundos, que es igual a 5 * 60 * 60 + 30 * 60 = 19800.
Zona |
Desplazamiento de hora UTC (horas y minutos) |
Desplazamiento de hora UTC (segundos) |
INDIA |
+5: 30 |
19800 |
LONDRES |
0:00 |
0 |
NUEVA YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
Se proporciona SSD1306_SWITCHCAPVCC para generar 3.3V internamente para inicializar la pantalla. Cuando el OLED se enciende, muestra " BIENVENIDO A CIRCUIT DIGEST " con tamaño de texto 2 y color AZUL durante 3 segundos.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("Falló la asignación SSD1306")); para(;;); // No continúes, repite indefinidamente } display.clearDisplay (); display.setTextSize (2); // Dibujar texto en escala 2X display.setTextColor (BLUE); display.setCursor (5, 2); display.println ("BIENVENIDO A"); display.println ("CIRCUITO"); display.println ("DIGEST"); display.display (); retraso (3000);
El cliente NTP se inicializa usando la función begin () para configurar la fecha y la hora desde los servidores NTP.
timeClient.begin ();
La función Update () se utiliza para recibir la fecha y la hora siempre que lo solicitemos a los servidores NTP.
timeClient.update ();
La velocidad en baudios de 115200 está configurada para imprimir la hora en el monitor en serie.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay son la función de la biblioteca y dan la hora, minutos, segundos y día actuales del servidor NTP. El siguiente código se utiliza para diferenciar la hora entre AM y PM. Si la hora que obtenemos usando getHours () es mayor que 12, entonces configuramos esa hora como PM, de lo contrario es AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int día = timeClient.getDay (); si (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("PM"); } else { display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("AM"); } int día = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () se usa para obtener la fecha en formato “aaaa-mm-dd” desde el servidor NTP. Esta función proporciona la fecha y la hora en formato “aaaa-mm-dd T hh: mm: ss . Pero solo necesitamos la fecha, por lo que tenemos que dividir esta cadena que se almacena en formato fecha_hora hasta "T" que se hace mediante la función subcadena () y luego almacenar la fecha en la variable "fecha" .
fecha_hora = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); String date = date_time.substring (0, index_date); Serial.println (fecha); display.println (fecha); display.display ();
Así es como se verá finalmente el reloj de tiempo de Internet OLED: