RTC arba realaus laiko laikrodis yra dažniausiai naudojamas elektronikos ir įterptųjų įrenginių modulis laiko sekimui. Tačiau RTC problema yra ta, kad kompiuterių lustai nėra tokie tikslūs ir jie gali pateikti tik vietinio įrenginio laiką. Kita vertus, interneto naudojimas norint gauti laiką iš NTP serverių yra geresnis sprendimas norint gauti laiko, nes jis yra tikslesnis ir gali pateikti bet kurios pasaulio geografinės vietovės laiką. Mums reikia tik „Wi-Fi“ modulio ir prieigos prie interneto, kad gautume laiko bet kurioje pasaulio vietoje, naudodami NTP serverius. Šioje pamokoje mes naudosime ESP8266 „NodeMCU“, kad gautume dabartinį laiką ir datą iš NTP serverių ir rodytume jį OLED ekrane.
Tinklo laiko protokolas (NTP)
NTP yra vienas seniausių tinklo interneto protokolo (IP), skirtas laikrodžiams sinchronizuoti tarp kompiuterių tinklų. Jį sukūrė Davidas L. Millsas iš Delavero universiteto 1981 m. Šis protokolas gali būti naudojamas daugelio tinklų sinchronizavimui su koordinuotu pasauliniu laiku (UTC) per kelias milisekundes. UTC yra pagrindinis laiko standartas, pagal kurį pasaulis reguliuoja laikrodį ir laiką. UTC nesikeičia ir nesikeičia skirtingose geografinėse vietose. NTP kaip laiko atskaitos tašką naudoja UTC ir pateikia tikslų bei sinchronizuotą laiką internete.
NTP veikia pagal hierarchinį kliento-serverio modelį. Aukščiausiame modelyje yra pamatiniai laikrodžiai, vadinami „stratum0“, pavyzdžiui, atominiai laikrodžiai, radijo bangos, GPS, GSM, kurie gauna laiką iš palydovo. Serveriai, gaunantys laiką iš 0 sluoksnio, vadinami „stratum1“, o serveriai, gaunantys laiką iš „Stratum1“, vadinami „stratum2“ ir pan. Tai tęsiasi, o laiko tikslumas po kiekvieno etapo mažėja. NTP automatiškai parenka geriausius iš kelių galimų sinchronizuoti laiko šaltinių, todėl protokolas yra atsparus gedimams.
Taigi šiame projekte mes gauname laiko iš NTP serverio naudodami ESP8266 NodeMCU ir parodydami jį OLED ekrane. Tas pats interneto laikrodis sukurtas naudojant ESP32 ankstesnėje mokymo programoje.
ESP8266 gali pasiekti NTP serverius naudodamas internetą, kad gautų tikslų laiką. Čia NTP veikia kliento-serverio režimu, ESP8266 veikia kaip kliento įrenginys ir jungiasi su NTP serveriais naudodamas UDP („User Datagram Protocol“). Klientas perduoda užklausos paketą į NTP serverius ir mainais į NTP siunčia laiko žymos paketą, kurį sudaro tokia informacija kaip tikslumas, laiko juosta, UNIX laiko žymė ir kt. Tada klientas atskiria datos ir laiko detales, kurios gali būti toliau naudojamos programose pagal reikalavimą.
Būtini komponentai
- Vienspalvis 7 kontaktų SSD1306 0,96 ”OLED ekranas
- ESP8266 „NodeMCU“
- Mikro USB laidas
- Bandomoji Lenta
- Vyriškas - vyriškas džemperio laidai
Grandinės schema ir jungtys
Šis 7 kontaktų OLED ekranas bendrauja su ESP8266 moduliu naudodamas SPI protokolą. Žemiau pateikiama grandinės schema ir jungčių lentelė, skirta OLED SPI kaiščiams sujungti su „NodeMCU“, kad būtų rodomas interneto laikas.
Nr. |
OLED ekranas |
„NodeMCU“ |
1 |
BND |
BND |
2 |
VDD |
3.3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) arba SDA (I2C) |
D7 |
5 |
ATSTATYTI |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Norėdami sužinoti daugiau apie nespalvotą 7 kontaktų OLED ekraną ir jo sąsają su ESP8266 NodeMCU, spustelėkite nuorodą.
Kodo paaiškinimas
Pirmiausia turime atsisiųsti ir įdiegti NTP biblioteką į ESP8266. NTP klientui yra daugybė bibliotekų. Bet kurį iš jų galite įdiegti iš „Arduino IDE“. Šioje pamokoje aš įdiegiau „Taranais“ NTPClient biblioteką, nes ją lengva naudoti ir yra funkcijų, kad gautumėte datą ir laiką iš NTP serverių. ESP8266 „NodeMCU“ galima lengvai užprogramuoti naudojant „Arduino IDE“.
Norėdami įdiegti NTP biblioteką, pirmiausia atsisiųskite biblioteką naudodami aukščiau esančią nuorodą, tada įdiekite ją naudodami „Arduino IDE“. Norėdami jį įdiegti, eikite į „ Eskizas“> „Įtraukti biblioteką“> „Pridėti.ZIP biblioteką“ , tada atidarykite aplanką „Zip“, eidami į vietą, kurioje atsisiuntėte „zip“ aplanką, ir iš naujo paleiskite „Arduino IDE“.
NTPClient bibliotekoje pateikiami pavyzdžiai. Atidarykite „Arduino IDE“ ir „ Goto Pavyzdžiai“> „NTPClient“> „Advanced“ . Šiame eskize pateiktas kodas rodo laiką iš NTP serverio serijiniame monitoriuje. Šį eskizą naudosime dabartiniam laikui ir datai rodyti OLED ekrane.
Pilnas kodas yra šios pamokos pabaigoje, čia aš paaiškinau keletą svarbių kodo dalių.
„ESP8266WiFi“ biblioteka teikia ESP8266 specifines „Wi-Fi“ rutinas prisijungti prie tinklo. „WiFiUDP.h“ tvarko UDP paketų siuntimą ir priėmimą. Kadangi OLED sąsajai su „NodeMCU“ naudojame SPI protokolą, importuosime „SPI.h“ biblioteką. OLED ekranui naudojami „Adafruit_GFX.h“ ir „Adafruit_SSD1306.h“.
# įtraukti
Mūsų OLED dydis yra 128x64, todėl ekrano plotį ir aukštį nustatome atitinkamai 128 ir 64. Taigi apibrėžkite OLED kaiščių, sujungtų su „NodeMCU“, kintamuosius SPI ryšiui.
#define screen_width 128 // OLED ekranas plotis pikseliais #define screen_height 64 // OLED ekranas aukštis, pikseliais // deklaracija SSD1306 ekrane prijungtas naudojant programinę įrangą SPI (numatytoji sąlygomis): # define OLED_MOSI D7 # define OLED_CLK D5 # define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
„Adafruit_SSD1306“ ekranas (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Žemiau esančiose kodo eilutėse pakeiskite „your_ssid“ ir „your_password“ savo „Wi-Fi“ SSID ir slaptažodžiu.
const char * ssid = "tavo_sidas"; const char * password = "jūsų slaptažodis";
Nustatykite WI-Fi ryšį suteikdami SSID ir slaptažodį funkcijai „ WiFi.begin“ . Norint prisijungti prie „NodeMCU“, reikia šiek tiek laiko prisijungti prie ESP8266, todėl turime palaukti, kol jis bus prijungtas.
„WiFi.begin“ (ssid, slaptažodis); while (WiFi.status ()! = WL_CONNECTED) { delsa (500); Serijinis spaudinys ("."); }
Norėdami paprašyti datos ir laiko, inicijuokite laiko klientą nurodydami NTP serverių adresą. Norėdami gauti didesnį tikslumą, pasirinkite NTP serverių, kurie yra arti jūsų geografinės vietovės, adresą. Čia mes naudojame „ pool.ntp.org “, kuris teikia serverius iš viso pasaulio. Jei norite pasirinkti serverius iš Azijos, galite naudoti „ asia.pool.ntp.org “. „timeClient“ taip pat laiko UTC laiko poslinkį jūsų laiko juostos milisekundėmis. Pavyzdžiui, Indijos UTC poslinkis yra +5: 30, todėl mes perskaičiuojame šį poslinkį milisekundėmis, kuris yra lygus 5 * 60 * 60 + 30 * 60 = 19800.
Plotas |
UTC laiko poslinkis (valandomis ir minutėmis) |
UTC laiko poslinkis (sekundėmis) |
INDIJA |
+5: 30 |
19800 m |
LONDONAS |
0:00 |
0 |
NIUJORKAS |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC yra skirtas generuoti 3,3 V viduje, kad būtų galima inicijuoti ekraną. Kai paleidžiama OLED, 3 sekundes rodoma „ WELCOME TO CIRCUIT DIGEST “ su 2 dydžio teksto spalva ir mėlyna spalva.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 paskirstymas nepavyko")); dėl(;;); // Negalima tęsti, ciklas amžinai } display.clearDisplay (); display.setTextSize (2); // Nubrėžkite 2X mastelio teksto ekraną.setTextColor (MĖLYNA); display.setCursor (5, 2); display.println („SVEIKI ATVYK TO“); display.println ("CIRCUIT"); display.println („DIGEST“); display.display (); vėlavimas (3000);
NTP klientas inicijuojamas naudojant pradžią (), kad nustatytumėte datą ir laiką iš NTP serverių.
timeClient.begin ();
Funkcija „ Update ()“ naudojama gauti datą ir laiką, kai tik prašome NTP serverių.
timeClient.update ();
115200 perdavimo sparta nustatyta, kad laikas būtų spausdinamas serijiniame monitoriuje.
Serijos pradžia (115200); Serial.println (timeClient.getFormattedTime ());
„getHours“ (), „getMinutes“ (), „getSeconds“ (), „getDay“ yra bibliotekos funkcija ir nurodo dabartinę valandą, minutes, sekundes ir dieną iš NTP serverio. Žemiau pateiktas kodas naudojamas norint atskirti laiką nuo ryto iki ryto. Jei valanda, kurią gauname naudodamiesi „ getHours“ (), yra didesnė nei 12, mes nustatome tą laiką kaip PM, o ne prieš tai.
int hh = laikasKlientas.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int diena = timeClient.getDay (); jei (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 diena = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () naudojamas gauti datą „MMMM-mm-dd“ formatu iš NTP serverio. Ši funkcija pateikia datą ir laiką „mmmm-mm-dd T hh: mm: ss formatu. Bet mums reikia tik datos, todėl šią eilutę, saugomą „ date_time“ formatu, turime padalyti iki „T“, kurią atlieka funkcija „ Substring“ (), tada išsaugokite datą kintamajame „data“ .
date_time = timeClient.getFormattedDate (); int indeksas_data = data_laikas.indexOf ("T"); Stygos data = date_time.substring (0, index_date); Serial.println (data); display.println (data); display.display ();
Tai kaip OLED Interneto laikrodis atrodys pagaliau: