- Protocol de temps de xarxa (NTP)
- Components necessaris
- Diagrama de circuits i connexions
- Explicació del codi
RTC o Real Time Clock és el mòdul més utilitzat en electrònica i dispositius incrustats per fer un seguiment del temps. Però el problema amb RTC és que els microxips dels ordinadors no són tan precisos i només poden proporcionar l’hora del dispositiu local. D'altra banda, utilitzar Internet per obtenir l'hora dels servidors NTP és la millor solució per obtenir temps, ja que és més precís i pot proporcionar l'hora de qualsevol àrea geogràfica del món. Només necessitem un mòdul Wi-Fi i accés a Internet per obtenir temps de qualsevol lloc del món mitjançant servidors NTP. En aquest tutorial, utilitzarem ESP8266 NodeMCU per obtenir l’hora i la data actuals dels servidors NTP i mostrar-los a la pantalla OLED.
Protocol de temps de xarxa (NTP)
NTP és un dels protocols d’Internet (IP) de xarxa més antics per sincronitzar rellotges entre xarxes d’ordinadors. Va ser dissenyat per David L. Mills de la Universitat de Delaware el 1981. Aquest protocol es pot utilitzar per sincronitzar moltes xarxes amb el Temps Universal Coordinat (UTC) en pocs mil·lisegons. UTC és l'estàndard de temps principal pel qual el món regula el rellotge i l'hora. UTC no canvia ni varia segons les ubicacions geogràfiques. NTP utilitza UTC com a referència horària i proporciona una hora sincronitzada i precisa a Internet.
NTP funciona en un model jeràrquic client-servidor. El model superior té rellotges de referència coneguts com a “stratum0” com rellotges atòmics, ones de ràdio, GPS, GSM que rep el temps del satèl·lit. Els servidors que reben temps de stratum0 s’anomenen “stratum1” i els servidors que reben temps de stratum1 s’anomenen “stratum2”, etc. Això continua i la precisió del temps disminueix després de cada etapa. NTP selecciona automàticament la millor de diverses fonts de temps disponibles per sincronitzar, cosa que el converteix en un protocol capaç de tolerar els errors.
Així, doncs, en aquest projecte, obtenim temps del servidor NTP que utilitza ESP8266 NodeMCU i el mostrem a la pantalla OLED. Aquest mateix tipus de rellotge d’Internet es crea mitjançant l’ús d’ESP32 al tutorial anterior.

ESP8266 pot accedir als servidors NTP mitjançant Internet per obtenir un temps precís. Aquí NTP funciona en mode client-servidor, ESP8266 funciona com a dispositiu client i es connecta amb servidors NTP mitjançant UDP (User Datagram Protocol). El client transmet un paquet de sol·licitud als servidors NTP i, a canvi, NTP envia un paquet de marca de temps que conté informació com precisió, zona horària, marca de temps UNIX, etc. A continuació, el client separa els detalls de data i hora que es poden utilitzar a les aplicacions segons els requisits.
Components necessaris
- Pantalla OLED SSD1306 de 7 pins monocroma
- ESP8266 NodeMCU
- Cable micro USB
- Taula de pa
- Filferros de pont masculí a masculí
Diagrama de circuits i connexions
Aquesta pantalla OLED de 7 pins es comunica amb el mòdul ESP8266 mitjançant el protocol SPI; a continuació es mostren el diagrama de circuits i la taula de connexions per connectar els pins SPI OLED amb NodeMCU per mostrar l’hora d’Internet.

|
No. |
Pantalla OLED |
NodeMCU |
|
1 |
GND |
GND |
|
2 |
VDD |
3,3V |
|
3 |
SCK |
D5 |
|
4 |
MOSI (SPI) o SDA (I2C) |
D7 |
|
5 |
RESTABLEIX |
D3 |
|
6 |
DC |
D2 |
|
7 |
CS |
D8 |
Per obtenir més informació sobre aquesta pantalla OLED monocroma de 7 pins i la seva interfície amb ESP8266 NodeMCU, seguiu l’enllaç.
Explicació del codi
Primer hem de descarregar i instal·lar la biblioteca NTP a ESP8266. Hi ha moltes biblioteques disponibles per al client NTP. Podeu instal·lar-ne qualsevol des d'Arduino IDE. En aquest tutorial he instal·lat la biblioteca NTPClient de Taranais perquè és fàcil d'utilitzar i té funcions per obtenir data i hora dels servidors NTP. ESP8266 NodeMCU es pot programar fàcilment mitjançant Arduino IDE.

Per instal·lar la biblioteca NTP, primer descarregueu la biblioteca utilitzant l'enllaç anterior i després instal·leu-la mitjançant Arduino IDE. Per instal·lar-lo, aneu a Sketch> Include Library> Add.ZIP Library i , a continuació, obriu la carpeta Zip anant a la ubicació on heu descarregat la carpeta zip i reinicieu l'IDE Arduino.


La biblioteca NTPClient inclou exemples. Obriu Arduino IDE i aneu a Exemples> NTPClient> Avançat . El codi indicat en aquest esbós mostra l'hora del servidor NTP al monitor sèrie. Utilitzarem aquest esbós per mostrar l’hora i la data actuals a la pantalla OLED.

El codi complet està disponible al final d’aquest tutorial, aquí he explicat algunes parts importants del codi.
La biblioteca ESP8266WiFi proporciona rutines Wi-Fi específiques a ESP8266 per connectar-se a la xarxa. WiFiUDP.h s’encarrega d’enviar i rebre paquets UDP. Com que utilitzem el protocol SPI per a la interfície OLED amb NodeMCU, importarem la biblioteca "SPI.h". I "Adafruit_GFX.h" i "Adafruit_SSD1306.h" s'utilitzen per a la pantalla OLED.
#incloure
La nostra mida OLED és de 128x64, de manera que configurem l'amplada i l'alçada de la pantalla com a 128 i 64 respectivament. Definiu, doncs, les variables dels pins OLED connectats a NodeMCU per a la comunicació SPI.
#define SCREEN_WIDTH 128 // OLED ample de la pantalla, en píxels #define SCREEN_HEIGHT 64 // OLED alçada de la pantalla, en píxels // Declaració per a la visualització SSD1306 connectat usant SCI programari (cas per defecte): #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);
Substituïu "your_ssid" i "your_password" pel vostre SSID i contrasenya Wi-Fi a les línies de codi següents.
const char * ssid = "vostre_ssid"; const char * password = "vostre_password";
Configureu la connexió WI-Fi proporcionant SSID i contrasenya a la funció WiFi.begin . La connexió de l’ESP8266 triga un temps a connectar-se a NodeMCU, de manera que hem d’esperar fins que es connecti.
WiFi.begin (ssid, contrasenya); while (WiFi.status ()! = WL_CONNECTED) { demora (500); Serial.print ("."); }
Per sol·licitar data i hora, inicialitzeu l'hora client amb l'adreça dels servidors NTP. Per obtenir una precisió millor, trieu l'adreça dels servidors NTP que siguin propers a la vostra àrea geogràfica. Aquí fem servir " pool.ntp.org ", que proporciona servidors de tot el món. Si voleu triar servidors d'Àsia, podeu utilitzar " asia.pool.ntp.org ". timeClient també pren un desplaçament horari UTC en mil·lisegons de la vostra zona horària. Per exemple, el desplaçament UTC a l’Índia és de +5: 30, de manera que convertim aquest desplaçament en mil·lisegons que és igual a 5 * 60 * 60 + 30 * 60 = 19800.
|
Zona |
Desplaçament horari UTC (hores i minuts) |
Desplaçament horari UTC (segons) |
|
ÍNDIA |
+5: 30 |
19800 |
|
LONDRES |
0:00 |
0 |
|
NOVA YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800.60000);
SSD1306_SWITCHCAPVCC es dóna per generar 3.3V internament per inicialitzar la pantalla. Quan s'inicia l'OLED, mostra " BENVINGUTS AL CIRCUIT DIGEST " amb la mida del text 2 i el color BLAU durant 3 segons.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("Ha fallat l'assignació SSD1306")); per (;;); // No continueu, bucleu per sempre } display.clearDisplay (); display.setTextSize (2); // Dibuixa text a escala 2X display.setTextColor (BLAU); display.setCursor (5, 2); display.println ("BENVINGUTS A"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); retard (3000);
El client NTP s’inicialitza mitjançant la funció begin () per definir la data i l’hora des dels servidors NTP.
timeClient.begin ();
La funció Update () s’utilitza per rebre la data i l’hora sempre que ho sol·licitem als servidors NTP.
timeClient.update ();
La velocitat en bauds de 115200 està configurada per imprimir l’hora al monitor sèrie.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay són la funció de biblioteca i dóna l’hora, els minuts, els segons i el dia actuals des del servidor NTP. El codi següent s'utilitza per diferenciar el temps entre AM i PM. Si l'hora que obtenim amb getHours () és superior a 12, definim aquesta hora com PM, si no és AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int day = 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 day = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () s’utilitza get date en format “aaaa-mm-dd” des del servidor NTP. Aquesta funció dóna data i hora en format "aaaa-mm-dd T hh: mm: ss . Però només necessitem data, de manera que hem de dividir aquesta cadena que s'emmagatzema en format date_time fins a "T", que es fa mitjançant la funció substring () i després emmagatzemar la data en la variable "data" .
data_hora = horaClient.getFormattedDate (); int data_índex = data_hora.indexOf ("T"); Cadena data = data_hora.substring (0, data_índex); Serial.println (data); display.println (data); display.display ();
Així quedarà finalment el rellotge horari d’Internet OLED:

