Dieses Tutorial ist Teil von: ESP32-S3 RGB-LED-Matrix
Ein cooles Projekt zum Nachbauen – sowohl für Spaß als auch für praktische Anwendungen – mit dem ESP32-S3 RGB-Matrix-Modul. Links zu weiteren Videos finden Sie unter diesem Artikel.
ESP32-S3 RGB-LED-Matrix Wi-Fi + NTP-Uhrzeit-Projekt - 1 Grundlegende Uhr
ESP32-S3 Internetuhr mit 8×8 NeoMatrix (Wi-Fi + NTP-Zeit)
Dieses Projekt verwandelt einen ESP32-S3 und eine 8×8 RGB NeoMatrix (NeoPixel/WS2812) in eine winzige Internetuhr. Der ESP32 verbindet sich mit Wi-Fi, synchronisiert die lokale Zeit von einem NTP-Server und scrollt dann die Zeit alsHH:MMüber das 8×8-Display.

Wie es funktioniert (hochrangig)
1) ESP32-S3 verbindet sich mit Ihrem Router über<WiFi.h>.
Es synchronisiert die Zeit von einem NTP-Server über"time.h"undconfigTime().
Die Zeit ist formatiert alsHH:MMund in einem kleinen Textpuffer gespeichert.
4) Das NeoMatrix zeigt den Text an und scrollt ihn über das 8×8-Panel.

RGB-Farbe
Die Textfarbe der Uhr wird mit RGB-Werten (Rot, Grün, Blau) gesteuert, wobei jeder Farbkanal von 0 bis 255 reicht und verschiedene Kombinationen unterschiedliche Farben auf der NeoMatrix erzeugen. Durch das Anpassen dercolor_RED,color_GREEN, undcolor_BLUEVariablen, Sie können das Erscheinungsbild der Uhr ganz einfach in jede Farbe anpassen, die Sie mögen. Um die genauen RGB-Werte für eine bestimmte Farbe schnell zu finden, können Sie den Online-RGB-Farbwähler verwenden.Farbauswahl.

Verwendete Bibliotheken
Diese Angaben sagen Ihnen genau, worauf die Skizze basiert:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>InstallierenAdafruit NeoMatrixverwenden des Arduino-Bibliotheksmanagers. Es werden auch erforderliche Abhängigkeiten wie heruntergeladen.Adafruit GFX LibraryundAdafruit NeoPixel.
Wichtige Benutzereinstellungen, die Sie BEARBEITEN MÜSSEN
1) Textfarbe (RGB)
Stellen Sie die Textfarbe Ihrer Uhr mit Werten von 0-255 ein:
//set the color of display made of Red, Green and Blue
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;Diese Werte werden hier verwendet:
matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE));Hinweis:Wenn Sie alle Farben auf 0 (schwarz) setzen, wird der Text unsichtbar. Die Skizze enthält eine Sicherheitsüberprüfung:
// if user set all colors to 0, the display will be turned off so set it green
if (color_RED == 0 && color_GREEN == 0 && color_BLUE == 0) {
color_GREEN = 200;
}Das sorgt dafür, dass die Matrix niemals "tot" aussieht wegen einer unsichtbaren Farbeinstellung.
2) Wi-Fi SSID und Passwort
Ersetzen Sie diese durch Ihren echten WLAN-Namen und Ihr Passwort:
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";Beim Starten zeigt das ESP32 den Verbindungsfortschritt im Serial Monitor an und läuft nach etwa 15 Sekunden ab (30 Versuche × 500 ms).
3) NTP-Server
Der Standard-NTP-Server ist:
const char* ntpServer = "pool.ntp.org";Sie können es so belassen, wie es ist. Wenn Sie jemals einen lokalen Server verwenden möchten, ersetzen Sie den Hostnamen durch Ihren bevorzugten NTP-Server.
4) Zeitverschiebung und Sommerzeitverschiebung
Diese beiden Einstellungen steuern die lokale Zeit:
// Toronto-ish: UTC-5, plus 1 hour DST
const long gmtOffset_sec = -5 * 3600; // -5 hours
const int daylightOffset_sec = 3600; // +1 hour for DSTWie man sie einstellt:
gmtOffset_sec= (UTC Offset-Stunden) × 3600. Beispiel: UTC-5 →-5*3600, UTC+2 →2*3600.daylightOffset_sec=0wenn Sie keine Sommerzeit-Anpassung wünschen, oder3600wenn Ihre Region derzeit die Sommerzeit (UTC+1) beobachtet.
Diese werden hier angewendet:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);Anzeigeeinstellungen
Matrixdatenpin
Der Daten-Pin ist hier definiert:
#define MATRIX_PIN 14Wenn Ihre Verdrahtung einen anderen GPIO verwendet, ändern Sie diese Nummer entsprechend.
NeoMatrix Layout + Farbanordnung
Ihre Matrix wird wie folgt initialisiert:
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);Zwei häufige Gründe, warum das Display "falsch" aussieht:
- Drehung / Verdrahtungsrichtung:Wenn der Text auf dem Kopf steht oder gespiegelt ist, passen Sie die
NEO_MATRIX_*Flags (OBEN/U unten, LINKS/Rechts, REIHEN/SPALTEN, FORTSCHREIBEND/ZIGZAG). - Farbauftrag:Dieser Code verwendet
NEO_RGBEinige Paneele sindNEO_GRB. Wenn Rot/Grün/Blau nicht übereinstimmen, ändern Sie.NEO_RGBzur richtigen Reihenfolge.
Helligkeit
Helligkeit ist eingestellt aufinitMatrix():
matrix.setBrightness(40);Erhöhen für eine hellere Anzeige, reduzieren um Wärme und Stromverbrauch zu senken.
Wie die Zeit erzeugt wird alsHH:MM
Die Uhr speichert die formatierte Zeit in einem 6-Zeichen-Puffer:
char timeText[6] = "00:00";DannupdateTimeText()liest NTP-synchronisierte lokale Zeit und schreibt den Text:
// Format HH:MM
snprintf(timeText, sizeof(timeText), "%02d:%02d",
timeinfo.tm_hour,
timeinfo.tm_min);Dies wird einmal pro Sekunde in der Hauptschleife aktualisiert.
Wie das Scrollen auf einem 8×8-Display funktioniert
Eine 8×8-Matrix ist zu schmal, um angezeigt zu werden.HH:MMso scrollt die Skizze den Text. Sie zeichnet die Zeit an einer sich ändernden X-Position.scrollX), dann verschiebt es es bei jedem Update um ein Pixel nach links.
int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;Jeder Scroll-Schritt:
matrix.fillScreen(0);
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;Wenn der Text die linke Seite vollständig verlässt, setzt der Code ihn zurück, um erneut von der rechten Kante zu beginnen:
int16_t textWidth = 30;
if (scrollX < -textWidth) {
scrollX = matrix.width();
}Serieller Monitor-Ausgang (Debugging)
Dieser Sketch druckt nützliche Nachrichten:
- Wi-Fi-Verbindungsfortschritt und IP-Adresse
- Ob die Zeitsynchronisierung erfolgreich war
- Der formatierte Zeitstring (z. B.,
Time text: 14:32)
Wenn das Display leer ist, ist der Serial Monitor der erste Ort, den man überprüfen sollte, um zu bestätigen, dass Wi-Fi und NTP funktionieren.
Projektvorführung
Nach dem Hochladen und Zurücksetzen:
- ESP32 verbindet sich mit Wi-Fi
- Synchronisiert die Zeit von
pool.ntp.org - Shows
OKkurz zur Matrix - Scrollt kontinuierlich die aktuelle Zeit als
HH:MM
Downloads und Links
Der vollständige Code ist unterhalb dieses Artikels verfügbar. Teile, Werkzeuge und Datenblätter sind ebenfalls unterhalb dieses Artikels verlinkt.
Dieses Tutorial ist Teil von: ESP32-S3 RGB-LED-Matrix
- ESP32-S3 RGB-LED-Matrix-Projekte (Kippspiel, Text, Pfeil, WiFi-Demo)
- ESP32-S3 RGB-LED-Matrix-Projekt 2 - Lauftext
- ESP32-S3 RGB-LED-Matrix-Projekt 3 - Text vom Mobiltelefon
- ESP32-S3 RGB-LED-Matrix-Projekt 4 - Neigungspunkt
- ESP32-S3 RGB-LED-Matrix-Projekt 5 - Pfeil immer nach oben
- ESP32-S3 RGB-LED-Matrix-Projekt 6 - Cible-Spiel
- ESP32-S3 RGB-LED-Matrix-Internet-Uhrprojekt - 2-Uhr mehrfarbige Zeit- und Datumsanzeige
- ESP32-S3 RGB-LED-Matrix-Internet-Uhr-Projekt - 3 Nachtfarben mit Datum
- ESP32-S3 RGB-LED-Matrix-Internet-Uhr-Projekt - 5 Regenbogenfarben
- ESP32-S3 RGB-LED-Matrix-Internet-Uhr Projekt - 4 Zufallsfarben
- ESP32-S3 RGB-LED-Matrix-Test für RGB-, GRB-Einstellung
/*
This is ESP32 sketch that connects to the internet, gets the time and displays it on the RGB matrix
you must set your WiFi correctly to make sure it gets connected.
watch video https://youtube.com/shorts/4iWjLiD7fS8
📚⬇️ Download and resource page https://robojax.com/RJT838
* Author: Ahmad Shamshiri (Robojax.com)
* Date: 07 Jan 2026
www.Robojax.com
https://youTube.com/@robojax
*/
#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
//set the color of diplay make of Red, Green and Blue
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;
// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
#define MATRIX_PIN 14
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);
char timeText[6] = "00:00";
int16_t scrollX = 8;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 120;
unsigned long lastTimeUpdateMs = 0;
const uint16_t timeUpdateIntervalMs = 1000;
//prototypes
bool updateTimeText(); // forward declaration
void scrollTime(); // forward declaration
// NTP (time) server
const char* ntpServer = "pool.ntp.org";
// Toronto-ish: UTC-5, plus 1 hour DST
const long gmtOffset_sec = -5 * 3600; // -5 hours
const int daylightOffset_sec = 3600; // +1 hour for DST
bool updateTimeText() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time for display");
return false;
}
// Format HH:MM
snprintf(timeText, sizeof(timeText), "%02d:%02d",
timeinfo.tm_hour,
timeinfo.tm_min);
Serial.print("Time text: ");
Serial.println(timeText);
return true;
}
void scrollTime() {
matrix.fillScreen(0);
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;
// Rough width: 5 characters ("HH:MM") × 6 pixels each ≈ 30 px
int16_t textWidth = 30;
if (scrollX < -textWidth) {
scrollX = matrix.width(); // reset to right edge (8)
}
}
void initMatrix() {
matrix.begin();
matrix.setBrightness(40); // be careful with heat
matrix.setTextWrap(false);
matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE)); // color of text
}
void showMessage(const char* msg) {
matrix.fillScreen(0);
matrix.setCursor(0, 0); // top-left
matrix.print(msg);
matrix.show();
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return;
}
// Format: 2025-11-18 14:35:12
Serial.printf("%04d-%02d-%02d %02d:%02d:%02d\n",
timeinfo.tm_year + 1900,
timeinfo.tm_mon + 1,
timeinfo.tm_mday,
timeinfo.tm_hour,
timeinfo.tm_min,
timeinfo.tm_sec);
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println();
Serial.println("ESP32-S3 Internet Clock - WiFi + NTP test");
// Connect to WiFi
Serial.print("Connecting to WiFi: ");
Serial.println(WIFI_SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
int retries = 0;
while (WiFi.status() != WL_CONNECTED && retries < 30) { // ~15s timeout
delay(500);
Serial.print(".");
retries++;
}
Serial.println();
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi connection FAILED");
} else {
Serial.print("WiFi connected. IP: ");
Serial.println(WiFi.localIP());
}
// if user set all colors to 0, the dispaly will be turned off so set it green
if(color_RED ==0 & color_GREEN ==0 && color_BLUE ==0)
{
color_GREEN = 200;
}
// Configure time via NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("Waiting for time...");
delay(2000); // small wait for initial sync
printLocalTime(); // print once at startup
// NEW: init the LED matrix and show a test message
initMatrix();
showMessage("OK");
}
void loop() {
unsigned long now = millis();
// Update the time string "HH:MM" once per second
if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
lastTimeUpdateMs = now;
updateTimeText(); // fills timeText[], e.g. "14:32"
}
// Scroll the time across the 8×8 every scrollIntervalMs
if (now - lastScrollMs >= scrollIntervalMs) {
lastScrollMs = now;
scrollTime(); // uses timeText and scrollX
}
}
Dinge, die Sie vielleicht brauchen
-
Amazon
-
eBay
-
AliExpressESP32-S3 RGB-Matrix von AliExpress kaufen (2)s.click.aliexpress.com
-
AliExpressKaufen Sie das ESP32-S3 RGB-Matrix von AliExpress.s.click.aliexpress.com
Ressourcen & Referenzen
-
Video
Dateien📁
Fritzing-Datei
-
esp32-S3-supermini-tht Fritzing-Teil
esp32-S3-supermini-tht.fzpz0.02 MB