This tutorial is part of: Matrice LED RGB ESP32-S3
Proiect interesant de creat pentru aplicații distractive și practice folosind modulul ESP32-S3 RGB Matrix. Linkuri către alte videoclipuri sunt sub acest articol.
Proiect de ceas Wi-Fi + NTP cu matrice LED RGB ESP32-S3 -1 Ceas de bază
Ceas Internet cu ESP32-S3 și NeoMatrix 8×8 (Wi-Fi + Timp NTP)
Acest proiect transformă un ESP32-S3 și un NeoMatrix RGB 8×8 (NeoPixel/WS2812) într-un mic ceas internet. ESP32 se conectează la Wi-Fi, sincronizează ora locală de la un server NTP, apoi defilează ora ca HH:MM pe afișajul 8×8.

Cum funcționează (la nivel general)
1) ESP32-S3 se conectează la routerul tău folosind <WiFi.h>.
2) Sincronizează ora de la un server NTP folosind "time.h" și configTime().
3) Ora este formatată ca HH:MM și salvată într-un mic buffer de text.
4) NeoMatrix afișează textul și îl defilează pe panoul 8×8.

Culoare RGB
Culoarea textului ceasului este controlată folosind valori RGB (Roșu, Verde, Albastru), unde fiecare canal de culoare variază de la 0 la 255, iar diferite combinații creează diferite culori pe NeoMatrix. Prin ajustarea variabilelor color_RED, color_GREEN și color_BLUE, poți personaliza cu ușurință aspectul ceasului în orice culoare dorești. Pentru a găsi rapid valorile RGB exacte pentru o anumită culoare, poți folosi selectorul online de culori RGB Color Picker .

Biblioteci folosite
Aceste includeri îți spun exact de ce depinde schița:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
Instalează Adafruit NeoMatrix folosind Managerul de Biblioteci Arduino. Acesta va aduce și dependențele necesare, cum ar fi Adafruit GFX Library și Adafruit NeoPixel.
Setări importante ale utilizatorului pe care TREBUIE să le editezi
1) Culoarea textului (RGB)
Setază culoarea textului ceasului folosind valori 0–255:
//setează culoarea afișajului compusă din Roșu, Verde și Albastru
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;
Aceste valori sunt folosite aici:
matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE));
Notă: Dacă setezi toate culorile la 0 (negru), textul devine invizibil. Schița include o verificare de siguranță:
// dacă utilizatorul a setat toate culorile la 0, afișajul va fi oprit, deci setează-l pe verde
if (color_RED == 0 && color_GREEN == 0 && color_BLUE == 0) {
color_GREEN = 200;
}
Acest lucru asigură că matricea nu arată niciodată „moartă” din cauza unei setări de culoare invizibile.
2) SSID-ul și parola Wi-Fi
Înlocuiește acestea cu numele și parola reale ale rețelei Wi-Fi:
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
În timpul pornirii, ESP32 afișează progresul conexiunii în Monitorul Serial și expiră după aproximativ 15 secunde (30 de încercări × 500ms).
3) Server NTP
Serverul NTP implicit este:
const char* ntpServer = "pool.ntp.org";
Îl poți păstra așa cum este. Dacă vrei vreodată să folosești un server local, înlocuiește numele de gazdă cu serverul NTP preferat.
4) Decalajul fusului orar și decalajul orei de vară
Aceste două setări controlează ora locală:
// Aproximativ Toronto: UTC-5, plus 1 oră pentru ora de vară
const long gmtOffset_sec = -5 * 3600; // -5 ore
const int daylightOffset_sec = 3600; // +1 oră pentru ora de vară
Cum să le setezi:
gmtOffset_sec= (decalajul UTC în ore) × 3600. Exemplu: UTC-5 →-5*3600, UTC+2 →2*3600.daylightOffset_sec=0dacă nu dorești ajustarea orei de vară, sau3600dacă regiunea ta respectă în prezent ora de vară (+1 oră).
Acestea sunt aplicate aici:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Configurarea afișajului
Pinul de date al matricei
Pinul de date este definit aici:
#define MATRIX_PIN 14
Dacă cablajul tău folosește un alt GPIO, schimbă acest număr pentru a se potrivi.
Dispunerea NeoMatrix + ordinea culorilor
Matricea ta este inițializată astfel:
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);
Două motive comune pentru care afișajul arată „greșit”:
- Rotație / direcția cablajului: Dacă textul apare inversat sau în oglindă, ajustează flagurile
NEO_MATRIX_*(TOP/BOTTOM, LEFT/RIGHT, ROWS/COLUMNS, PROGRESSIVE/ZIGZAG). - Ordinea culorilor: Acest cod folosește
NEO_RGB. Unele panouri suntNEO_GRB. Dacă roșu/verde/albastru nu se potrivesc, schimbăNEO_RGBîn ordinea corectă.
Luminozitate
Luminozitatea este setată în initMatrix():
matrix.setBrightness(40);
Crește pentru un afișaj mai luminos, reduce pentru mai puțină căldură și consum de energie.
Cum este generată ora ca HH:MM
Ceasul stochează ora formatată într-un buffer de 6 caractere:
char timeText[6] = "00:00";
Apoi updateTimeText() citește ora locală sincronizată NTP și scrie textul:
// Format HH:MM
snprintf(timeText, sizeof(timeText), "%02d:%02d",
timeinfo.tm_hour,
timeinfo.tm_min);
Aceasta este actualizată o dată pe secundă în bucla principală.
Cum funcționează derularea pe un afișaj 8×8
O matrice 8×8 este prea îngustă pentru a afișa HH:MM dintr-o dată, astfel încât schița derulează textul. Desenează ora la o poziție X variabilă (scrollX), apoi o mută la stânga cu un pixel la fiecare actualizare.
int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;
Fiecare pas de derulare:
matrix.fillScreen(0);
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;
Când textul iese complet pe partea stângă, codul îl resetează pentru a începe din nou de la marginea dreaptă:
int16_t textWidth = 30;
if (scrollX < -textWidth) {
scrollX = matrix.width();
}
Ieșirea Serial Monitor (debugging)
Această schiță afișează mesaje utile:
- Progresul conexiunii Wi-Fi și adresa IP
- Dacă sincronizarea timpului a reușit
- Șirul de timp formatat (de exemplu,
Text timp: 14:32)
Dacă afișajul este gol, Serial Monitor este primul loc de verificat pentru a confirma că Wi-Fi și NTP funcționează.
Demonstrația proiectului
După încărcare și resetare:
- ESP32 se conectează la Wi-Fi
- Sincronizează timpul de la
pool.ntp.org - Afișează
OKscurt pe matrice - Derulează continuu ora curentă ca
HH:MM
Descărcări și linkuri
Codul complet este furnizat mai jos în acest articol. Piese, unelte și fișe tehnice sunt, de asemenea, legate mai jos în acest articol.
This tutorial is part of: Matrice LED RGB ESP32-S3
- Proiect ESP32-S3 cu Matrice LED RGB 1 - Punct de bază
- Proiect ESP32-S3 cu Matrice LED RGB 2 - Text Derulant
- Proiect 3 cu matrice LED RGB ESP32-S3 - Text de pe telefonul mobil
- Proiect ESP32-S3 cu matrice LED RGB 4 - Punct de înclinare
- Proiect ESP32-S3 cu matrice LED RGB 5 - Săgeata mereu în sus
- Proiect Matrice LED RGB ESP32-S3 6 - Joc Cible
- Proiect de ceas cu matrice LED RGB ESP32-S3 conectat la internet - Afișaj de oră și dată în 2 ceasuri multicolore
- Proiect de ceas cu matrice LED RGB ESP32-S3 conectat la internet - 3 culori de noapte cu dată
- Proiect de ceas internet cu matrice LED RGB ESP32-S3 - 5 culori curcubeu
- Proiect de ceas internet cu matrice LED RGB ESP32-S3 - 4 culori aleatorii
- 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
}
}
Lucruri de care ai putea avea nevoie
-
Amazon
-
eBay
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpresss.click.aliexpress.com
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpress (2)s.click.aliexpress.com
Resurse și referințe
-
Video
Fișiere📁
Fișier Fritzing
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB