- Tīkla laika protokols (NTP)
- Nepieciešamās sastāvdaļas
- Shēmas shēma un savienojumi
- Kods Paskaidrojums
RTC jeb reālā laika pulkstenis ir elektronikā un iegultās ierīcēs visbiežāk izmantotais modulis laika uzskaitei. Bet RTC problēma ir tāda, ka datoru mikroshēmas nav tik precīzas, un tās var nodrošināt tikai vietējās ierīces laiku. No otras puses, interneta izmantošana laika iegūšanai no NTP serveriem ir labāks risinājums laika iegūšanai, jo tas ir precīzāks un var nodrošināt jebkura pasaules ģeogrāfiskā apgabala laiku. Mums vienkārši nepieciešams Wi-Fi modulis un piekļuve internetam, lai iegūtu laiku no jebkuras vietas pasaulē, izmantojot NTP serverus. Šajā apmācībā mēs izmantosim ESP8266 NodeMCU, lai iegūtu pašreizējo laiku un datumu no NTP serveriem un parādītu to OLED displejā.
Tīkla laika protokols (NTP)
NTP ir viens no vecākajiem tīkla interneta protokoliem (IP) pulksteņu sinhronizēšanai starp datortīkliem. To 1981. gadā izstrādāja Deivids L. Mills no Delaveras universitātes. Šo protokolu var izmantot, lai dažu milisekunžu laikā daudzus tīklus sinhronizētu ar koordinēto pasaules laiku (UTC). UTC ir galvenais laika standarts, pēc kura pasaule regulē pulksteni un laiku. UTC dažādās ģeogrāfiskajās vietās nemainās un nemainās. NTP kā laika atskaiti izmanto UTC un nodrošina precīzu un sinhronizētu laiku visā internetā.
NTP darbojas pēc hierarhiska klienta-servera modeļa. Top modelim ir atsauces pulksteņi, kas pazīstami kā “stratum0”, piemēram, atomu pulksteņi, radioviļņi, GPS, GSM, kas saņem laiku no satelīta. Serveri, kas saņem laiku no 0 slāņa, tiek saukti par “stratum1”, bet serveri, kas saņem laiku no 1. stratum, tiek saukti par “stratum2” utt. Pēc katra posma tas turpinās, un laika precizitāte samazinās. NTP automātiski izvēlas labāko no vairākiem pieejamajiem sinhronizējamajiem laika avotiem, kas padara to pret kļūdām izturīgu protokolu.
Tātad, šajā projektā mēs iegūstam laiku no NTP servera, izmantojot ESP8266 NodeMCU, un parādām to OLED displejā. Šāda veida interneta pulkstenis tiek veidots, izmantojot ESP32 iepriekšējā apmācībā.
ESP8266 var piekļūt NTP serveriem, izmantojot internetu, lai iegūtu precīzu laiku. Šeit NTP darbojas klienta-servera režīmā, ESP8266 darbojas kā klienta ierīce un izveido savienojumu ar NTP serveriem, izmantojot UDP (User Datagram Protocol). Klients nosūta pieprasījumu paketi uz NTP serveriem un pretī NTP nosūta laika zīmoga paketi, kas sastāv no tādas informācijas kā precizitāte, laika josla, UNIX laika zīmogs utt. Pēc tam klients atdala datuma un laika detaļas, kuras var tālāk izmantot lietojumprogrammās atbilstoši prasībām.
Nepieciešamās sastāvdaļas
- Vienkrāsains 7 kontaktu SSD1306 0,96 ”OLED displejs
- ESP8266 NodeMCU
- Mikro USB kabelis
- Maizes dēlis
- Vīriešu un vīriešu džemperu vadi
Shēmas shēma un savienojumi
Šis 7 kontaktu OLED displejs sazinās ar ESP8266 moduli, izmantojot SPI protokolu. Zemāk ir shēma un savienojumu tabula, lai savienotu OLED SPI tapas ar NodeMCU, lai parādītu interneta laiku.
Nē. |
OLED displejs |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) vai SDA (I2C) |
D7 |
5 |
ATIESTATĪT |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Lai uzzinātu vairāk par šo vienkrāsaino 7-pin OLED displeju un tā saskarni ar ESP8266 NodeMCU, sekojiet saitei.
Kods Paskaidrojums
Vispirms mums ir jālejupielādē un jāinstalē NTP bibliotēka ESP8266. NTP klientam ir pieejamas daudzas bibliotēkas. Jebkuru no tiem varat instalēt no Arduino IDE. Šajā apmācībā esmu instalējis Taranais NTPClient bibliotēku, jo to ir viegli izmantot un tai ir funkcijas, lai iegūtu datumu un laiku no NTP serveriem. ESP8266 NodeMCU var viegli ieprogrammēt, izmantojot Arduino IDE.
Lai instalētu NTP bibliotēku, vispirms lejupielādējiet bibliotēku, izmantojot iepriekš norādīto saiti, un pēc tam instalējiet to, izmantojot Arduino IDE. Lai to instalētu, dodieties uz Skice> Iekļaut bibliotēku> Pievienot.ZIP bibliotēku , pēc tam atveriet mapi Zip, dodoties uz vietu, kur esat lejupielādējis zip mapi, un restartējiet Arduino IDE.
NTPClient bibliotēka nāk ar piemēriem. Atveriet Arduino IDE un Goto piemēri> NTPClient> Advanced . Šajā skicē dotais kods sērijveida monitorā parāda laiku no NTP servera. Mēs izmantosim šo skici, lai parādītu pašreizējo laiku un datumu OLED displejā.
Pilns kods ir pieejams šīs apmācības beigās, šeit es esmu izskaidrojis dažas svarīgas koda daļas.
ESP8266WiFi bibliotēka nodrošina ESP8266 specifiskas Wi-Fi rutīnas, lai izveidotu savienojumu ar tīklu. WiFiUDP.h apstrādā UDP paku sūtīšanu un saņemšanu. Tā kā OLED saskarnei ar NodeMCU izmantojam SPI protokolu, mēs importēsim bibliotēku “SPI.h”. OLED displejam tiek izmantoti “Adafruit_GFX.h” un “Adafruit_SSD1306.h”.
# iekļaut
Mūsu OLED izmērs ir 128x64, tāpēc mēs iestatām ekrāna platumu un augstumu attiecīgi 128 un 64. Tātad definējiet mainīgos OLED tapām, kas savienotas ar NodeMCU SPI komunikācijai.
#define SCREEN_WIDTH 128 // OLED displeja platums pikseļos #define SCREEN_HEIGHT 64 // OLED displeja augstums pikseļos // Deklarācija SSD1306 displejam, kas savienots, izmantojot programmatūras SPI (noklusējuma gadījums): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Adafruit_SSD1306 displejs (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Zemāk esošajās koda rindiņās aizstājiet “your_ssid” un “your_password” ar savu Wi-Fi SSID un paroli.
const char * ssid = "tavs_sīds"; const char * password = "tavs_parole";
Iestatiet WI-Fi savienojumu, piešķirot SSID un paroli funkcijai WiFi.begin . ESP8266 savienojumam nepieciešams zināms laiks, lai izveidotu savienojumu ar NodeMCU, tāpēc mums jāgaida, kamēr tas tiks izveidots.
WiFi.begin (ssid, parole); while (WiFi.status ()! = WL_CONNECTED) { aizkave (500); Sērijas.druka ("."); }
Lai pieprasītu datumu un laiku, inicializējiet laika klientu ar NTP serveru adresi. Lai iegūtu labāku precizitāti, izvēlieties NTP serveru adresi, kas atrodas tuvu jūsu ģeogrāfiskajam apgabalam. Šeit mēs izmantojam “ pool.ntp.org ”, kas sniedz serverus no visas pasaules. Ja vēlaties izvēlēties serverus no Āzijas, varat izmantot “ Asia.pool.ntp.org ”. timeClient ņem arī UTC laika nobīdi jūsu laika joslas milisekundēs. Piemēram, Indijas UTC nobīde ir +5: 30, tāpēc šo nobīdi konvertējam milisekundēs, kas ir vienāda ar 5 * 60 * 60 + 30 * 60 = 19800.
Platība |
UTC laika nobīde (stundas un minūtes) |
UTC laika nobīde (sekundēs) |
INDIJA |
+5: 30 |
19800 |
LONDONA |
0:00 |
0 |
ŅUJORKA |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC tiek dots, lai iekšēji ģenerētu 3,3 V, lai inicializētu displeju. Kad OLED sāk darboties, uz 3 sekundēm tiek parādīts uzraksts “ WELCOME TO CIRCUIT DIGEST ” ar teksta 2. izmēru un krāsu ZILA.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 piešķiršana neizdevās")); priekš(;;); // neturpiniet, cilpa uz visiem laikiem } display.clearDisplay (); display.setTextSize (2); // Zīmējiet 2X mēroga teksta displeju.setTextColor (ZILS); display.setCursor (5, 2); display.println ("Laipni lūdzam"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); kavēšanās (3000);
NTP klients tiek inicializēts, izmantojot sākuma () funkciju, lai iestatītu datumu un laiku no NTP serveriem.
timeClient.begin ();
Funkcija Update () tiek izmantota, lai saņemtu datumu un laiku, kad mēs to pieprasām NTP serveriem.
timeClient.update ();
Buda ātrums 115200 ir iestatīts laika drukāšanai uz sērijveida monitora.
Sērijas sākums (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay ir bibliotēkas funkcija un dod pašreizējo stundu, minūtes, sekundes un dienu no NTP servera. Tālāk redzamais kods tiek izmantots, lai atšķirtu laiku no rīta plkst. Ja stunda, kuru mēs iegūstam, izmantojot getHours (), ir lielāka par 12, tad mēs šo laiku iestatām kā PM, tā ir tā AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int diena = timeClient.getDay (); ja (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_dienas +" "");
getFormattedDate () tiek izmantots datuma iegūšanas formāts “gggg-mm-dd” no NTP servera. Šī funkcija norāda datumu un laiku formātā “gggg-mm-dd T hh: mm: ss . Bet mums ir nepieciešams tikai datums, tāpēc mums ir jāsadala šī virkne, kas tiek saglabāta datuma_laika formātā, līdz “T”, kas tiek veikta ar apakšvirknes () funkciju, un pēc tam datumu glabā mainīgajā “datums” .
date_time = timeClient.getFormattedDate (); int index_date = datums_laiks.indexOf ("T"); Virknes datums = date_time.substring (0, index_date); Serial.println (datums); display.println (datums); display.display ();
Lūk, kā OLED interneta laika pulkstenis izskatīsies beidzot: