RTC ili sat u stvarnom vremenu najčešće su korišteni moduli u elektronici i ugrađenim uređajima za praćenje vremena. Ali problem s RTC-om je taj što mikročipovi u računalima nisu toliko precizni i mogu pružiti samo vrijeme lokalnog uređaja. S druge strane, korištenje interneta za dohvaćanje vremena s NTP poslužitelja je bolje rješenje za dobivanje vremena jer je točnije i može pružiti vrijeme bilo kojem zemljopisnom području na svijetu. Potreban nam je samo Wi-Fi modul i pristup Internetu da bismo pomoću NTP poslužitelja dobili vrijeme bilo koje lokacije na svijetu. U ovom uputstvu koristit ćemo ESP8266 NodeMCU za dobivanje trenutnog vremena i datuma s NTP poslužitelja i prikaz na OLED zaslonu.
Mrežni protokol vremena (NTP)
NTP je jedan od najstarijih mrežnih internetskih protokola (IP) za sinkronizaciju satova između računalnih mreža. Dizajnirao ga je David L. Mills sa Sveučilišta u Delawareu 1981. Ovaj se protokol može koristiti za sinkronizaciju mnogih mreža s koordiniranim univerzalnim vremenom (UTC) u roku od nekoliko milisekundi. UTC je primarni vremenski standard kojim svijet regulira sat i vrijeme. UTC se ne mijenja i razlikuje se za različite zemljopisne lokacije. NTP koristi UTC kao vremensku referencu i pruža točno i sinkronizirano vrijeme na Internetu.
NTP radi na hijerarhijskom modelu klijent-poslužitelj. Vrhunski model ima referentne satove poznate kao "stratum0" poput atomskih satova, radio valova, GPS-a i GSM-a koji prima vrijeme sa satelita. Poslužitelji koji primaju vrijeme iz stratum0 nazivaju se "stratum1", a poslužitelji koji primaju vrijeme iz stratum1 "stratum2" i tako dalje. To se nastavlja i točnost vremena se smanjuje nakon svake faze. NTP automatski odabire najbolji od nekoliko dostupnih izvora vremena za sinkronizaciju što ga čini protokolom sposobnim za toleranciju kvarova.
Dakle, u ovom projektu dobivamo vrijeme od NTP poslužitelja pomoću ESP8266 NodeMCU i prikazujemo ga na OLED zaslonu. Ova ista vrsta internetskog sata izgrađena je upotrebom ESP32 u prethodnom vodiču.

ESP8266 može pristupiti NTP poslužiteljima putem interneta da bi dobio točno vrijeme. Ovdje NTP radi u načinu klijent-poslužitelj, ESP8266 radi kao klijentski uređaj i povezuje se s NTP poslužiteljima pomoću UDP-a (User Datagram Protocol). Klijent prenosi paket zahtjeva na NTP poslužitelje, a zauzvrat NTP šalje paket vremenske oznake koji se sastoji od podataka poput točnosti, vremenske zone, vremenske oznake UNIX itd. Tada klijent odvaja podatke o datumu i vremenu koji se mogu dalje koristiti u aplikacijama prema zahtjevu.
Komponente potrebne
- Jednobojni 7-pinski SSD1306 0.96 ”OLED zaslon
- ESP8266 NodeMCU
- Mikro USB kabel
- Breadboard
- Žice od muškog do muškog spona
Kružni dijagram i veze
Ovaj 7-pinski OLED zaslon komunicira s modulom ESP8266 pomoću SPI protokola, dolje su shema i tablica veza za spajanje OLED SPI igla s NodeMCU za prikaz internetskog vremena.

| Ne. | OLED zaslon | NodeMCU | 
| 1 | GND | GND | 
| 2 | VDD | 3,3 V | 
| 3 | SCK | D5 | 
| 4 | MOSI (SPI) ili SDA (I2C) | D7 | 
| 5 | PONOVNO PONAŠATI | D3 | 
| 6 | DC | D2 | 
| 7 | CS | D8 | 
Da biste saznali više o ovom monokromatskom 7-pinskom OLED zaslonu i njegovom povezivanju s ESP8266 NodeMCU, slijedite vezu.
Objašnjenje koda
Prvo moramo preuzeti i instalirati NTP knjižnicu u ESP8266. Za NTP klijenta dostupno je mnogo knjižnica. Bilo koji od njih možete instalirati iz Arduino IDE-a. U ovom uputstvu instalirao sam knjižnicu NTPClient tvrtke Taranais jer je jednostavan za upotrebu i ima funkcije za dobivanje datuma i vremena s NTP poslužitelja. ESP8266 NodeMCU lako se može programirati pomoću Arduino IDE-a.

Da biste instalirali NTP knjižnicu, prvo preuzmite knjižnicu pomoću gornje veze, a zatim je instalirajte pomoću Arduino IDE-a. Da biste ga instalirali, idite na Skica> Uključi biblioteku> Dodaj.ZIP biblioteku , a zatim otvorite mapu Zip odlaskom na mjesto gdje ste preuzeli zip mapu i ponovo pokrenite Arduino IDE.


NTPClient knjižnica dolazi s primjerima. Otvorite Arduino IDE i idite na Primjeri> NTPClient> Napredno . Kôd naveden u ovoj skici prikazuje vrijeme s NTP poslužitelja na serijskom monitoru. Ovu ćemo skicu koristiti za prikaz trenutnog vremena i datuma na OLED zaslonu.

Kompletni kôd dostupan je na kraju ovog vodiča, ovdje sam objasnio nekoliko važnih dijelova koda.
ESP8266WiFi knjižnica pruža ESP8266 specifične Wi-Fi rutine za povezivanje s mrežom. WiFiUDP.h rukuje slanjem i primanjem UDP paketa. Budući da koristimo SPI protokol za sučeljavanje OLED-a s NodeMCU, zato ćemo uvesti biblioteku “SPI.h”. A za OLED zaslon koriste se "Adafruit_GFX.h" i "Adafruit_SSD1306.h".
#include
Naša OLED veličina je 128x64, tako da širinu i visinu zaslona postavljamo na 128, odnosno 64. Dakle, definirajte varijable za OLED pinove povezane na NodeMCU za SPI komunikaciju.
#define SCREEN_WIDTH 128 // OLED širina zaslona, u pikselima #define SCREEN_HEIGHT 64 // OLED visina zaslona, u pikselima // Izjava za SSD1306 zaslon povezan softverskim SPI (zadani slučaj): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Zaslon Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Zamijenite "your_ssid" i "your_password" svojim Wi-Fi SSID-om i lozinkom u donjim retcima koda.
const char * ssid = "your_ssid"; const char * lozinka = "vaša_ lozinka";
Postavite WI-Fi vezu davanjem SSID-a i lozinke funkciji WiFi.begin . Povezivanju ESP8266 treba neko vrijeme da se poveže s NodeMCU, tako da moramo pričekati dok se ne poveže.
WiFi.begin (ssid, lozinka); while (WiFi.status ()! = WL_CONNECTED) { delay (500); Serial.print ("."); }
Da biste zatražili datum i vrijeme, inicijalizirajte vremenskog klijenta s adresom NTP poslužitelja. Za bolju točnost odaberite adresu NTP poslužitelja koji su u blizini vašeg zemljopisnog područja. Ovdje koristimo " pool.ntp.org " koji daje poslužitelje iz cijelog svijeta. Ako želite odabrati poslužitelje iz Azije, možete koristiti " asia.pool.ntp.org ". timeClient također uzima pomak UTC vremena u milisekundama vaše vremenske zone. Na primjer, UTC pomak za Indiju je +5: 30, pa taj pomak pretvaramo u milisekundama što je jednako 5 * 60 * 60 + 30 * 60 = 19800.
| Područje | Pomak UTC vremena (sati i minute) | UTC pomak vremena (u sekundama) | 
| INDIJA | +5: 30 | 19800 | 
| LONDON | 0:00 | 0 | 
| NEW YORK | -5: 00 | -18000 | 
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC je dan za interno generiranje 3.3V radi inicijalizacije zaslona. Kada se OLED pokrene, prikazuje se „ DOBRO DOŠLI U DIGEST KOLA “ s veličinom teksta 2 i bojom PLAVE 3 sekunde.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 dodjela nije uspjela")); za(;;); // Ne nastavljajte, petljajte zauvijek } display.clearDisplay (); display.setTextSize (2); // Nacrtajte tekstualni prikaz veličine 2X.setTextColor (PLAVI); display.setCursor (5, 2); display.println ("DOBRO DOŠLI U"); display.println ("KRUG"); display.println ("DIGEST"); display.display (); kašnjenje (3000);
NTP klijent se inicijalizira pomoću funkcije begin () za postavljanje datuma i vremena s NTP poslužitelja.
timeClient.begin ();
Funkcija Update () koristi se za primanje datuma i vremena kad god zatražimo NTP poslužitelje.
timeClient.update ();
Brzina prijenosa od 115200 postavljena je za ispis vremena na serijski monitor.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay su funkcija knjižnice i daje trenutni sat, minute, sekunde i dan s NTP poslužitelja. Kôd u nastavku koristi se za razlikovanje vremena između AM i PM. Ako je sat koji dobijemo pomoću getHours () veći od 12, tada to vrijeme postavljamo kao PM, a drugo je AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int dan = timeClient.getDay (); ako (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); prikaz.tisak (mm); display.print (":"); display.print (ss); display.println ("PM"); } else { display.print (hh); display.print (":"); prikaz.tisak (mm); display.print (":"); display.print (ss); display.println ("AM"); } int dan = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () koristi se datum dobivanja u “gggg-mm-dd” formatu s NTP poslužitelja. Ova funkcija daje datum i vrijeme u formatu “yyyy-mm-dd T hh: mm: ss formatu. Ali trebamo samo datum, tako da moramo podijeliti ovaj niz koji je pohranjen u formatu date_time do "T" što se vrši funkcijom substring (), a zatim spremiti datum u varijablu "date" .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); Niz niza = datum_vremena.supstring (0, datum_indeksa); Serial.println (datum); display.println (datum); display.display ();
Evo kako će konačno izgledati OLED Internet Time Clock:


