RTC alebo hodiny v reálnom čase sú najbežnejšie používaným modulom v elektronike a vstavaných zariadeniach na sledovanie času. Ale problém s RTC je, že mikročipy v počítačoch nie sú až také presné a dokážu poskytnúť iba čas lokálneho zariadenia. Na druhej strane, použitie internetu na získanie času zo serverov NTP je lepším riešením na získanie času, pretože je presnejšie a môže poskytnúť čas akejkoľvek geografickej oblasti na svete. Potrebujeme iba modul Wi-Fi a prístup na internet, aby sme mohli pomocou serverov NTP získať čas kdekoľvek na svete. V tomto výučbe použijeme ESP8266 NodeMCU na získanie aktuálneho času a dátumu zo serverov NTP a ich zobrazenie na OLED displeji.
Sieťový časový protokol (NTP)
NTP je jedným z najstarších sieťových internetových protokolov (IP) na synchronizáciu hodín medzi počítačovými sieťami. Bol navrhnutý Davidom L. Millsom z University of Delaware v roku 1981. Tento protokol je možné použiť na synchronizáciu mnohých sietí s koordinovaným svetovým časom (UTC) v priebehu niekoľkých milisekúnd. UTC je hlavný časový štandard, podľa ktorého svet reguluje hodiny a čas. UTC sa nemení a nemení pre rôzne geografické polohy. NTP používa ako časovú referenciu UTC a poskytuje presný a synchronizovaný čas na internete.
NTP funguje na hierarchickom modeli klient-server. Špičkový model má referenčné hodiny známe ako „stratum0“, ako sú atómové hodiny, rádiové vlny, GPS, GSM, ktoré prijímajú čas zo satelitu. Servery, ktoré prijímajú čas zo stratum0, sa nazývajú „stratum1“ a servery, ktoré prijímajú čas zo stratum1, sa nazývajú „stratum2“ atď. To pokračuje a presnosť času klesá po každej fáze. NTP automaticky vyberie to najlepšie z niekoľkých dostupných zdrojov času, ktoré sa majú synchronizovať, vďaka čomu je protokol odolný voči chybám.
Takže tu v tomto projekte dostávame čas od NTP serveru pomocou ESP8266 NodeMCU a ukazujeme ho na OLED displeji. Rovnaký druh internetových hodín je zostavený pomocou ESP32 v predchádzajúcom tutoriáli.
ESP8266 môže pristupovať k serverom NTP pomocou internetu a získať presný čas. Tu NTP pracuje v režime klient-server, ESP8266 funguje ako klientske zariadenie a pripája sa k serverom NTP pomocou UDP (User Datagram Protocol). Klient vysiela paket požiadaviek na servery NTP a na oplátku NTP pošle paket časovej pečiatky, ktorý obsahuje informácie ako presnosť, časové pásmo, časová pečiatka UNIX atď. Potom klient oddelí podrobnosti dátumu a času, ktoré je možné ďalej v aplikáciách použiť podľa požiadaviek.
Súčasti sú povinné
- Monochromatický 7-pinový SSD1306 0,96 ”OLED displej
- ESP8266 NodeMCU
- Kábel micro USB
- Nepál
- Prepojovacie vodiče typu samec-samec
Schéma zapojenia a zapojenia
Tento 7-pinový OLED displej komunikuje s modulom ESP8266 pomocou protokolu SPI, nižšie je schéma zapojenia a tabuľka pripojení na pripojenie pinov OLED SPI k NodeMCU na zobrazovanie internetového času.
Č. |
OLED displej |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3 V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) alebo SDA (I2C) |
D7 |
5 |
RESETOVAŤ |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Ak sa chcete dozvedieť viac o tomto monochromatickom 7-pólovom OLED displeji a jeho rozhraní s ESP8266 NodeMCU, kliknite na odkaz.
Vysvetlenie kódu
Najprv si musíme stiahnuť a nainštalovať NTP knižnicu do ESP8266. Pre klienta NTP je k dispozícii veľa knižníc. Môžete si nainštalovať ktorýkoľvek z nich z Arduino IDE. V tomto tutoriáli som nainštaloval knižnicu NTPClient od Taranais, pretože je ľahko použiteľný a má funkcie na získanie dátumu a času zo serverov NTP. ESP8266 NodeMCU sa dá ľahko programovať pomocou Arduino IDE.
Ak chcete nainštalovať knižnicu NTP, najskôr si stiahnite knižnicu pomocou vyššie uvedeného odkazu a potom ju nainštalujte pomocou Arduino IDE. Ak ju chcete nainštalovať, prejdite na Skica> Zahrnúť knižnicu> Pridať knižnicu.ZIP , potom otvorte priečinok Zip tak, že prejdete na miesto, kde ste si stiahli priečinok zip, a reštartujte IDE Arduino.
Knižnica NTPClient prichádza s príkladmi. Otvorte Arduino IDE a Prejdite na príklady> NTPClient> Pokročilé . Kód uvedený v tomto náčrte zobrazuje čas zo servera NTP na sériovom monitore. Tento náčrt použijeme na zobrazenie aktuálneho času a dátumu na OLED displeji.
Celý kód je k dispozícii na konci tohto tutoriálu, tu som vysvetlil niekoľko dôležitých častí kódu.
Knižnica ESP8266WiFi poskytuje pre ESP8266 špecifické postupy Wi-Fi na pripojenie k sieti. WiFiUDP.h spracováva odosielanie a prijímanie UDP balíkov. Pretože na prepojenie OLED s NodeMCU používame protokol SPI, naimportujeme knižnicu „SPI.h“. A „Adafruit_GFX.h“ a „Adafruit_SSD1306.h“ sa používajú pre OLED displej.
#include
Naša veľkosť OLED je 128 x 64, takže šírku a výšku obrazovky nastavujeme na 128, respektíve 64. Takže definujte premenné pre OLED piny pripojené k NodeMCU pre komunikáciu SPI.
#define SCREEN_WIDTH 128 // OLED šírka displeja, v pixeloch #define SCREEN_HEIGHT 64 // OLED výška displeja, v pixeloch // Deklarácia pre displej SSD1306 pripojený pomocou softvéru SPI (predvolený prípad): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Displej Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
V nasledujúcich riadkoch kódu nahraďte výraz „your_ssid“ a „your_password“ svojím identifikátorom SSID a heslom siete Wi-Fi.
const char * ssid = "your_ssid"; const char * heslo = "vaše_heslo";
Nastavte pripojenie WI-Fi zadaním SSID a hesla do funkcie WiFi.begin . Pripojenie ESP8266 trvá nejaký čas, kým sa pripojíme k NodeMCU, takže musíme počkať, kým sa nepripojí.
WiFi.begin (ssid, heslo); while (WiFi.status ()! = WL_CONNECTED) { oneskorenie (500); Serial.print ("."); }
Ak chcete požiadať o dátum a čas, inicializujte časového klienta s adresou serverov NTP. Pre lepšiu presnosť vyberte adresu serverov NTP, ktoré sú blízko vašej geografickej oblasti. Tu používame súbor „ pool.ntp.org “, ktorý poskytuje servery z celého sveta. Ak si chcete zvoliť servery z Ázie, môžete použiť server „ asia.pool.ntp.org “. timeClient tiež berie časový posun UTC v milisekundách vášho časového pásma. Napríklad posun UTC pre Indiu je +5: 30, takže tento posun prevádzame v milisekundách, čo sa rovná 5 * 60 * 60 + 30 * 60 = 19800.
Oblasť |
Časový posun UTC (hodiny a minúty) |
Časový posun UTC (sekundy) |
INDIA |
+5: 30 |
19800 |
LONDÝN |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800 60000);
SSD1306_SWITCHCAPVCC je určený na interné generovanie 3,3 V na inicializáciu zobrazenia. Po spustení OLED sa na 3 sekundy zobrazí „ VÍTAJTE V OKRUHU DIGESTU “ s veľkosťou textu 2 a farbou MODROU.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("alokácia SSD1306 zlyhala")); pre (;;); // Nepokračujte, opakujte navždy } display.clearDisplay (); display.setTextSize (2); // Nakreslite text v 2X mierke. SetTextColor (MODRÝ); display.setCursor (5, 2); display.println ("VITAJTE V"); display.println ("OKRUH"); display.println ("DIGEST"); display.display (); oneskorenie (3 000);
NTP klient je inicializovaný pomocou funkcie begin () na nastavenie dátumu a času zo serverov NTP.
timeClient.begin ();
Funkcia Update () sa používa na príjem dátumu a času, kedykoľvek požiadame o servery NTP.
timeClient.update ();
Prenosová rýchlosť 115200 je nastavená na tlač času na sériovom monitore.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay sú knižničnou funkciou, ktorá poskytuje aktuálnu hodinu, minúty, sekundy a deň zo servera NTP. Nižšie uvedený kód sa používa na rozlíšenie času medzi AM a PM. Ak je hodina, ktorú používame pomocou getHours (), väčšia ako 12, nastavíme tento čas ako PM, inak ako AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int deň = timeClient.getDay (); if (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); displej.tlač (mm); display.print (":"); display.print (ss); display.println ("PM"); } else { display.print (hh); display.print (":"); displej.tlač (mm); display.print (":"); display.print (ss); display.println ("AM"); } int den = timeClient.getDay (); display.println ("" "+ arr_days +" "");
getFormattedDate () sa používa na získanie dátumu vo formáte „rrrr-mm-dd“ zo servera NTP. Táto funkcia poskytuje dátum a čas vo formáte „rrrr-mm-dd T hh: mm: ss“ . Potrebujeme však iba dátum, takže musíme tento reťazec, ktorý je uložený vo formáte date_time, rozdeliť na „T“, čo sa deje pomocou funkcie substring (), a dátum potom uložiť do premennej „date“ .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); Reťazec date = date_time.substring (0, index_date); Serial.println (dátum); display.println (dátum); display.display ();
Takto budú OLED internetové hodiny nakoniec vyzerať: