RTC lub zegar czasu rzeczywistego to najczęściej używany moduł w elektronice i urządzeniach wbudowanych do śledzenia czasu. Ale problem z RTC polega na tym, że mikrochipy w komputerach nie są tak bardzo dokładne i mogą podawać tylko czas lokalnego urządzenia. Z drugiej strony, korzystanie z Internetu do pobierania czasu z serwerów NTP jest lepszym rozwiązaniem do uzyskiwania czasu, ponieważ jest dokładniejsze i może zapewnić czas z dowolnego obszaru geograficznego na świecie. Potrzebujemy tylko modułu Wi-Fi i dostępu do Internetu, aby uzyskać czas z dowolnego miejsca na świecie za pomocą serwerów NTP. W tym samouczku użyjemy ESP8266 NodeMCU, aby uzyskać aktualny czas i datę z serwerów NTP i wyświetlić je na wyświetlaczu OLED.
Network Time Protocol (NTP)
NTP jest jednym z najstarszych protokołów sieciowych (IP) do synchronizacji zegarów między sieciami komputerowymi. Został zaprojektowany przez Davida L. Millsa z University of Delaware w 1981 roku. Protokół ten może być używany do synchronizacji wielu sieci z uniwersalnym czasem koordynowanym (UTC) w ciągu kilku milisekund. UTC to podstawowy standard czasu, według którego świat reguluje zegar i czas. UTC nie zmienia się i nie różni się w zależności od lokalizacji geograficznej. NTP wykorzystuje UTC jako odniesienie czasu i zapewnia dokładny i zsynchronizowany czas w Internecie.
NTP działa w hierarchicznym modelu klient-serwer. Najwyższy model ma zegary referencyjne znane jako „warstwa 0”, takie jak zegary atomowe, fale radiowe, GPS, GSM, które odbierają czas z satelity. Serwery odbierające czas z warstwy 0 nazywane są „warstwą 1”, a serwery odbierające czas z warstwy 1 nazywane są „warstwą 2” i tak dalej. To trwa, a dokładność czasu maleje po każdym etapie. NTP automatycznie wybiera najlepsze z kilku dostępnych źródeł czasu do synchronizacji, co czyni go odpornym na błędy protokołem.
Więc tutaj w tym projekcie pobieramy czas z serwera NTP za pomocą ESP8266 NodeMCU i pokazujemy go na wyświetlaczu OLED. Ten sam rodzaj zegara internetowego jest zbudowany przy użyciu ESP32 w poprzednim samouczku.
ESP8266 może uzyskać dostęp do serwerów NTP za pośrednictwem Internetu, aby uzyskać dokładny czas. Tutaj NTP działa w trybie klient-serwer, ESP8266 działa jako urządzenie klienckie i łączy się z serwerami NTP za pomocą UDP (User Datagram Protocol). Klient przesyła pakiet żądania do serwerów NTP iw zamian NTP wysyła pakiet znacznika czasu, który zawiera informacje takie jak dokładność, strefa czasowa, znacznik czasu UNIX itp. Następnie klient oddziela szczegóły dotyczące daty i czasu, które mogą być dalej używane w aplikacjach zgodnie z wymaganiami.
Wymagane składniki
- Monochromatyczny 7-pinowy wyświetlacz OLED SSD1306 0,96 ”
- ESP8266 NodeMCU
- Kabel micro USB
- Płytka prototypowa
- Przewody połączeniowe męsko-męskie
Schemat obwodu i połączenia
Ten 7-pinowy wyświetlacz OLED komunikuje się z modułem ESP8266 za pomocą protokołu SPI, poniżej znajduje się schemat obwodu i tabela połączeń do połączenia pinów OLED SPI z NodeMCU w celu wyświetlania czasu internetowego.
Nie. |
Wyświetlacz OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3 V. |
3 |
SCK |
D5 |
4 |
MOSI (SPI) lub SDA (I2C) |
D7 |
5 |
RESETOWANIE |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Aby dowiedzieć się więcej na temat tego monochromatycznego 7-pinowego wyświetlacza OLED i jego interfejsu z ESP8266 NodeMCU, kliknij łącze.
Objaśnienie kodu
Najpierw musimy pobrać i zainstalować bibliotekę NTP w ESP8266. Istnieje wiele bibliotek dostępnych dla klienta NTP. Możesz zainstalować dowolny z nich z Arduino IDE. W tym samouczku zainstalowałem bibliotekę NTPClient firmy Taranais, ponieważ jest łatwa w użyciu i ma funkcje do pobierania daty i czasu z serwerów NTP. ESP8266 NodeMCU można łatwo zaprogramować za pomocą Arduino IDE.
Aby zainstalować bibliotekę NTP, najpierw pobierz bibliotekę za pomocą powyższego linku, a następnie zainstaluj ją za pomocą Arduino IDE. Aby go zainstalować, przejdź do Sketch> Include Library> Add.ZIP Library , a następnie otwórz folder Zip, przechodząc do lokalizacji, w której pobrałeś folder zip i ponownie uruchom Arduino IDE.
Biblioteka NTPClient zawiera przykłady. Otwórz Arduino IDE i przejdź do przykładów> NTPClient> Zaawansowane . Kod podany na tym szkicu wyświetla czas z serwera NTP na monitorze szeregowym. Użyjemy tego szkicu do wyświetlenia aktualnej godziny i daty na wyświetlaczu OLED.
Kompletny kod jest dostępny na końcu tego samouczka, tutaj wyjaśniłem kilka ważnych części kodu.
Biblioteka ESP8266WiFi zapewnia specyficzne procedury Wi-Fi ESP8266 do łączenia się z siecią. WiFiUDP.h obsługuje wysyłanie i odbieranie pakietów UDP. Ponieważ używamy protokołu SPI do łączenia OLED z NodeMCU, zaimportujemy bibliotekę „SPI.h”. „Adafruit_GFX.h” i „Adafruit_SSD1306.h” są używane do wyświetlania OLED.
#zawierać
Nasz rozmiar OLED to 128x64, więc ustawiamy szerokość i wysokość ekranu odpowiednio na 128 i 64. Zdefiniuj więc zmienne dla pinów OLED podłączonych do NodeMCU dla komunikacji SPI.
# zdefiniować SCREEN_WIDTH 128 // szerokość wyświetlacza OLED w pikselach # zdefiniować wysokość ekranu OLED w pikselach // deklaracja dla wyświetlacza SSD1306 podłączonego za pomocą oprogramowania SPI (przypadek domyślny): # zdefiniować OLED_MOSI D7 # zdefiniować OLED_CLK D5 # zdefiniować OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Wyświetlacz Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Zastąp „your_ssid” i „your_password” swoim identyfikatorem SSID Wi-Fi i hasłem w poniższych wierszach kodu.
const char * ssid = "your_ssid"; const char * hasło = "twoje_hasło";
Skonfiguruj połączenie Wi-Fi, podając SSID i hasło do funkcji WiFi . Połączenie ESP8266 zajmuje trochę czasu, aby połączyć się z NodeMCU, więc musimy poczekać, aż się połączy.
WiFi.begin (ssid, hasło); while (WiFi.status ()! = WL_CONNECTED) { opóźnienie (500); Serial.print („.”); }
Aby zażądać daty i godziny, zainicjuj klienta czasu z adresem serwerów NTP. Aby uzyskać lepszą dokładność, wybierz adresy serwerów NTP, które znajdują się blisko twojego obszaru geograficznego. Tutaj używamy „ pool.ntp.org ”, który zawiera serwery z całego świata. Jeśli chcesz wybrać serwery z Azji, możesz użyć „ asia.pool.ntp.org ”. timeClient przyjmuje również przesunięcie czasu UTC w milisekundach Twojej strefy czasowej. Na przykład przesunięcie czasu UTC dla Indii wynosi +5: 30, więc przeliczamy to przesunięcie w milisekundach, co jest równe 5 * 60 * 60 + 30 * 60 = 19800.
Powierzchnia |
Przesunięcie czasu UTC (godziny i minuty) |
Przesunięcie czasu UTC (sekundy) |
INDIE |
+5: 30 |
19800 |
LONDYN |
0:00 |
0 |
NOWY JORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC ma wewnętrzne generowanie 3,3 V w celu zainicjowania wyświetlacza. Po uruchomieniu OLED wyświetla „ WITAMY W OBWODZIE DIGEST ” z tekstem o rozmiarze 2 i kolorem NIEBIESKIM przez 3 sekundy.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("alokacja SSD1306 nie powiodła się")); dla(;;); // Nie kontynuuj, zapętlaj na zawsze } display.clearDisplay (); display.setTextSize (2); // Rysuj tekst display.setTextColor (BLUE) w skali 2X ; display.setCursor (5, 2); display.println ("WITAMY W"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); opóźnienie (3000);
Klient NTP jest inicjowany za pomocą funkcji begin () w celu ustawienia daty i godziny z serwerów NTP.
timeClient.begin ();
Funkcja Update () służy do odbierania daty i godziny za każdym razem, gdy wysyłamy żądanie do serwerów NTP.
timeClient.update ();
Szybkość transmisji 115200 jest ustawiona na drukowanie czasu na monitorze szeregowym.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay to funkcja biblioteczna, która podaje aktualną godzinę, minuty, sekundy i dzień z serwera NTP. Poniższy kod służy do rozróżnienia czasu między godziną przedpołudniową a popołudniową. Jeśli godzina, którą otrzymujemy za pomocą getHours () jest większa niż 12, to ustawiamy ten czas jako PM, w przeciwnym razie jest to godzina 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 () służy do pobierania daty w formacie „rrrr-mm-dd” z serwera NTP. Ta funkcja podaje datę i godzinę w formacie „rrrr-mm-dd T hh: mm: ss” . Ale potrzebujemy tylko daty, więc musimy podzielić ten ciąg, który jest przechowywany w formacie data_godzina do „T”, co jest wykonywane przez funkcję substring (), a następnie zapisać datę w zmiennej „data” .
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 ();
Tak będzie wreszcie wyglądał internetowy zegar czasu OLED: