Az RTC vagy a Real Time Clock az elektronika és a beágyazott eszközök leggyakrabban használt modulja az idő követésére. De az RTC-vel az a probléma, hogy a számítógépekben lévő mikrochipek nem annyira pontosak, és csak a helyi eszköz idejét tudják biztosítani. Másrészt az internet használata az idő lekérdezéséhez az NTP szerverekről jobb megoldás az idő megszerzésére, mivel pontosabb és a világ bármely földrajzi területének idejét meg tudja adni. Szükségünk van egy Wi-Fi-modulra és az internet-hozzáférésre, hogy az NTP-szerverek használatával időt nyerjünk a világ bármely pontjára. Ebben az oktatóanyagban az ESP8266 NodeMCU-t fogjuk használni, hogy lekérdezzük az aktuális időt és dátumot az NTP-kiszolgálókról, és megjelenítsük azokat OLED-kijelzőn.
Hálózati időprotokoll (NTP)
Az NTP az egyik legrégebbi hálózati protokoll (IP), amely szinkronizálja az órákat a számítógépes hálózatok között. Ezt David L. Mills, a Delaware Egyetem tervezte 1981-ben. Ez a protokoll sok hálózat szinkronizálására szolgál a koordinált világidővel (UTC) néhány milliszekundumon belül. Az UTC az elsődleges időstandard, amely alapján a világ szabályozza az órát és az időt. Az UTC nem változik és változik a különböző földrajzi helyeken. Az NTP az UTC-t használja idő referenciaként, és pontos és szinkronizált időt biztosít az interneten keresztül.
Az NTP hierarchikus kliens-szerver modellen működik. A csúcsmodell rendelkezik „stratum0” néven ismert referenciaórákkal, mint például atomórák, rádióhullámok, GPS, GSM, amelyek időt fogadnak a műholdról. Azokat a szervereket, amelyek időt vesznek a 0. rétegből, „stratum1” -nek, az 1. rétegből érkező szervereket pedig „stratum2” -nek és így tovább. Ez megy tovább, és az idő pontossága csökken az egyes szakaszok után. Az NTP automatikusan kiválasztja a rendelkezésre álló időforrások közül a legjobbat a szinkronizáláshoz, ami hibatűrő protokollt tesz lehetővé.
Tehát itt, ebben a projektben időt kapunk az NTP szervertől az ESP8266 NodeMCU használatával, és megmutatjuk azt az OLED kijelzőjén. Ez a fajta internetes óra az előző oktatóanyag ESP32 használatával épül fel.
Az ESP8266 az internet segítségével hozzáférhet az NTP szerverekhez a pontos idő elérése érdekében. Itt az NTP kliens-kiszolgáló módban működik, az ESP8266 kliens eszközként működik, és UDP (User Datagram Protocol) segítségével csatlakozik az NTP szerverekhez. Az ügyfél kérési csomagot továbbít az NTP szerverekre, és cserébe az NTP időbélyeg-csomagot küld, amely olyan információkat tartalmaz, mint a pontosság, az időzóna, a UNIX időbélyegző stb.
Szükséges alkatrészek
- Fekete-fehér 7 tűs SSD1306 0,96 ”OLED kijelző
- ESP8266 NodeMCU
- Mikro USB kábel
- Kenyérlemez
- Férfi-hím jumper vezetékek
Áramkör és kapcsolatok
Ez a 7 tűs OLED-kijelző SPI protokollal kommunikál az ESP8266 modullal. Az alábbiakban az áramkört és a kapcsolási táblázatot találjuk, amely összekapcsolja az OLED SPI csapokat a NodeMCU-val az internetidő megjelenítéséhez.
Nem. |
OLED kijelző |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) vagy SDA (I2C) |
D7 |
5. |
VISSZAÁLLÍTÁS |
D3 |
6. |
DC |
D2 |
7 |
CS |
D8 |
Ha többet szeretne megtudni erről a monokróm 7 tűs OLED-kijelzőről és az ESP8266 NodeMCU interfészéről, kövesse a linket.
Kód Magyarázat
Először le kell töltenünk és telepítenünk kell az NTP könyvtárat az ESP8266-ba. Az NTP Client számára sok könyvtár áll rendelkezésre. Bármelyiket telepítheti az Arduino IDE-ből. Ebben az oktatóanyagban telepítettem a Taranais által készített NTPClient könyvtárat, mert könnyen kezelhető és funkciókkal rendelkezik a dátum és az idő lekérésére az NTP szerverekről. ESP8266 A NodeMCU könnyen programozható az Arduino IDE használatával.
Az NTP könyvtár telepítéséhez először töltse le a könyvtárat a fenti hivatkozás használatával, majd telepítse az Arduino IDE használatával. Telepítéséhez lépjen a Vázlat> Könyvtár belefoglalása>.ZIP könyvtár hozzáadása elemre , majd nyissa meg a Zip mappát azzal a helyre lépve , ahonnan letöltötték a zip mappát, és indítsa újra az Arduino IDE alkalmazást.
Az NTPClient könyvtár példákkal szolgál. Nyissa meg az Arduino IDE és a Goto Examples> NTPClient> Advanced parancsot . Az ebben a vázlatban megadott kód az NTP-kiszolgálótól származó időt mutatja a soros monitoron. Ezt a vázlatot használjuk az aktuális idő és dátum megjelenítésére az OLED kijelzőn.
A teljes kód az oktatóanyag végén található, itt a kód néhány fontos részét elmagyaráztam.
ESP8266WiFi könyvtár biztosítja az ESP8266 specifikus Wi-Fi rutinjait a hálózathoz való csatlakozáshoz. A WiFiUDP.h kezeli az UDP csomagok küldését és fogadását. Mivel SPI protokollt használunk az OLED és a NodeMCU összekapcsolására, ezért importálni fogjuk az „SPI.h” könyvtárat. Az „Adafruit_GFX.h” és az „Adafruit_SSD1306.h” pedig az OLED kijelzőhöz használható.
#include
Az OLED méretünk 128x64, ezért a képernyő szélességét és magasságát 128, illetve 64 értékre állítjuk be. Tehát határozza meg a NodeMCU-hoz csatlakoztatott OLED csapok változóit az SPI kommunikációhoz.
#define SCREEN_WIDTH 128 // OLED kijelző szélesség, pixelben #define SCREEN_HEIGHT 64 // OLED kijelző magasság, pixelben // Nyilatkozat az SPD szoftverrel összekapcsolt SSD1306 kijelzőről (alapértelmezett eset): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Adafruit_SSD1306 kijelző (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Cserélje ki a „your_ssid” és a „your_password” szót a Wi-Fi SSID-jére és jelszavára az alábbi kódsorokban.
const char * ssid = "a_ssid"; const char * password = "a jelszavad";
Állítsa be a WI-Fi kapcsolatot azáltal, hogy SSID-t és jelszót ad a WiFi.begin funkciónak. Az ESP8266 csatlakoztatása egy ideig tart a NodeMCU-hoz való csatlakozáshoz, ezért várnunk kell, amíg csatlakozik.
WiFi.begin (ssid, jelszó); while (WiFi.status ()! = WL_CONNECTED) { késleltetés (500); Soros.nyomtatás ("."); }
Dátum és idő kéréséhez inicializálja az időklienst az NTP-kiszolgálók címével. A jobb pontosság érdekében válassza ki az Ön földrajzi területéhez közeli NTP szerverek címét. Itt a „ pool.ntp.org ” szót használjuk, amely világszerte kínál szervereket. Ha Ázsiából szeretne szervereket választani, használhatja az „ asia.pool.ntp.org ” fájlt . A timeClient az UTC időeltolódást is felveszi az időzónád milliszekundumában. Például az UTC-eltolás India esetében +5: 30, ezért ezt az eltolást milliszekundumban konvertáljuk, amely egyenlő 5 * 60 * 60 + 30 * 60 = 19800.
Terület |
UTC időeltolódás (óra és perc) |
UTC időeltolódás (másodperc) |
INDIA |
+5: 30 |
19800 |
LONDON |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
Az SSD1306_SWITCHCAPVCC 3,3 V belső generálására van megadva a képernyő inicializálásához. Amikor az OLED elindul, 3 másodpercig megjelenik a „ WELCOME TO CIRCUIT DIGEST ” felirat 2-es szövegmérettel és kék színnel.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("Az SSD1306 kiosztása nem sikerült")); for (;;); // Ne haladj, ciklus örökké } display.clearDisplay (); display.setTextSize (2); // Rajzoljon 2X léptékű szöveges kijelzőt.setTextColor (KÉK); display.setCursor (5, 2); display.println ("ÜDVÖZÖLJÜK"); display.println ("ÁRAMKÖR"); display.println ("DIGEST"); display.display (); késés (3000);
Az NTP klienst a start () függvény segítségével inicializáljuk, hogy beállítsuk a dátumot és az időt az NTP szerverekről.
timeClient.begin ();
Az Update () függvény a dátum és az idő fogadására szolgál, amikor az NTP-kiszolgálóktól kérünk.
timeClient.update ();
Az 115200 átviteli sebességet úgy állítják be, hogy az időt soros monitorra nyomtassa.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
A getHours (), getMinutes (), getSeconds (), getDay a könyvtár függvény, és megadja az aktuális órát, percet, másodpercet és napot az NTP szerverről. Az alábbi kóddal megkülönböztethető az idő AM és PM között. Ha a getHours () használatával kapott óra meghaladja a 12-et, akkor ezt az időt PM-ként állítjuk be.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int nap = timeClient.getDay (); ha (hh> 12) { hh = hh-12; display.print (óó); 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 nap = timeClient.getDay (); display.println ("'" + arr_napok + "'");
A getFormattedDate () a dátum lekérése „éééé-hh-nn” formátumban használatos az NTP szerverről. Ez a függvény adja meg a dátumot és az időt „éééé-hh-nn T óó: pp: ss formátumban. De csak dátumra van szükségünk, ezért fel kell osztanunk ezt a date_time formátumban tárolt karakterláncot „T” -ig, amelyet az substring () függvény végez, majd a dátumot a „date” változóban kell tárolni.
date_time = timeClient.getFormattedDate (); int index_dátum = dátum_idõ.indexOf ("T"); Karakterlánc dátuma = dátum_idő.substring (0, index_dátum); Soros.println (dátum); display.println (dátum); display.display ();
Így fog kinézni az OLED Internet Time Clock végül: