In diesem Beitrag möchte ich dir zeigen, wie du am neuen Arduino UNO R4 WiFi eine Laufschrift auf der LED Matrix erzeugst. Als Beispiel möchte ich hier eine Uhrzeit anzeigen, welche ich von einem NTP Server empfange.
Mit diesem Beitrag möchte ich an den bereits veröffentlichten Beitrag Leicht gemacht: Laufschrift auf dem Arduino UNO R4 programmieren anknüpfen. Zu diesem Beitrag habe ich einen Kommentar erhalten, in welchem darauf hingewiesen wurde, dass es eine sehr einfache Lösung dafür gibt.
Inhaltsverzeichnis
- Benötigte Ressourcen für dieses Projekt
- Programmieren einer Laufschrift in der Arduino IDE am Arduino UNO R4 WiFi
Benötigte Ressourcen für dieses Projekt
Wenn du dieses kleine Projekt nachbauen möchtest, dann benötigst du lediglich einen Arduino UNO R4 WiFi inkl. Datenkabel.
Diesen Mikrocontroller bekommst du, nachdem nun etwas mehr Zeit seit dem Release vergangen ist, recht günstig auf diversen Plattformen.
Link | Preis | Versandkosten |
---|---|---|
https://www.reichelt.de/ | 26,50 € | 5,95 € |
https://botland.de/ | 27,90 € | 4,95 € |
https://store.arduino.cc/ | 25 € | 10 € |
https://www.ebay.de/* | ab 23 € | – |
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Programmieren einer Laufschrift in der Arduino IDE am Arduino UNO R4 WiFi
Kommen wir zunächst zu einem einfachen Beispiel und geben einen Text auf der LED Matrix des Arduino UNO R4 WiFi aus.
Für das erzeugen eines Text als Scrolltext benötigen wir die Bibliothek Arduino Graphics.
Die Bibliothek findest du mit dem Suchbegriff „Arduino Graphics“ im Bibliotheksverwalter.
In meinem Fall liegt derzeit die Version 1.1.0 vor.
//einbinden der Bibliotheken zum //ansteuern der LED Matrix auf dem //Arduino UNO R4 WiFi #include "ArduinoGraphics.h" #include "Arduino_LED_Matrix.h" //erzeugen eines ArduinoLEDMatrix Objektes ArduinoLEDMatrix matrix; void setup() { //beginn der kommunikation mit der LED Matrix matrix.begin(); } void loop() { //beginn des zeichnens matrix.beginDraw(); //alle LEDs deaktivieren matrix.stroke(0xFFFFFFFF); //Geschwindigkeit des Scrolltextes setzen //je niedriger der Wert desto schneller läuft der Text matrix.textScrollSpeed(50); //der Text welcher ausgegeben werden soll const char text[] = " Hallo Welt! "; //Schriftgröße setzen, //verfügbare Werte sind: // - Font_4x6 // - Font_5x7 matrix.textFont(Font_4x6); //koordinate für den Text //je nach Schriftgröße kann man damit den Text //in der Matrix zentrieren matrix.beginText(0, 1, 0xFFFFFF); //Ausgeben des Textes matrix.println(text); //definieren von wo gescrollt werden soll matrix.endText(SCROLL_LEFT); //beenden des zeichnens matrix.endDraw(); }
Beispiel – auslesen eines Zeitstempels vom NTP-Server und anzeigen auf der LED Matrix
Der Arduino UNO R4 WiFi verfügt, wie der Name es erahnen lässt, über ein zusätzliches WiFi Modul. In diesem Fall ist es ein ESP32-S3-MINI. Über dieses WiFi Modul können wir jetzt mit dem Internet kommunizieren und so auch einen Zeitstempel (Datum & Uhrzeit) von einem NTP Server lesen.
Ein NTP Server ist ein Dienst, über welchen wir eine sehr genaue Zeit erhalten können. Jedoch gibt es hier auch immer ein delay beim Lesen, jedoch wird dieses über das Protokoll sehr minimiert, sodass die Zeit immer sehr genau ankommt.
Schritt 1 – Aufbau der WiFi Verbindung zum Heimnetzwerk
Zunächst müssen wir eine Verbindung zum lokalen Heimnetzwerk aufbauen. Ich habe mir hier das Beispiel ConnectwithWPA.ino vom GitHub Repository arduino / ArduinoCore-renesas gezogen und auf das Minimum gekürzt.
#include <WiFiS3.h> char ssid[] = ""; char pass[] = ""; int status = WL_IDLE_STATUS; void setup() { Serial.begin(9600); Serial.println("Verbindungsaufbau zu: " + String(ssid)); int connectionCounter = 0; while (status != WL_CONNECTED) { Serial.print("."); status = WiFi.begin(ssid, pass); delay(250); if ((connectionCounter % 10) == 0) { Serial.println(); } connectionCounter++; } IPAddress ip = WiFi.localIP(); Serial.print("verbunden mit der IP Adresse: " + ip.toString()); } void loop() { }
Wenn der Mikrocontroller startet, dann wird zunächst die Verbindung aufgebaut. Während des Aufbaus wird ein Punkt geschrieben, somit kann man nachvollziehen wie oft nun schon ein Aufbau probiert wurde.
Bei Erfolg wird dann die IP-Adresse ausgegeben.
Schritt 2 – Auslesen eines Zeitstempels von einem NTP Server
Damit wir mit einem NTP Server kommunizieren können und somit den Zeitstempel erhalten, müssen wir eine zusätzliche Bibliothek installieren
Ich habe sehr gute Erfahrung mit der Bibliothek NTPClient von Fabrice Weinberg gesammelt und dir auch bereits am Beispiel ESP8266 – NTP Protokoll für das lesen eines genauen Zeitstempels gezeigt wie man die Daten auslesen und im seriellen Monitor anzeigen lassen kann.
Wenn du das kleine Beispiel ausführst, dann kann es besonders am Anfang vorkommen, dass kein vollständiger / gültiger Zeitstempel empfangen wird (1). Hier hilft es eine kleine Abfrage einzubauen, ob der Wert größer als 1707219755 ist. (Wir können ja schließlich nicht in die Zeit zurückreisen.)
#include <WiFiS3.h> #include <NTPClient.h> #include <WiFiUdp.h> char ssid[] = ""; char pass[] = ""; int status = WL_IDLE_STATUS; // the WiFi radio's status WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org"); //Wochentage, im englischen beginnt die Woche mit dem Sonntag char* wochentage[7] = { "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa" }; void setup() { Serial.begin(9600); Serial.println("Verbindungsaufbau zu: " + String(ssid)); int connectionCounter = 0; while (status != WL_CONNECTED) { Serial.print("."); status = WiFi.begin(ssid, pass); delay(250); if ((connectionCounter % 10) == 0) { Serial.println(); } connectionCounter++; } IPAddress ip = WiFi.localIP(); Serial.println("verbunden mit der IP Adresse: " + ip.toString()); timeClient.begin(); //Offset in Sekunden zur GMT +/- 0 Zeitzone //Für Deutschland muss man 1h = 3600 Sekunden nehmen, //je nach Sommer- /Winterzeit muss jedoch diese //Zeit wieder abgezogen werden. timeClient.setTimeOffset(3600); } void loop() { timeClient.update(); //Zeitstempel auf der Sekunde genau //(Nicht zuverwechseln mit dem UNIX Timestamp welcher auf die Millisekunde genau ist.) unsigned long epochTime = timeClient.getEpochTime(); //Ein gültiger & aktueller Zeitstempel ist größer als 1707219755 if (epochTime < 1707219755) { delay(25); return; } Serial.print("Epoch Time: "); Serial.println(epochTime); //Ausgabe des formatierten Zeitstempels String formattedTime = timeClient.getFormattedTime(); Serial.print("formatierter Zeitstempel: "); Serial.println(formattedTime); //einzelne Werte der Uhrzeit lesen int aktuellerTag = timeClient.getDay(); int aktuelleStunde = timeClient.getHours(); int aktuelleMinute = timeClient.getMinutes(); int aktuelleSekunde = timeClient.getSeconds(); char timestamp[20]; sprintf(timestamp, "Heute ist %s, %2d:%2d:%2d", wochentage[aktuellerTag], aktuelleStunde, aktuelleMinute, aktuelleSekunde); Serial.println(timestamp); delay(500); }
Schritt 3 – Ausgeben der Zeit auf der LED Matrix
Zum Schluss wollen wir nun die Zeit auf der LED Matrix ausgeben. Dazu nehmen wir uns zusätzlich das kleine Codebeispiel vom Anfang und binden dieses ein.
#include <WiFiS3.h> #include "ArduinoGraphics.h" #include "Arduino_LED_Matrix.h" #include <NTPClient.h> #include <WiFiUdp.h> char ssid[] = ""; char pass[] = ""; int status = WL_IDLE_STATUS; // the WiFi radio's status WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org"); //erzeugen eines ArduinoLEDMatrix Objektes ArduinoLEDMatrix matrix; //Wochentage, im englischen beginnt die Woche mit dem Sonntag char* wochentage[7] = { "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa" }; void setup() { Serial.begin(9600); Serial.println("Verbindungsaufbau zu: " + String(ssid)); int connectionCounter = 0; while (status != WL_CONNECTED) { Serial.print("."); status = WiFi.begin(ssid, pass); delay(250); if ((connectionCounter % 10) == 0) { Serial.println(); } connectionCounter++; } IPAddress ip = WiFi.localIP(); Serial.println("verbunden mit der IP Adresse: " + ip.toString()); timeClient.begin(); //Offset in Sekunden zur GMT +/- 0 Zeitzone //Für Deutschland muss man 1h = 3600 Sekunden nehmen, //je nach Sommer- /Winterzeit muss jedoch diese //Zeit wieder abgezogen werden. timeClient.setTimeOffset(3600); matrix.begin(); } void loop() { timeClient.update(); //Zeitstempel auf der Sekunde genau //(Nicht zuverwechseln mit dem UNIX Timestamp welcher auf die Millisekunde genau ist.) unsigned long epochTime = timeClient.getEpochTime(); //Ein gültiger & aktueller Zeitstempel ist größer als 1707219755 while (epochTime < 1707219755) { epochTime = timeClient.getEpochTime(); delay(25); } //Wochentag auslesen int aktuellerTag = timeClient.getDay(); //auslesen der Stunde int aktuelleStunde = timeClient.getHours(); //auslesen der Minuten int aktuelleMinute = timeClient.getMinutes(); //Aufbau der formatierten Ausgabe auf der LED Matrix //Es wurden die Sekunden entfernt. char timestamp[19]; snprintf(timestamp, 20, "%s, %2d:%2d ", wochentage[aktuellerTag], aktuelleStunde, aktuelleMinute); matrix.beginDraw(); matrix.stroke(0xFFFFFFFF); matrix.textScrollSpeed(75); matrix.textFont(Font_5x7); matrix.beginText(0, 1, 0xFFFFFF); matrix.println(timestamp); matrix.endText(SCROLL_LEFT); matrix.endDraw(); delay(500); }
1 thought on “Arduino UNO R4: LED Matrix Uhr mit NTP-Zeitsynchronisation”