- Network Time Protocol (NTP)
- Componente necesare
- Diagrama circuitului și conexiunile
- Explicarea codului
RTC sau Ceas în timp real este cel mai frecvent utilizat modul în electronică și dispozitive încorporate pentru a ține evidența timpului. Dar problema cu RTC este că microcipurile din computere nu sunt atât de exacte și pot furniza doar ora dispozitivului local. Pe de altă parte, utilizarea internetului pentru preluarea timpului de pe serverele NTP este o soluție mai bună pentru obținerea timpului, deoarece este mai precisă și poate oferi ora oricărei zone geografice din lume. Avem nevoie doar de un modul Wi-Fi și de acces la internet pentru a obține timpul din orice locație din lume utilizând servere NTP. În acest tutorial, vom folosi ESP8266 NodeMCU pentru a obține ora și data curente de pe serverele NTP și le vom afișa pe afișajul OLED.
Network Time Protocol (NTP)
NTP este unul dintre cele mai vechi Protocol de Internet (IP) de rețea pentru sincronizarea ceasurilor între rețelele de calculatoare. A fost proiectat de David L. Mills de la Universitatea din Delaware în 1981. Acest protocol poate fi utilizat pentru a sincroniza mai multe rețele cu timpul universal coordonat (UTC) în câteva milisecunde. UTC este principalul standard de timp prin care lumea reglează ceasul și ora. UTC nu se modifică și nu variază în funcție de locațiile geografice diferite. NTP folosește UTC ca referință de timp și oferă timp precis și sincronizat pe internet.
NTP funcționează pe un model ierarhic client-server. Modelul de top are ceasuri de referință cunoscute sub numele de „stratum0”, cum ar fi ceasuri atomice, unde radio, GPS, GSM care primește timp de la satelit. Serverele care primesc timp de la stratum0 sunt numite „stratum1” și serverele care primesc timp de la stratum1 sunt numite „stratum2” și așa mai departe. Acest lucru continuă și precizia timpului continuă să scadă după fiecare etapă. NTP selectează automat cea mai bună dintre mai multe surse de timp disponibile pentru sincronizare, ceea ce îl face protocolul capabil să tolereze defectele.
Deci, aici, în acest proiect, obținem timp de la serverul NTP folosind ESP8266 NodeMCU și îl afișăm pe afișajul OLED. Același tip de ceas de internet este construit utilizând ESP32 în tutorialul anterior.
ESP8266 poate accesa servere NTP folosind internet pentru a obține ora exactă. Aici NTP funcționează în modul client-server, ESP8266 funcționează ca dispozitiv client și se conectează cu serverele NTP utilizând UDP (User Datagram Protocol). Clientul transmite un pachet de cerere către serverele NTP și, în schimb, NTP trimite un pachet de marcaj de timp care constă în informații precum acuratețe, fus orar, marcaj de timp UNIX etc. Apoi clientul separă data și ora detaliile care pot fi utilizate în continuare în aplicații în funcție de cerință.
Componente necesare
- Afișaj OLED monocrom cu 7 pini SSD1306 0,96 ”
- ESP8266 NodeMCU
- Cablu micro USB
- Breadboard
- Fire de la bărbați la bărbați
Diagrama circuitului și conexiunile
Acest afișaj OLED cu 7 pini comunică cu modulul ESP8266 utilizând protocolul SPI, mai jos sunt schema de circuit și tabelul de conexiuni pentru a conecta pinii OLED SPI cu NodeMCU pentru a afișa ora Internetului.
Nu. |
Afișaj OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) sau SDA (I2C) |
D7 |
5 |
RESET |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Pentru a afla mai multe acest afișaj OLED monocrom cu 7 pini și interfața acestuia cu ESP8266 NodeMCU, urmați linkul.
Explicarea codului
Mai întâi trebuie să descărcăm și să instalăm biblioteca NTP în ESP8266. Există multe biblioteci disponibile pentru clientul NTP. Puteți instala oricare dintre acestea din Arduino IDE. În acest tutorial am instalat biblioteca NTPClient de către Taranais, deoarece este ușor de utilizat și are funcții pentru a obține data și ora de pe serverele NTP. ESP8266 NodeMCU poate fi programat cu ușurință utilizând Arduino IDE.
Pentru a instala biblioteca NTP, descărcați mai întâi biblioteca utilizând linkul de mai sus și apoi instalați-o utilizând Arduino IDE. Pentru a-l instala, accesați Sketch> Include Library> Add.ZIP Library , apoi deschideți folderul Zip accesând locația în care ați descărcat folderul zip și reporniți ID-ul Arduino.
Biblioteca NTPClient vine cu exemple. Deschideți exemple Arduino IDE și Goto> NTPClient> Advanced . Codul dat în această schiță afișează ora de pe serverul NTP pe monitorul serial. Vom folosi această schiță pentru a afișa ora și data curente pe afișajul OLED.
Codul complet este disponibil la sfârșitul acestui tutorial, aici am explicat câteva părți importante ale codului.
Biblioteca ESP8266WiFi oferă rutine Wi-Fi specifice ESP8266 pentru conectarea la rețea. WiFiUDP.h se ocupă de trimiterea și primirea pachetelor UDP. Deoarece folosim protocolul SPI pentru a interfața OLED cu NodeMCU, vom importa biblioteca „SPI.h”. Și „Adafruit_GFX.h” și „Adafruit_SSD1306.h” sunt utilizate pentru afișajul OLED.
#include
Dimensiunea noastră OLED este de 128x64, deci setăm lățimea și înălțimea ecranului ca 128 și respectiv 64. Deci, definiți variabilele pentru pinii OLED conectați la NodeMCU pentru comunicarea SPI.
#define SCREEN_WIDTH 128 // OLED lățime de afișare, în pixeli #define SCREEN_HEIGHT 64 // OLED înălțime de afișare, în pixeli // Declarație pentru afișare SSD1306 conectat folosind software - ul SPI (caz implicit): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Afișaj Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Înlocuiți „your_ssid” și „your_password” cu SSID și parolă Wi-Fi în rândurile de cod de mai jos.
const char * ssid = "your_ssid"; const char * password = "parola_dvs";
Configurați conexiunea WI-Fi dând SSID și parolă funcției WiFi.begin . Conexiunea ESP8266 durează ceva timp pentru a vă conecta la NodeMCU, așa că trebuie să așteptăm până când se conectează.
WiFi.begin (ssid, parolă); while (WiFi.status ()! = WL_CONNECTED) { întârziere (500); Serial.print ("."); }
Pentru a solicita data și ora, inițializați ora clientului cu adresa serverelor NTP. Pentru o precizie mai bună, alegeți adresa serverelor NTP care sunt aproape de zona geografică. Aici folosim „ pool.ntp.org ” care oferă servere din întreaga lume. Dacă doriți să alegeți servere din Asia, puteți folosi „ asia.pool.ntp.org ”. timeClient ia, de asemenea, decalarea timpului UTC în milisecunde din fusul orar. De exemplu, decalajul UTC pentru India este +5: 30, deci convertim acest decalaj în milisecunde, care este egal cu 5 * 60 * 60 + 30 * 60 = 19800.
Zonă |
Decalaj orar UTC (ore și minute) |
Offset timp UTC (secunde) |
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 este dat pentru a genera 3.3V intern pentru a inițializa afișajul. Când pornește OLED, afișează „ BINE AȚI VENIT LA CIRCUIT DIGEST ” cu dimensiunea textului 2 și culoarea ALBASTRU timp de 3 secunde.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("Alocarea SSD1306 a eșuat")); pentru(;;); // Nu continuați, buclați pentru totdeauna } display.clearDisplay (); display.setTextSize (2); // Desenați textul la scară 2X display.setTextColor (ALBASTRU); display.setCursor (5, 2); display.println ("BINE ATI VENIT LA"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); întârziere (3000);
Clientul NTP este inițializat utilizând funcția begin () pentru a seta data și ora de pe serverele NTP.
timeClient.begin ();
Funcția Update () este utilizată pentru a primi data și ora ori de câte ori solicităm serverelor NTP.
timeClient.update ();
Rata de transmisie de 115200 este setată pentru a imprima ora pe monitorul serial.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay sunt funcția de bibliotecă și oferă ora, minutele, secundele și ziua curente de pe serverul NTP. Codul de mai jos este utilizat pentru a diferenția timpul între AM și PM. Dacă ora pe care o primim folosind getHours () este mai mare de 12, atunci setăm acel timp ca PM altfel AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int day = timeClient.getDay (); if (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 () este folosit get date în format „aaaa-ll-zz” de pe serverul NTP. Această funcție oferă data și ora în format „aaaa-ll-zz T hh: mm: ss . Dar avem nevoie doar de dată, așa că trebuie să împărțim acest șir care este stocat în format date_time până la „T”, care se realizează prin funcția substring () și apoi stocăm data în variabila „dată” .
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 ();
Acesta este modul în care va arăta în cele din urmă ceasul de timp OLED pentru Internet: