Ten poradnik jest częścią: Matryca LED RGB ESP32-S3
Fajny projekt do stworzenia dla zabawy i praktycznych zastosowań z wykorzystaniem modułu matrycy RGB ESP32-S3. Linki do innych filmów znajdują się poniżej tego artykułu.
Projekt zegara czasu Wi-Fi + NTP z matrycą LED RGB ESP32-S3 -1 Zegar podstawowy
Zegar internetowy ESP32-S3 z wyświetlaczem 8×8 NeoMatrix (Wi-Fi + czas NTP)
Ten projekt zamienia ESP32-S3 i wyświetlacz 8×8 RGB NeoMatrix (NeoPixel/WS2812) w mały zegar internetowy. ESP32 łączy się z Wi-Fi, synchronizuje czas lokalny z serwera NTP, a następnie przewija czas w formacie HH:MM na wyświetlaczu 8×8.

Jak to działa (na wysokim poziomie)
1) ESP32-S3 łączy się z routerem za pomocą <WiFi.h>.
2) Synchronizuje czas z serwera NTP za pomocą "time.h" i configTime().
3) Czas jest formatowany jako HH:MM i zapisywany w małym buforze tekstowym.
4) NeoMatrix renderuje tekst i przewija go na panelu 8×8.

Kolor RGB
Kolor tekstu zegara jest kontrolowany za pomocą wartości RGB (czerwony, zielony, niebieski), gdzie każdy kanał koloru ma zakres od 0 do 255, a różne kombinacje tworzą różne kolory na NeoMatrix. Dostosowując zmienne color_RED, color_GREEN i color_BLUE, możesz łatwo zmienić wygląd zegara na dowolny kolor. Aby szybko znaleźć dokładne wartości RGB dla konkretnego koloru, możesz skorzystać z internetowego narzędzia do wyboru kolorów RGB Color Picker .

Użyte biblioteki
Te dołączenia dokładnie pokazują, od czego zależy szkic:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
Zainstaluj Adafruit NeoMatrix za pomocą Menedżera bibliotek Arduino. Automatycznie pobierze również wymagane zależności, takie jak Adafruit GFX Library i Adafruit NeoPixel.
Ważne ustawienia użytkownika, które MUSISZ edytować
1) Kolor tekstu (RGB)
Ustaw kolor tekstu zegara za pomocą wartości 0–255:
//ustaw kolor wyświetlacza składający się z czerwonego, zielonego i niebieskiego
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;
Te wartości są używane tutaj:
matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE));
Uwaga: Jeśli ustawisz wszystkie kolory na 0 (czarny), tekst stanie się niewidoczny. Szkic zawiera zabezpieczenie:
// jeśli użytkownik ustawi wszystkie kolory na 0, wyświetlacz zostanie wyłączony, więc ustaw na zielony
if (color_RED == 0 && color_GREEN == 0 && color_BLUE == 0) {
color_GREEN = 200;
}
Dzięki temu matryca nigdy nie będzie wyglądać na „martwą” z powodu niewidocznego ustawienia koloru.
2) Nazwa i hasło Wi-Fi
Zastąp te wartości swoją prawdziwą nazwą i hasłem Wi-Fi:
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
Podczas uruchamiania ESP32 wyświetla postęp połączenia w monitorze szeregowym i kończy działanie po około 15 sekundach (30 prób × 500 ms).
3) Serwer NTP
Domyślny serwer NTP to:
const char* ntpServer = "pool.ntp.org";
Możesz go zostawić bez zmian. Jeśli kiedykolwiek zechcesz użyć lokalnego serwera, zastąp nazwę hosta preferowanym serwerem NTP.
4) Przesunięcie strefy czasowej i przesunięcie czasu letniego
Te dwa ustawienia kontrolują czas lokalny:
// Toronto-podobne: UTC-5, plus 1 godzina DST
const long gmtOffset_sec = -5 * 3600; // -5 godzin
const int daylightOffset_sec = 3600; // +1 godzina dla DST
Jak je ustawić:
gmtOffset_sec= (przesunięcie UTC w godzinach) × 3600. Przykład: UTC-5 →-5*3600, UTC+2 →2*3600.daylightOffset_sec=0, jeśli nie chcesz uwzględniać czasu letniego, lub3600, jeśli twój region obecnie stosuje czas letni (+1 godzina).
Te wartości są stosowane tutaj:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Konfiguracja wyświetlacza
Pin danych matrycy
Pin danych jest zdefiniowany tutaj:
#define MATRIX_PIN 14
Jeśli twoje połączenie używa innego GPIO, zmień ten numer, aby pasował.
Układ NeoMatrix + kolejność kolorów
Twoja matryca jest inicjalizowana w ten sposób:
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);
Dwa częste powody, dla których wyświetlacz wygląda „źle”:
- Obrót / kierunek połączenia: Jeśli tekst jest do góry nogami lub odbity lustrzanie, dostosuj flagi
NEO_MATRIX_*(TOP/BOTTOM, LEFT/RIGHT, ROWS/COLUMNS, PROGRESSIVE/ZIGZAG). - Kolejność kolorów: Ten kod używa
NEO_RGB. Niektóre panele mająNEO_GRB. Jeśli czerwony/zielony/niebieski nie pasują, zmieńNEO_RGBna właściwą kolejność.
Jasność
Jasność jest ustawiana w initMatrix():
matrix.setBrightness(40);
Zwiększ, aby uzyskać jaśniejszy wyświetlacz, zmniejsz, aby obniżyć ciepło i pobór mocy.
Jak czas jest generowany jako HH:MM
Zegar przechowuje sformatowany czas w 6-znakowym buforze:
char timeText[6] = "00:00";
Następnie funkcja updateTimeText() odczytuje czas lokalny zsynchronizowany z NTP i zapisuje tekst:
// Format HH:MM
snprintf(timeText, sizeof(timeText), "%02d:%02d",
timeinfo.tm_hour,
timeinfo.tm_min);
Jest to aktualizowane raz na sekundę w pętli głównej.
Jak działa przewijanie na wyświetlaczu 8×8
Matryca 8×8 jest zbyt wąska, aby pokazać HH:MM jednocześnie, dlatego szkic przewija tekst. Rysuje czas w zmieniającej się pozycji X (scrollX), a następnie przesuwa go w lewo o jeden piksel przy każdej aktualizacji.
int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;
Każdy krok przewijania:
matrix.fillScreen(0);
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;
Gdy tekst całkowicie zniknie po lewej stronie, kod resetuje go, aby zaczął ponownie od prawej krawędzi:
int16_t textWidth = 30;
if (scrollX < -textWidth) {
scrollX = matrix.width();
}
Wyjście monitora szeregowego (debugowanie)
Ten szkic wypisuje przydatne komunikaty:
- Postęp połączenia Wi-Fi i adres IP
- Czy synchronizacja czasu się powiodła
- Sformatowany ciąg czasu (np.
Tekst czasu: 14:32)
Jeśli wyświetlacz jest pusty, monitor szeregowy jest pierwszym miejscem do sprawdzenia, aby potwierdzić, że Wi-Fi i NTP działają.
Demonstracja projektu
Po wgraniu i zresetowaniu:
- ESP32 łączy się z Wi-Fi
- Synchronizuje czas z
pool.ntp.org - Krótko pokazuje
OKna matrycy - Ciągle przewija bieżący czas w formacie
HH:MM
Pliki do pobrania i linki
Pełny kod znajduje się poniżej tego artykułu. Części, narzędzia i karty katalogowe są również linkowane poniżej tego artykułu.
Ten poradnik jest częścią: Matryca LED RGB ESP32-S3
- Projekt matrycy LED RGB ESP32-S3 1 – podstawowa kropka
- Projekt matrycy LED RGB ESP32-S3 2 - Przewijany tekst
- Projekt ESP32-S3 z matrycą LED RGB 3 - Tekst z telefonu komórkowego
- Projekt ESP32-S3 z matrycą LED RGB 4 - Punkt przechyłu
- Projekt matrycy LED RGB ESP32-S3 5 - Strzałka zawsze w górę
- Projekt ESP32-S3 z matrycą LED RGB 6 - gra w cel
- Projekt zegara internetowego z matrycą LED RGB ESP32-S3 - 2 zegary wielokolorowe z wyświetlaniem czasu i daty
- Projekt zegara internetowego z matrycą LED RGB ESP32-S3 - 3 kolory nocne z datą
- Projekt zegara internetowego z matrycą LED RGB ESP32-S3 - 5 kolorów tęczy
- Projekt zegara internetowego z matrycą LED RGB ESP32-S3 - 4 losowe kolory
- ESP32-S3 RGB LED Matrix test for RGB, GRB setting
/*
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
}
}
Rzeczy, których możesz potrzebować
-
Amazon
-
Allegro
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpresss.click.aliexpress.com
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpress (2)s.click.aliexpress.com
Zasoby i odniesienia
-
Wideo
Pliki📁
Plik Fritzing
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB