

Ziel des Projekts
Mit dem NTP-Protokoll sollen Zeit und Datum sollen auf einem OLED angezeigt werden. Als Mikrocontroller kann ein WiFi-fähiger Arduino oder ein ESP32 verwendet werden.

Board installieren
Es können beliebige Mikrocontroller mit WiFi-Funktionalität und OLEDs unterschiedlicher Größe verwendet werden.

- Arduino UNO R4 WiFi
- Arduino MKR WiFi 1010
- Arduino Nano 33 IoT
- ESP32-Wroom
- Arduino Nano ESP32
- ESP32-C6
- XIAO-ESP32-C3
- ESP32-C3 Zero
- ESP32-C3 Super Mini
- ESP32-C6 Zero
- Wemos D1 Mini
I²C-Pins
- Arduino UNO R4 WiFi
- Arduino MKR WiFi 1010
- Arduino Nano 33 IoT
- ESP32-Wroom
- Arduino Nano ESP32
- ESP32-C6
- XIAO-ESP32-C3
- ESP32-C3 Zero
- ESP32-C3 Super Mini
- ESP32-C6 Zero
- Wemos D1 Mini
Nach dem Start des Programms werden die IP und die aktuelle Zeit im Seriellen Monitor angezeigt. Weil die IP über DHCP vergeben wird, kann sie jedesmal eine andere sein. Für die Anzeige spielt das aber keine Rolle.

Benötigte Bibliotheken


Das Programm
Bibliotheken und Variablen
Je nach verwendetem Mikrocontroller muss eine andere WiFi-Bibliothek eingebunden werden.
Das wird mit #ifdef abgefragt
- MKR 1010, Nano 33 IoT (ARDUINO_ARCH_SAMD)
WiFiNINA.h - UNO R4 WiFi (ARDUINO_UNOR4_WIFI)
WiFiS3.h - ESP32 (ESP32)
WiFi.h - ESP8266 (ESP8266)
ESP8266WiFi.h
Ab Zeile 31 musst du das entsprechende OLED auswählen
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#ifdef ESP8266 #include "ESP8266WiFi.h" #endif #ifdef ESP32 #include "WiFi.h" #endif #ifdef ARDUINO_UNOR4_WIFI #include "WiFiS3.h" #endif #ifdef ARDUINO_ARCH_SAMD #include "WiFiNINA.h" #endif #include "NTP3.h" #include "U8g2lib.h" // nicht notwendig bei WiFiNINA #include "WiFiUdp.h" /* Typbezeichnung mit Bildschirmgröße in Pixeln F = full screen buffer mode Hardware I2C Name des OLEDs Rotation R0 (keine) */ // Parameter 0,96 Zoll SSD1306 U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE); // Parameter 1,3 Zoll SH1106 // U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE); // Parameter 1,54 Zoll // U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0); // SSID und Passwort des Routers char Router[] = "Router_SSID"; char Passwort[] = "xxxxxxxx"; WiFiUDP wifiUdp; NTP3 ntp(wifiUdp); // beim Start des loop-Teils wird die Zeit einmalig synchronisiert bool Start = true; unsigned long Zeitmessung = 0; int Sekunden; |
Der setup-Teil
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
void setup() { Serial.begin(9600); delay(500); // WiFi starten DHCP WiFi.begin(Router, Passwort); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(1000); } delay(3000); // SSID des Routers anzeigen Serial.print("Verbunden mit "); Serial.println(WiFi.SSID()); // IP anzeigen Serial.print("IP: "); Serial.println(WiFi.localIP()); /* Zeitzone CEST: Central European Summertime Beginn europäische Sommerzeit letzter Sonntag im März 2 Uhr GMT + 2 Stunden */ ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120); // CET: Central European Time // Beginn Normalzeit letzter Sonntag im Oktober 3 Uhr GMT + 1 Stunde ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60); // ntp starten Zeitserver deutscher NTP-Pool // Standard: pool.ntp.org ntp.begin("de.pool.ntp.org"); // nur ESP: autoamtische Synchronisation mit der Systemzeiot des ESP // ntp.syncRTC(true); // Intervall für den Kontakt zum NTP-Server ntp.updateInterval(30000); // OLED starten oled.begin(); oled.clearDisplay(); // Zeichenfarbe weiß oled.setDrawColor(1); // horizontale Schrift oled.setFontDirection(0); // WiFi-Daten anzeigen oled.setFont(u8g2_font_helvB12_tf); oled.setCursor(1, 20); oled.print(WiFi.SSID()); oled.setCursor(1, 40); oled.print(WiFi.localIP()); oled.setCursor(1, 60); oled.print(WiFi.RSSI()); oled.sendBuffer(); oled.clearBuffer(); delay(5000); Zeitmessung = millis() + 1000; } |
Der loop-Teil
Der loop-Teil ruft im Abstand von einer Sekunde die Funktion Zeitanzeigen() auf.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void loop() { // Start = true // -> Zeit einmalig beim Start synchronisieren // danach zur vollen Minute if (Start) { Start = false; ZeitAnzeigen(); } // Sekunden weiter zählen if (Zeitmessung < millis()) { Zeitmessung += 1000; Sekunden++; // nach 60 Sekunden Zeit aktualisieren if (Sekunden == 60) ZeitAnzeigen(); } } |
Die Funktion Zeitanzeigen()
Der zwischenzeitlichen Unterbrechung des WiFi-Signals soll vorgebeugt werden:
- der Rückgabewert der Aktualisierung der Zeit mit ntp.update() ist im Erfolgsfall true.
Bei einem Misserfolg versucht das Programm die WiFi-Verbindung neu aufzubauen. Der Wert der Variable Start wird auf true gesetzt, im loop-Teil wird die Zeit sofort aktualisiert. - ntp.isValid() gibt true zurück, wenn die ermittelte Zeit gültig ist. Ist das nicht der Fall, versucht das Programm die WiFi-Verbindung neu aufzubauen. Die Variable Start wird auf true gesetzt und die Zeit wird sofort aktualisiert.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
void ZeitAnzeigen() { if (ntp.update()) { // überprüfen ob die Zeit gültig ist if (ntp.isValid()) { Sekunden = ntp.seconds(); oled.setCursor(1, 20); oled.setFont(u8g2_font_helvB14_tf); oled.print(ntp.formattedTime("%d. %m %Y")); // horizontale Linie oled.drawHLine(1, 26, oled.getDisplayWidth()); oled.setCursor(2, 63); // Uhrzeit oled.setFont(u8g2_font_logisoso32_tf); oled.print(ntp.formattedTime("%H:%M")); oled.sendBuffer(); oled.clearBuffer(); } // Zeit ist nicht gültig else { // prüfen, ob WiFi verbunden ist while (WiFi.status() != WL_CONNECTED) { delay(200); Serial.print("."); } Start = true; } } // WiFi ist nicht verbunden else { // prüfen, ob WiFi verbunden ist while (WiFi.status() != WL_CONNECTED) { delay(200); Serial.print("."); } Start = true; } } |
Quellen
- Bibliothek WiFi.h
- Bibliothek ESP8266WiFi
- Bibliothek WiFiNINA
- ESP32-WiFi API
- ESP8266-WiFi API
- Bibliothek NTP3
Ähnliche Projekte
- Analoge Uhr mit BME280 auf ESP32 mit 3,5 Zoll/4 Zoll TFT
- Analoge Uhr mit TFT 240×240 Pixeln und RTC-Modul
- Analoge Uhr mit TFT-Shield und BME280
- Datum und Zeit mit ESP und time.h anzeigen
- Messwerte des DHT-Sensors und Zeit auf TFT anzeigen
- Stoppuhr
- Messwerte DHT-Sensor und Zeit auf Waveshare E-Ink 4,2 Zoll anzeigen
- Analoge Uhr mit TFT 240×240 Pixeln und WiFi
- Uhrzeit auf LED-Matrix anzeigen
- Zeit mit time.h auf einem TFT anzeigen
Letzte Aktualisierung:
