- Network Time Protocol (NTP)
- Componenti richiesti
- Schema elettrico e collegamenti
- Spiegazione del codice
RTC o Real Time Clock è il modulo più comunemente utilizzato nei dispositivi elettronici e incorporati per tenere traccia del tempo. Ma il problema con RTC è che i microchip nei computer non sono molto precisi e possono fornire solo l'ora del dispositivo locale. D'altra parte, l'utilizzo di Internet per recuperare l'ora dai server NTP è una soluzione migliore per ottenere l'ora in quanto è più preciso e può fornire l'ora di qualsiasi area geografica del mondo. Abbiamo solo bisogno di un modulo Wi-Fi e di un accesso a Internet per ottenere l'ora di qualsiasi luogo nel mondo utilizzando i server NTP. In questo tutorial, useremo ESP8266 NodeMCU per ottenere l'ora e la data correnti dai server NTP e visualizzarle sul display OLED.
Network Time Protocol (NTP)
NTP è uno dei più vecchi IP (Network Internet Protocol) per la sincronizzazione degli orologi tra le reti di computer. È stato progettato da David L. Mills dell'Università del Delaware nel 1981. Questo protocollo può essere utilizzato per sincronizzare molte reti con l' ora UTC (Coordinated Universal Time) in pochi millisecondi. L'UTC è lo standard temporale principale con cui il mondo regola l'orologio e l'ora. L'UTC non cambia e varia a seconda delle diverse località geografiche. NTP utilizza UTC come riferimento temporale e fornisce un orario preciso e sincronizzato su Internet.
NTP funziona su un modello client-server gerarchico. Il modello di punta ha orologi di riferimento noti come "stratum0" come orologi atomici, onde radio, GPS, GSM che riceve l'ora dal satellite. I server che ricevono l'ora da stratum0 sono chiamati "stratum1" e i server che ricevono l'ora da stratum1 sono chiamati "stratum2" e così via. Questo va avanti e la precisione del tempo continua a diminuire dopo ogni fase. NTP seleziona automaticamente la migliore delle diverse origini ora disponibili per la sincronizzazione, il che lo rende un protocollo in grado di tollerare i guasti.
Quindi qui in questo progetto, stiamo ottenendo il tempo dal server NTP utilizzando ESP8266 NodeMCU e mostrandolo sul display OLED. Questo stesso tipo di orologio Internet è stato creato utilizzando ESP32 nel tutorial precedente.
ESP8266 può accedere ai server NTP utilizzando Internet per ottenere l'ora esatta. Qui NTP funziona in modalità client-server, ESP8266 funziona come dispositivo client e si connette ai server NTP utilizzando UDP (User Datagram Protocol). Il client trasmette un pacchetto di richiesta ai server NTP e in cambio NTP invia un pacchetto di timestamp che consiste di informazioni come accuratezza, fuso orario, timestamp UNIX ecc. Quindi il client separa i dettagli di data e ora che possono essere ulteriormente utilizzati nelle applicazioni in base alle esigenze.
Componenti richiesti
- Display OLED SSD1306 da 0,96 pollici monocromatico a 7 pin
- ESP8266 NodeMCU
- Cavo micro USB
- Breadboard
- Cavi ponticello maschio a maschio
Schema elettrico e collegamenti
Questo display OLED a 7 pin comunica con il modulo ESP8266 utilizzando il protocollo SPI, di seguito sono riportati lo schema del circuito e la tabella dei collegamenti per collegare i pin OLED SPI con NodeMCU per visualizzare l'ora di Internet.
No. |
Display OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) o SDA (I2C) |
D7 |
5 |
RIPRISTINA |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Per saperne di più su questo display OLED monocromatico a 7 pin e sulla sua interfaccia con ESP8266 NodeMCU, segui il link.
Spiegazione del codice
Per prima cosa dobbiamo scaricare e installare la libreria NTP in ESP8266. Sono disponibili molte librerie per client NTP. Puoi installarne uno qualsiasi dall'IDE di Arduino. In questo tutorial ho installato la libreria NTPClient di Taranais perché è facile da usare e dispone di funzioni per ottenere data e ora dai server NTP. ESP8266 NodeMCU può essere facilmente programmato utilizzando Arduino IDE.
Per installare la libreria NTP, scarica prima la libreria usando il link sopra e poi installala usando l'IDE di Arduino. Per installarlo vai su Sketch> Includi libreria> Aggiungi libreria.ZIP , quindi apri la cartella Zip andando nella posizione in cui hai scaricato la cartella zip e riavvia l'IDE di Arduino.
La libreria NTPClient viene fornita con esempi. Apri l'IDE di Arduino e vai agli esempi> NTPClient> Avanzate . Il codice fornito in questo schizzo mostra l'ora dal server NTP sul monitor seriale. Useremo questo schizzo per visualizzare l'ora e la data correnti sul display OLED.
Il codice completo è disponibile alla fine di questo tutorial, qui ho spiegato alcune parti importanti del codice.
La libreria ESP8266WiFi fornisce routine Wi-Fi specifiche per ESP8266 per la connessione alla rete. WiFiUDP.h gestisce l'invio e la ricezione di pacchetti UDP. Poiché stiamo utilizzando il protocollo SPI per interfacciare OLED con NodeMCU, importeremo la libreria "SPI.h". E "Adafruit_GFX.h" e "Adafruit_SSD1306.h" sono utilizzati per il display OLED.
#includere
La nostra dimensione OLED è 128x64, quindi stiamo impostando la larghezza e l'altezza dello schermo rispettivamente su 128 e 64. Quindi definire le variabili per i pin OLED collegati a NodeMCU per la comunicazione SPI.
#define SCREEN_WIDTH 128 // Larghezza display OLED, in pixel #define SCREEN_HEIGHT 64 // Altezza display OLED, in pixel // Dichiarazione per display SSD1306 connesso tramite software SPI (caso predefinito): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Display Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Sostituisci "your_ssid" e "your_password" con il tuo SSID Wi-Fi e la password nelle seguenti righe di codice.
const char * ssid = "tuo_ssid"; const char * password = "tua_password";
Configurare la connessione WI-Fi fornendo SSID e password alla funzione WiFi.begin . La connessione di ESP8266 richiede un po 'di tempo per connettersi a NodeMCU, quindi dobbiamo aspettare finché non si connette.
WiFi.begin (ssid, password); while (WiFi.status ()! = WL_CONNECTED) { ritardo (500); Serial.print ("."); }
Per richiedere data e ora, inizializza il client dell'ora con l'indirizzo dei server NTP. Per una maggiore precisione, scegli l'indirizzo dei server NTP vicini alla tua area geografica. Qui usiamo " pool.ntp.org " che fornisce server da tutto il mondo. Se desideri scegliere server asiatici, puoi utilizzare " asia.pool.ntp.org ". timeClient rileva anche l'offset dell'ora UTC in millisecondi del fuso orario. Ad esempio, l' offset UTC per l'India è +5: 30 quindi convertiamo questo offset in millisecondi che è uguale a 5 * 60 * 60 + 30 * 60 = 19800.
La zona |
Differenza di ora UTC (ore e minuti) |
Differenza di ora UTC (secondi) |
INDIA |
+5: 30 |
19800 |
LONDRA |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC viene fornito per generare 3,3 V internamente per inizializzare il display. Quando l'OLED si avvia, visualizza " WELCOME TO CIRCUIT DIGEST " con testo di dimensione 2 e colore BLU per 3 secondi.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 allocation failed")); per(;;); // Non procedere, loop per sempre } display.clearDisplay (); display.setTextSize (2); // Disegna display.setTextColor di testo in scala 2X (BLU); display.setCursor (5, 2); display.println ("BENVENUTO"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); ritardo (3000);
Il client NTP viene inizializzato utilizzando la funzione begin () per impostare la data e l'ora dai server NTP.
timeClient.begin ();
La funzione Update () viene utilizzata per ricevere la data e l'ora ogni volta che ne facciamo richiesta ai server NTP.
timeClient.update ();
Il baud rate di 115200 è impostato per stampare l'ora sul monitor seriale.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay sono la funzione di libreria e fornisce l'ora, i minuti, i secondi e il giorno correnti dal server NTP. Il codice riportato di seguito viene utilizzato per differenziare l'ora tra AM e PM. Se l'ora che otteniamo utilizzando getHours () è maggiore di 12, impostiamo quell'ora come PM altrimenti è AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int giorno = timeClient.getDay (); se (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("PM"); } altro { 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 () viene utilizzato per ottenere la data nel formato "aaaa-mm-gg" dal server NTP. Questa funzione fornisce la data e l'ora nel formato “aaaa-mm-gg T hh: mm: ss . Ma abbiamo bisogno solo della data, quindi dobbiamo dividere questa stringa che è memorizzata nel formato date_time fino a "T" che viene eseguita dalla funzione substring () e quindi memorizzare la data nella variabile "date" .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); String date = date_time.substring (0, index_date); Serial.println (data); display.println (data); display.display ();
Ecco come apparirà finalmente l' orologio OLED Internet time: