Praca z ESP32 lub innym czasem mikrokontrolera jest bardzo ważna, ponieważ wbudowany timer nie jest tak dokładny, więc możemy użyć NTP serwer do pobierania w czasie rzeczywistym i może przechowywać go w zmiennej, której można później użyć w kodzie ESP32.
Network Time Protocol (NTP) wykorzystuje uniwersalny czas koordynowany (UTC), który synchronizuje zegar systemowy z dużą precyzją i dokładnością. W mniejszych sieciach NTP może zapewnić nam zegary z dokładnością do 1 ms, podczas gdy większe sieci, takie jak LAN (sieć lokalna), NTP może zapewnić dokładność dziesiątek milisekund przez Internet. Za pomocą tego dokładnego zegara ESP32 może wykonywać instrukcje o określonej godzinie.
Ten przewodnik zawiera następujące treści:
- Wprowadzenie do NTP (Network Time Protocol)
- Serwer NTP i ustawienia czasu
- Drukowanie w czasie rzeczywistym za pomocą funkcji printLocalTime().
1: Wprowadzenie do NTP (Network Time Protocol)
NTP to skrót od N sieć T do zrobienia P rotocol to standard używany do synchronizacji czasu urządzeń z ich strefą czasową. Protokół czasu sieciowego synchronizuje czas wszystkich urządzeń sieciowych z czasem UTC znanym również jako uniwersalny czas koordynowany.
UTC jest jak GMT (Greenwich Mean Time), ale nie zmienia się i pozostaje taki sam na całym świecie. Główną ideą korzystania z UTC jest odczyt czasu z pliku NTP serwer i stosując przesunięcie UTC możemy uzyskać czas lokalny zgodnie z naszą strefą czasową.
2: Serwer NTP i ustawienia czasu
Aby odczytać czas z serwera NTP, musimy zadeklarować następujące zmienne w kodzie za pomocą tych zmiennych, które możemy pobrać z serwera NTP.
- Serwer NTP
- Przesunięcie GMT
- Przesunięcie światła dziennego
2.1: Serwer NTP
Poprosimy o czas od basen.ntp.org który zawiera dane czasu na całym świecie na serwerze i każdy może zażądać swojego czasu lokalnego za pomocą tej puli. Oto kilka innych serwerów, do których możemy uzyskać dostęp:
Powierzchnia | Nazwa hosta |
---|---|
Na calym swiecie | basen.ntp.org |
Azja | azja.pool.ntp.org |
Europa | europe.pool.ntp.org |
Ameryka północna | ameryka północna.pool.ntp.org |
Oceania | oceania.pool.ntp.org |
Ameryka Południowa | ameryka południowa.pool.ntp.org |
2.2: Przesunięcie GMT
Przesunięcie GMT opisuje różnicę czasu w godzinach między strefą czasową, w której mieszkasz, a GMT. Na przykład, jeśli używamy strefy czasowej USA, możemy ją ustawić na UTC = -11:00 .
2.3: Przesunięcie światła dziennego
Tutaj przesunięcie światła dziennego to czas letni, który zwykle przyjmuje się jako 1 godzinę. Zmiana czasu na letni polega na przesunięciu wskazówek zegara o 1 godzinę do przodu w okresie letnim i cofnięciu ich w okresie zimowym. To polecenie jest zwykle używane, gdy używana jest niestandardowa strefa czasowa i stosowana jest reguła czasu letniego.
Skoro już omówiliśmy podstawy serwera NTP, teraz sprawdzimy, jak możemy wysłać żądanie do serwera NTP i odczytać czas lokalny za pomocą ESP32 z kodem Arduino IDE.
3: Drukowanie w czasie rzeczywistym za pomocą funkcji printLocalTime().
The printLocalTime() funkcja wywoła tzw getLocalTime() funkcja, która wysyła żądanie do serwera NTP i przechowuje otrzymaną datę i godzinę w pliku informacje o czasie zmienny.
3.1: Kod do drukowania w czasie rzeczywistym
Wklej podany kod dla serwera klienta NTP w edytorze Arduino IDE. Podłącz ESP32 do komputera, wybierz port COM i wgraj kod.
#włącz#włącz 'czas.h'
stały znak * ssid = „REPLACE_WITH_YOUR_SSID”;
stały znak * hasło = „REPLACE_WITH_YOUR_PASSWORD”;
stały znak * ntpSerwer = „pool.ntp.org” ;
const long gmtOffset_sec = 18000 ; /* PRZESUNIĘCIE GMT + 5 GODZINY ( 18000 SEK ) */
const int daylightOffset_sec = 3600 ; /* 1 przesunięcie godziny względem światła dziennego */
nieważne printLocalTime ( )
{
struct tm informacje o czasie;
jeśli ( ! pobierz czas lokalny ( & informacje o czasie ) ) {
Serial.println ( „Nie udało się uzyskać czasu” ) ;
zwrócić ;
}
Serial.println ( & informacje o czasie, '%A, %B %d %Y %H:%M:%S' ) ;
}
unieważnić konfigurację ( )
{
Serial.początek ( 115200 ) ;
// połączyć się z Wi-Fi
Serial.printf ( 'Łączenie z %s' , ssd ) ;
WiFi.rozpocznij ( ssd, hasło ) ;
podczas gdy ( Stan.WiFi ( ) ! = WL_POŁĄCZONY ) {
opóźnienie ( 500 ) ;
Wydruk.seryjny ( '.' ) ;
}
Serial.println ( „POŁĄCZONY” ) ;
// init i pobierz czas
Czas konfiguracji ( gmtOffset_sec, daylightOffset_sec, ntpServer ) ;
drukujCzasLokalny ( ) ;
// odłącz Wi-Fi jak to nie jest już potrzebny
WiFi.disconnect(true);
Tryb WiFi(WIFI_OFF);
}
pusta pętla ()
{
opóźnienie(1000);
printLocalTime();
}
Kod rozpoczął się od włączenia Wi-Fi i biblioteki czasu. WiFi biblioteka pomoże na chwilę połączyć ESP32 z siecią czas biblioteka obsłuży synchronizację serwera NTP.
Następnie określa się identyfikator SSID i hasło sieci, z którą połączy się ESP32. Zastąp swoje dane logowania do sieci tutaj. Następnie zdefiniowaliśmy Przesunięcie GMT jako 18000 sekund, czyli (UTC + 5 godzin). Tutaj możesz zmienić własną strefę czasową UTC. Podążaj za połączyć aby uzyskać Przesunięcie GMT dla Twojej strefy czasowej.
Dodatkowo podajemy adres serwera NTP za pomocą polecenia:
stały znak * ntpSerwer = „pool.ntp.org” ;To polecenie automatycznie wybiera serwer czasu, który cię przeszuka. Możemy jednak również ustawić strefę czasową za pomocą serwerów NTP wyjaśnionych w Serwer NTP Sekcja.
Na koniec konfigurujemy ESP32 jako klienta NTP oraz do uzyskiwania daty i czasu. Do tego użyliśmy tzw configTime() funkcjonować.
Wreszcie, korzystając z printLocalTime() funkcji, bieżąca data i godzina są drukowane na monitorze szeregowym. Ta funkcja zawiera strukturę czasową tm który przechowuje wszystkie informacje w informacje o czasie zmienny.
Następujące polecenia reprezentują informacje o czasie Struktura.
Serial.println ( & informacje o czasie, '%A, %B %d %Y %H:%M:%S' ) ;Każda litera struktury czasu odnosi się do określonej informacji:
Specyfikatory | Informacja |
---|---|
%A | Dzień powrotu w tygodniu |
%B | Miesiąc zwrotu |
%d | Dzień powrotu miesiąca |
%Y | Zwróć bieżący rok |
%H | Zwróć aktualną godzinę |
%M | Zwróć bieżące minuty |
%S | Zwróć bieżące sekundy |
3.2: Wyjście
Po wgraniu kodu ESP32 połączy się z siecią WiFi i wyśle żądanie do serwera NTP w celu odebrania aktualnej daty i godziny. Poniższe dane wyjściowe można zobaczyć na monitorze szeregowym Arduino.
Bieżący czas na moim komputerze i ESP32 są zgodne.
Pomyślnie odczytaliśmy czas z serwera NTP przy użyciu ESP32 jako klienta.
Wniosek
Czas jest bardzo ważny dla aplikacji takich jak znakowanie czasem i wykonywanie instrukcji w określonym czasie w celu generowania danych wyjściowych. Wbudowane timery nie są tak dokładne, więc możemy użyć serwera NTP do odczytania aktualnej godziny i daty. Ten czas może być przechowywany w zmiennej do użycia w naszym kodzie. Ta lekcja pomaga w uzyskaniu dokładnego czasu w dowolnej strefie czasowej na całym świecie za pomocą ESP32.