W poprzednim samouczku zrobiliśmy zegar RTC przy użyciu DS3231 i ESP32. Aby zminimalizować wymagania sprzętowe wykonamy zegar internetowy bez użycia modułu RTC. Jest to dokładniejsze w porównaniu z zegarem RTC. ESP32 jest modułem Wi-Fi i można go łatwo podłączyć do Internetu, więc użyjemy NTP (Network Time Protocol) i UDP (User Datagram Protocol) do pobrania czasu z Internetu za pomocą Wi-Fi. Ten zegar internetowy może być bardzo przydatny podczas tworzenia projektów IoT.
Co to jest NTP?
Network Time Protocol (NTP) to protokół sieciowy używany do synchronizacji czasu między systemami a sieciami danych. Struktura NTP zależy od internetowych serwerów czasu. NTP ma algorytmy precyzyjnego dostosowania pory dnia. Serwery NTP posiadają oprogramowanie, które przesyła godzinę zegara do komputerów klienckich za pomocą portu UDPport 123. W tym projekcie pobieramy czas z serwera NTP za pomocą ESP32 i pokazujemy go na wyświetlaczu OLED.
Wymagane materiały:
- ESP32
- Wyświetlacz OLED 128 * 64
- Płytka prototypowa
- Przewody męsko-żeńskie
Schemat obwodu:
Tutaj używamy trybu SPI, aby podłączyć nasz moduł wyświetlacza OLED 128 × 64 (SSD1306) do ESP32. Więc użyje 7 pinów. Połączenia z ESP32 są podane jako:
- Pin CS (Chip select) w OLED -> PIN D5 w ESP32
- Pin DC OLED -> PIN D4 ESP32
- Pin RES z OLED -> PIN D2 z ESP32
- Pin SDA OLED -> PIN D23 czyli MOSI ESP32
- Pin SCK OLED -> PIN D18 czyli SCK ESP32
- Vdd z OLED -> Vcc z ESP32
- GND OLED -> GND ESP32
Potrzebujesz plików płytki dla swojego ESP32. Menu rozwijane menedżera tablicy kontrolnej Arduino IDE dla zestawu deweloperskiego ESP32. Jeśli go tam nie ma, wykonaj czynności podane w linku poniżej:
circuitdigest.com/microcontroller-projects/getting-started-with-esp32-with-arduino-ide
Możesz również użyć ESP12 do tego projektu, dowiedz się tutaj, jak używać ESP12.
Użyjemy Arduino IDE do napisania naszego programu, jak wyjaśniono w powyższym artykule.
Objaśnienie kodu:
Pełny kod zegara internetowego ESP32 znajduje się na końcu artykułu. Tutaj wyjaśniamy kilka ważnych części kodu.
Potrzebujemy kilku bibliotek do wykorzystania w naszym kodzie, które można pobrać z poniższych linków:
1. Adafruit_SSD1306:
2. SPI:
3. Adafruit_GFX:
4. NTPClient:
5.WiFiUdp:
Dlatego dołączyliśmy wszystkie biblioteki i zdefiniowaną zmienną do wprowadzania nazwy i hasła Wi-Fi.
#zawierać
Tutaj do połączenia z serwerem czasu używana jest biblioteka NTPClient.h . Zsynchronizowanie serwera NTP zajmuje trochę czasu. Biblioteka Hhre WiFiUdp.h służy do wysyłania i odbierania wiadomości UDP. UDP to protokół, który wysyła i odbiera krótkie wiadomości z naszego systemu na serwer NTP.
Aby uzyskać czas z Internetu, musimy zdefiniować w naszym programie trzy zmienne dla NTP.
NTP_OFFSET, czyli strefa czasowa Twojego kraju, czyli dla Indii +5: 30 godzin. Więc to jest 19800 w sekundach.
NTP_INTERVAL, czyli przedział czasu potrzebny NTP do aktualizacji czasu. 60-64 sekundy.
NTP_ADDRESS to serwer NTP w Twoim kraju. W przypadku Indii możesz użyć adresu „ in.pool.ntp.org ”.
#define NTP_OFFSET 19800 // W sekundach #define NTP_INTERVAL 60 * 1000 // W milisekundach #define NTP_ADDRESS "1.asia.pool.ntp.org" WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
W funkcji konfiguracji zainicjuj ustawienia Wi-Fi, aby połączyć się z Internetem.
void setup () { display.begin (); Serial.begin (9600); Serial.println (); Serial.println (); Serial.print ("Łączenie z"); Serial.println (ssid); WiFi.begin (ssid, hasło); while (WiFi.status ()! = WL_CONNECTED) { opóźnienie (500); Serial.print („.”); } Serial.println („”); Serial.println ("Połączenie Wi-Fi."); Serial.println ("adres IP:"); Serial.println (WiFi.localIP ()); timeClient.begin ();
Następnie zainicjalizuj funkcje wyświetlania, aby pokazać czas na OLED.
display.begin (SSD1306_SWITCHCAPVCC);
W funkcji pętli użyliśmy timeClient.update (), funkcja ta pobiera zaktualizowany czas z NTP w postaci łańcucha i przechowuje go w zmiennej formattedTime . Następnie wyświetl go na OLED za pomocą funkcji display.println () .
void loop () { timeClient.update (); String formattedTime = timeClient.getFormattedTime (); display.clearDisplay (); display.setTextSize (2); // ustaw te parametry zgodnie ze swoimi potrzebami.. display.setCursor (0, 0); display.println (formattedTime);
Pełny program znajduje się poniżej. Teraz w końcu zaprogramuj ESP32 z Arduino IDE, a Twój zegar internetowy jest gotowy do wskazywania czasu.