


Ziel des Projekts
Auf verschiedenen Mikrocontrollern mit WiFi-Funktion soll eine digitale Uhr auf einem TFT angezeigt werden. Der Bildschirmaufbau wird mit der ⇒GFXcanvas der Bibliothek Adafrui GFX realisiert.



Konfiguration der Mikrocontroller
- 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-C5 Zero
- ESP32-C6 Zero
- Wemos D1 Mini
SPI-Pins der Mikrocontroller
- 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-C5 Zero
- ESP32-C6 Zero
- Wemos D1 Mini
Schriftarten
Du kannst entweder die lokal installierten Schriften der ⇒Bibliothek Adafruit_GFX oder auf dieser Basis neue Schriftgrößen erstellen. Die internen Schriften haben eine maximale Größe von 24 Punkten. Die Darstellung von Umlauten und Sonderzeichen ist nicht möglich.
Auf der Seite ⤷https://rop.nl/truetype2gfx/ kannst du von den verfügbaren freien Schriftarten neue Schriftgrößen erstellen. Allerdings verwenden diese Schriften auch nur den einfachen ASCII-Zeichensatz.

Die neu erstellte Schrift befindet sich anschließend in deinem Download-Ordner. Jetzt musst du sie noch in den Ordner
Arduino/libraries/Adafruit_GFX_Library/Fonts
kopieren.
Benötigte Bibliotheken




Das Programm (TFT 320×240 Pixel)
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
|
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
#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 "Adafruit_ILI9341.h" // interne Schrift #include "Fonts/FreeSans24pt7b.h" #include "Fonts/FreeSans18pt7b.h" #include "Fonts/FreeSans12pt7b.h" #include "Fonts/FreeSans32pt7b.h" #include "Fonts/FreeSans40pt7b.h" #include "Fonts/FreeSans60pt7b.h" #include "NTP3.h" // SSID und Passwort des Routers char Router[] = "Repeater-Buero"; char Passwort[] = "xxxxxxxx"; WiFiUDP wifiUdp; NTP3 ntp(wifiUdp); // Arduino UNO R4 WiFi // #define TFT_CS 10 // #define TFT_RST 8 // #define TFT_DC 9 // XIAO // #define TFT_CS D7 // #define TFT_RST D1 // #define TFT_DC D2 // Arduino Nano ESP32 // #define TFT_CS 10 // #define TFT_RST 9 // #define TFT_DC 8 // SPI-Pins ESP32-C6 // #define TFT_CS 18 // #define TFT_RST 3 // #define TFT_DC 2 // ESP32-WROOM #define TFT_CS 5 #define TFT_RST 4 #define TFT_DC 2 // ESP32-S3 // #define TFT_CS 10 // #define TFT_RST 5 // #define TFT_DC 4 // ESP32-C6-Zero // #define TFT_CS 18 // #define TFT_RST 3 // #define TFT_DC 2 // ESP32-C3 Zero/ESP32-C3 Super Mini // #define TFT_CS 7 // #define TFT_RST 3 // #define TFT_DC 2 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST); // 1-Bit Canvas definieren GFXcanvas1 Bereich(320, 240); // Farben #define SCHWARZ 0x0000 #define WEISS 0xFFFF // beim Start des loop-Teils wird die Zeit einmalig synchronisiert volatile bool Start = true; unsigned long Zeitmessung = 0; int Sekunden; |
Der setup-Teil
Den erfolgreichen Start des Programms kannst du auf dem Display beobachten:

Es gibt einige weitere Anpassungen für ESP32-Mikrocontroller.
|
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 |
void setup() { Serial.begin(9600); delay(1000); // TFT starten tft.begin(); // Rotation anpassen tft.setRotation(1); // schwarzer Hintergrund tft.fillScreen(SCHWARZ); tft.setCursor(10, 40); tft.setFont(&FreeSans18pt7b); tft.print("WiFi verbinden ..."); // WiFi starten DHCP WiFi.begin(Router, Passwort); #ifdef ESP32 WiFi.mode(WIFI_MODE_STA); WiFi.setSleep(false); WiFi.setAutoReconnect(true); ntp.syncRTC(true); #endif while(WiFi.status() != WL_CONNECTED) { delay(200); Serial.print("."); } /* 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 ntp.begin(); // WiFi-Daten anzeigen tft.setCursor(10, 90); tft.print("IP: "); tft.print(WiFi.localIP()); tft.setCursor(10, 140); tft.print(WiFi.SSID()); tft.setCursor(10, 190); tft.print("RSSI: "); tft.print(WiFi.RSSI()); delay(5000); Zeitmessung = millis() + 1000; } |
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
void ZeitAnzeigen() { if (ntp.update()) { // überprüfen ob die Zeit gültig ist if (ntp.isValid()) { Sekunden = ntp.seconds(); // Canvas erstellen Bereich.fillScreen(0x0000); Bereich.setFont(&FreeSans18pt7b); Bereich.setCursor(10, 30); switch(ntp.weekDay()) { case 0: Bereich.print("Sonntag"); break; case 1: Bereich.print("Montag"); break; case 2: Bereich.print("Dienstag"); break; case 3: Bereich.print("Mittwoch"); break; case 4: Bereich.print("Donnertag"); break; case 5: Bereich.print("Freitag"); break; case 6: Bereich.print("Samstag"); break; } // Datum Bereich.setCursor(10, 80); Bereich.print(ntp.formattedTime("%d. %m. %Y")); Bereich.drawFastHLine(1, 90, tft.width(), WEISS); Bereich.setCursor(10, 200); // Zeit Bereich.setFont(&FreeSans60pt7b); Bereich.setTextColor(WEISS); Bereich.print(ntp.formattedTime("%H:%M")); // Canvas anzeigen tft.drawBitmap(1,1, Bereich.getBuffer(), Bereich.width(), Bereich.height(), 0xFFFF, 0x0000); } // 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; } } |
Der loop-Teil
|
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(); } } |
Quellen
- Funktionen der Bibliothek Adafruit Graphics
- Adafruit GFXcanvas1
- WiFi mit UNO R4 WiFi
- WiFi mit Nano MKR WiFi 1010
- WiFi mit Nano 33 IoT
- Espresif WiFi API
- NodeMCU 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 time.h auf einem OLED anzeigen
- Datum und Zeit mit dem NTP-Protokoll auf einem OLED 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 4-fach LED-Matrix anzeigen
Letzte Aktualisierung: