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 internetových hodín s RGB LED maticou ESP32-S3 - 2 hodiny s viacfarebným zobrazením času a dátumu
ESP32-S3 RGB NeoMatrix internetové hodiny s zobrazením času a dátumu
Tento projekt je vylepšené ESP32-S3 RGB Matrix internetové hodiny, ktoré nielen zobrazujú aktuálny čas, ale tiež pravidelne zobrazujú dátum. ESP32-S3 sa pripojí k Wi-Fi, synchronizuje čas z NTP servera a posúva buď HH:MM alebo dátum (napríklad SEP 21) cez 8×8 RGB NeoMatrix. Displej podporuje automatické nastavenie jasu pre deň/noc a prispôsobiteľné RGB farby.

Čo tieto hodiny robia
Po pripojení k vašej Wi-Fi sieti ESP32-S3 načíta aktuálny miestny čas z internetu. Hodiny normálne posúvajú čas, ale v pevnom intervale prepnú na zobrazenie dátumu. Farba textu môže byť pevná alebo sa automaticky meniť medzi viacerými používateľom definovanými farbami. Jas sa v noci automaticky znižuje, aby bol displej šetrnejší k očiam.
Použité knižnice
Tento náčrt závisí od nasledujúcich knižníc:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
Nainštalujte Adafruit NeoMatrix z Arduino Library Manager. Všetky potrebné závislosti ako Adafruit GFX Library a Adafruit NeoPixel sa nainštalujú automaticky.

Dôležitá konfigurácia používateľa
Wi-Fi SSID a heslo (rozlišujú malé a veľké písmená)
Musíte nahradiť Wi-Fi prihlasovacie údaje vlastnými informáciami o sieti:

const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
Dôležité: Wi-Fi SSID rozlišuje malé a veľké písmená. Napríklad SSID s názvom "Book" nie je to isté ako "book". Ak sa veľkosť písmen presne nezhoduje, ESP32 sa nepripojí.
NTP server, časové pásmo a letný čas
Hodiny používajú internetový časový server:
const char* ntpServer = "pool.ntp.org";
Miestny čas sa vypočíta pomocou týchto offsetov:
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
gmtOffset_sec: Váš UTC offset v sekundách (príklad: UTC-5 =-5 * 3600)daylightOffset_sec: Použite3600pre letný čas alebo0, ak sa letný čas nepoužíva
Tieto nastavenia sa aplikujú pomocou:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Ovládanie jasu (deň / noc)
Tento projekt automaticky upravuje jas podľa hodiny dňa:
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
Medzi 22:00 a 6:00 sa jas znižuje, aby bol displej menej rušivý v tmavom prostredí. Tieto hodnoty môžete upraviť podľa svojich preferencií.
Konfigurácia RGB farieb
Hodiny podporujú režim pevnej farby aj automatické striedanie farieb. Používateľom definované RGB farby sú uložené v poli:
uint8_t userColors[][3] = {
{17, 43, 171}, // Svetlo modrá
{255, 0, 0}, // Červená
{0, 255, 0}, // Zelená
{255, 165, 0}, // Oranžová
{255, 0, 255} // Purpurová
};
Každá farba používa RGB (červená, zelená, modrá) hodnoty od 0 do 255. Zmenou týchto čísel môžete vytvoriť prakticky akúkoľvek farbu pre displej. Ak je useFixedColor nastavené na true, hodiny vždy používajú jednu farbu. Ak je nastavené na false, farba sa automaticky zmení po každom úplnom posunutí.
Na rýchle nájdenie presných RGB hodnôt pre akúkoľvek farbu použite nástroj RGB Color Picker Color Picker .
Formátovanie času a dátumu
Čas je formátovaný ako HH:MM a uložený v malom znakovom bufferi. Dátum je formátovaný ako reťazec s veľkými písmenami, napríklad SEP 21. Displej automaticky prepína medzi časom a dátumom v pevnom intervale.
Logika posúvania na 8×8 displeji
Pretože 8×8 matica je príliš malá na zobrazenie celého textu naraz, náčrt posúva text horizontálne. Keď text úplne opustí displej, farba sa aktualizuje a obsah prepína medzi časom a dátumom podľa potreby.
Demonštrácia
Po nahraní náčrtu:
- ESP32 sa pripojí k Wi-Fi
- Čas sa synchronizuje z internetu
- Aktuálny čas sa posúva cez maticu
- Dátum sa zobrazuje pravidelne
- Jas sa automaticky prispôsobuje dňu a noci
Stiahnutia a odkazy
Kompletný zdrojový kód je uvedený nižšie v tomto článku. Odkazy na diely, nástroje a datasheety sú tiež dostupné 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 ESP32-S3 RGB LED matica Wi-Fi + NTP časové hodiny - 1 Základné hodiny
- 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
/*
* =====================================================================================
* ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 2
Multi color
* =====================================================================================
watch video https://youtube.com/shorts/4iWjLiD7fS8
📚⬇️ Download and resource page https://robojax.com/RJT839
* Author: Ahmad Shamshiri (Robojax.com)
* Date: 07 Jan 2026
* * FEATURES:
* 1. WiFi/NTP Time: Syncs automatically with internet time servers.
* 2. Cycle-Based Color: Color changes ONLY when text finishes a full scroll.
* 3. Auto-Brightness: Dims the LEDs during night hours (User-configurable).
* 4. Periodic Date: Scrolls the date (e.g., "JAN 07") every 2 minutes.
* * USER CONFIGURATION GUIDE:
* -------------------------
* - WiFi: Change 'WIFI_SSID' and 'WIFI_PASSWORD' to your local network.
* - Colors: Add or remove {R, G, B} sets in the 'userColors' array.
* - Night Mode: Adjust 'NIGHT_START_HOUR' and 'NIGHT_BRIGHTNESS'.
* =====================================================================================
*/
#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define MATRIX_PIN 14
// --- BRIGHTNESS CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
// --- COLOR CONFIGURATION ---
bool useFixedColor = false;
int fixedColorIndex = 0;
uint8_t userColors[][3] = {
{17, 43, 171}, // Light Blue
{255, 0, 0}, // Red
{0, 255, 0}, // Green
{255, 165, 0}, // Orange
{255, 0, 255} // Magenta
};
// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
int currentColorIndex = 0;
int totalColors = sizeof(userColors) / sizeof(userColors[0]);
// --- DATE/TIME INTERVALS ---
unsigned long lastDateShowMs = 0;
const uint32_t dateIntervalMs = 30000; // 2 minutes
unsigned long lastTimeUpdateMs = 0;
const uint16_t timeUpdateIntervalMs = 1000;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;
// --- GLOBAL VARIABLES ---
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";
char dateText[10] = "";
char currentDisplayText[12] = "";
int16_t scrollX = 8;
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
void updateTimeAndDate() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) return;
snprintf(timeText, sizeof(timeText), "%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min);
strftime(dateText, sizeof(dateText), "%b %d", &timeinfo);
for (int i = 0; dateText[i]; i++) dateText[i] = toupper(dateText[i]);
if (timeinfo.tm_hour >= NIGHT_START_HOUR || timeinfo.tm_hour < NIGHT_END_HOUR) {
matrix.setBrightness(NIGHT_BRIGHTNESS);
} else {
matrix.setBrightness(DAY_BRIGHTNESS);
}
}
void scrollDisplay() {
matrix.fillScreen(0);
// FIXED LOGIC: Uses currentColorIndex which only changes at the end of a scroll
int idx = useFixedColor ? fixedColorIndex : currentColorIndex;
matrix.setTextColor(matrix.Color(userColors[idx][0], userColors[idx][1], userColors[idx][2]));
matrix.setCursor(scrollX, 0);
matrix.print(currentDisplayText);
matrix.show();
scrollX--;
int16_t textWidth = strlen(currentDisplayText) * 6;
// THE TRIGGER POINT: This happens only when text is fully off-screen
if (scrollX < -textWidth) {
scrollX = matrix.width();
// 1. Cycle the color now and only now
if (!useFixedColor) {
currentColorIndex = (currentColorIndex + 1) % totalColors;
}
// 2. Decide whether to switch between Time and Date
if (millis() - lastDateShowMs > dateIntervalMs) {
strcpy(currentDisplayText, dateText);
lastDateShowMs = millis();
} else {
strcpy(currentDisplayText, timeText);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(DAY_BRIGHTNESS);
updateTimeAndDate();
strcpy(currentDisplayText, timeText);
}
void loop() {
unsigned long now = millis();
if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
lastTimeUpdateMs = now;
updateTimeAndDate();
}
if (now - lastScrollMs >= scrollIntervalMs) {
lastScrollMs = now;
scrollDisplay();
}
}
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