This tutorial is part of: ESP32-S3 RGB LED matica
Skvelý projekt na tvorbu zábavných a praktických aplikácií s použitím modulu ESP32-S3 RGB Matrix. Odkazy na ďalšie videá nájdete pod týmto článkom.
Projekt ESP32-S3 RGB LED matica Wi-Fi + NTP časové hodiny - 1 Základné hodiny
ESP32-S3 internetové hodiny s 8×8 NeoMatrix (Wi-Fi + NTP čas)
Tento projekt premení ESP32-S3 a 8×8 RGB NeoMatrix (NeoPixel/WS2812) na malé internetové hodiny. ESP32 sa pripojí k Wi-Fi, synchronizuje miestny čas z NTP servera a potom posúva čas ako HH:MM cez 8×8 displej.

Ako to funguje (na vysokej úrovni)
1) ESP32-S3 sa pripojí k vášmu routeru pomocou <WiFi.h>.
2) Synchronizuje čas z NTP servera pomocou "time.h" a configTime().
3) Čas je naformátovaný ako HH:MM a uložený do malého textového buffera.
4) NeoMatrix vykreslí text a posúva ho cez 8×8 panel.

RGB farba
Farba textu hodín sa ovláda pomocou hodnôt RGB (červená, zelená, modrá), kde každý farebný kanál má rozsah od 0 do 255 a rôzne kombinácie vytvárajú rôzne farby na NeoMatrix. Úpravou premenných color_RED, color_GREEN a color_BLUE môžete ľahko prispôsobiť vzhľad hodín na akúkoľvek farbu, ktorá sa vám páči. Ak chcete rýchlo nájsť presné hodnoty RGB pre konkrétnu farbu, môžete použiť online nástroj RGB Color Picker Color Picker .

Použité knižnice
Tieto include direktívy vám presne povedia, na čom skica závisí:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
Nainštalujte Adafruit NeoMatrix pomocou Arduino Library Manager. Automaticky stiahne aj potrebné závislosti, ako sú Adafruit GFX Library a Adafruit NeoPixel.
Dôležité používateľské nastavenia, ktoré MUSÍTE upraviť
1) Farba textu (RGB)
Nastavte farbu textu hodín pomocou hodnôt 0–255:
//nastavenie farby displeja zloženej z červenej, zelenej a modrej
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;
Tieto hodnoty sa používajú tu:
matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE));
Poznámka: Ak nastavíte všetky farby na 0 (čierna), text sa stane neviditeľným. Skica obsahuje bezpečnostnú kontrolu:
// ak používateľ nastaví všetky farby na 0, displej sa vypne, preto sa nastaví na zelenú
if (color_RED == 0 && color_GREEN == 0 && color_BLUE == 0) {
color_GREEN = 200;
}
Toto zabezpečí, že matica nikdy nebude vyzerať „mŕtvo“ kvôli neviditeľnému nastaveniu farby.
2) Wi-Fi SSID a heslo
Nahraďte tieto hodnoty vaším skutočným názvom Wi-Fi a heslom:
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
Počas spúšťania ESP32 tlačí priebeh pripojenia do Serial Monitora a po uplynutí približne 15 sekúnd (30 pokusov × 500 ms) vyprší časový limit.
3) NTP server
Predvolený NTP server je:
const char* ntpServer = "pool.ntp.org";
Môžete ho ponechať tak, ako je. Ak by ste niekedy chceli použiť lokálny server, nahraďte hostname vaším preferovaným NTP serverom.
4) Posun časového pásma a posun letného času
Tieto dve nastavenia ovládajú miestny čas:
// Toronto-ish: UTC-5, plus 1 hodina DST
const long gmtOffset_sec = -5 * 3600; // -5 hodín
const int daylightOffset_sec = 3600; // +1 hodina pre DST
Ako ich nastaviť:
gmtOffset_sec= (posun UTC v hodinách) × 3600. Príklad: UTC-5 →-5*3600, UTC+2 →2*3600.daylightOffset_sec=0, ak nechcete úpravu letného času, alebo3600, ak vaša oblasť momentálne dodržiava letný čas (+1 hodina).
Tieto hodnoty sa aplikujú tu:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Konfigurácia displeja
Dátový pin matice
Dátový pin je definovaný tu:
#define MATRIX_PIN 14
Ak vaše zapojenie používa iný GPIO, zmeňte toto číslo podľa potreby.
Rozloženie NeoMatrix + poradie farieb
Vaša matica je inicializovaná takto:
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);
Dva bežné dôvody, prečo displej vyzerá „zle“:
- Rotácia / smer zapojenia: Ak sa text zobrazuje hore nohami alebo zrkadlovo, upravte príznaky
NEO_MATRIX_*(TOP/BOTTOM, LEFT/RIGHT, ROWS/COLUMNS, PROGRESSIVE/ZIGZAG). - Poradie farieb: Tento kód používa
NEO_RGB. Niektoré panely súNEO_GRB. Ak červená/zelená/modrá nesedia, zmeňteNEO_RGBna správne poradie.
Jas
Jas sa nastavuje v initMatrix():
matrix.setBrightness(40);
Zvýšte pre jasnejší displej, znížte pre nižšie teplo a spotrebu energie.
Ako sa čas generuje ako HH:MM
Hodiny ukladajú naformátovaný čas do 6-znakového buffera:
char timeText[6] = "00:00";
Potom updateTimeText() načíta lokálny čas synchronizovaný s NTP a zapíše text:
// Formát HH:MM
snprintf(timeText, sizeof(timeText), "%02d:%02d",
timeinfo.tm_hour,
timeinfo.tm_min);
Toto sa aktualizuje raz za sekundu v hlavnej slučke.
Ako funguje posúvanie na 8×8 displeji
Matrica 8×8 je príliš úzka na to, aby zobrazila HH:MM naraz, preto skica text posúva. Vykreslí čas na meniacej sa pozícii X (scrollX) a potom ho pri každej aktualizácii posunie o jeden pixel doľava.
int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;
Každý krok posúvania:
matrix.fillScreen(0);
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;
Keď text úplne opustí ľavú stranu, kód ho resetuje, aby sa začal znova od pravého okraja:
int16_t textWidth = 30;
if (scrollX < -textWidth) {
scrollX = matrix.width();
}
Výstup sériového monitora (ladenie)
Táto skica tlačí užitočné správy:
- Priebeh pripojenia k Wi-Fi a IP adresu
- Či bola synchronizácia času úspešná
- Formátovaný časový reťazec (napr.
Time text: 14:32)
Ak je displej prázdny, sériový monitor je prvé miesto, kde treba skontrolovať, či Wi-Fi a NTP fungujú.
Demonštrácia projektu
Po nahratí a resetovaní:
- ESP32 sa pripojí k Wi-Fi
- Synchronizuje čas z
pool.ntp.org - Krátko zobrazí
OKna matrici - Nepretržite posúva aktuálny čas ako
HH:MM
Stiahnutia a odkazy
Celý kód je uvedený nižšie v tomto článku. Diely, nástroje a dátové listy sú tiež prepojené nižšie v tomto článku.
This tutorial is part of: ESP32-S3 RGB LED matica
- Projekt ESP32-S3 RGB LED matice 1 – Základná bodka
- Projekt 2 s RGB LED maticou ESP32-S3 - Posúvajúci sa text
- Projekt 3 s RGB LED maticou ESP32-S3 - Text z mobilného telefónu
- Projekt ESP32-S3 RGB LED Matrix 4 - Náklon bodky
- Projekt ESP32-S3 RGB LED Matrix 5 - Šípka vždy hore
- Projekt ESP32-S3 RGB LED Matrix 6 - Hra Cible
- Projekt internetových hodín s RGB LED maticou ESP32-S3 - 2 hodiny s viacfarebným zobrazením času a dátumu
- Projekt internetových hodín s RGB LED maticou ESP32-S3 - 3 nočné farby s dátumom
- Projekt internetových hodín s RGB LED maticou ESP32-S3 - 5 dúhových farieb
- Projekt internetových hodín s RGB LED maticou ESP32-S3 - 4 náhodné farby
- 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
}
}
Things you might need
-
Amazon
-
eBay
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpresss.click.aliexpress.com
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpress (2)s.click.aliexpress.com
Resources & references
-
Video
Files📁
Fritzing File
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB