Questo tutorial è parte di: Matrice LED RGB ESP32-S3
Fantastico progetto da realizzare per applicazioni pratiche e divertenti utilizzando il modulo RGB Matrix ESP32-S3. I link ad altri video si trovano più avanti in questo articolo.
Progetto orologio di base ESP32-S3 Matrice LED RGB Wi-Fi + Orologio NTP -1
Orologio Internet ESP32-S3 con NeoMatrix 8×8 (Wi-Fi + Ora NTP)
Questo progetto trasforma un ESP32-S3 e un NeoMatrix RGB 8×8 (NeoPixel/WS2812) in un piccolo orologio per Internet. L'ESP32 si connette al Wi-Fi, sincronizza l'ora locale da un server NTP e poi scorre il tempo comeHH:MMattraverso il display 8×8.

Come funziona (a livello alto)
1) ESP32-S3 si connette al tuo router utilizzando<WiFi.h>.
2) Sincronizza l'orario da un server NTP utilizzando"time.h"econfigTime().
3) L'ora è formattata comeHH:MMe salvato in un piccolo buffer di testo.
4) Il NeoMatrix rende il testo e lo scorre attraverso il pannello 8×8.

Colore RGB
Il colore del testo dell'orologio è controllato utilizzando valori RGB (Rosso, Verde, Blu), dove ogni canale di colore varia da 0 a 255 e diverse combinazioni creano colori differenti sul NeoMatrix. Regolando ilcolor_RED,color_GREEN, ecolor_BLUEvariabili, puoi facilmente personalizzare l'aspetto dell'orologio con qualsiasi colore tu preferisca. Per trovare rapidamente i valori RGB esatti per un colore specifico, puoi utilizzare il Selettore di Colori RGB online.Selettore colori.

Librerie utilizzate
Questi includono informazioni precise su cui dipende il disegno:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>InstallaAdafruit NeoMatrixutilizzando il Gestore Librerie di Arduino. Inoltre installerà le dipendenze necessarie comeAdafruit GFX LibraryeAdafruit NeoPixel.
Impostazioni utente importanti che DEVI modificare
1) Colore del testo (RGB)
Imposta il colore del testo dell'orologio utilizzando valori da 0 a 255:
//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;Questi valori sono usati qui:
matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE));Nota:Se imposti tutti i colori a 0 (nero), il testo diventa invisibile. Il disegno include un controllo di sicurezza:
// 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;
}Questo garantisce che la matrice non appaia mai "morta" a causa di un'impostazione di colore invisibile.
2) SSID e password Wi-Fi
Sostituisci questi con il tuo vero nome e password del Wi-Fi:
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";Durante l'avvio, l'ESP32 mostra il progresso della connessione nel Monitor Seriale e scade dopo circa 15 secondi (30 tentativi × 500ms).
3) Server NTP
Il server NTP predefinito è:
const char* ntpServer = "pool.ntp.org";Puoi mantenerlo così com'è. Se desideri utilizzare un server locale, sostituisci il nome host con il tuo server NTP preferito.
4) Differenza di fuso orario e differenza per l'ora legale
Queste due impostazioni controllano l'orario locale:
// Toronto-ish: UTC-5, plus 1 hour DST
const long gmtOffset_sec = -5 * 3600; // -5 hours
const int daylightOffset_sec = 3600; // +1 hour for DSTCome impostarli:
gmtOffset_sec= (ore di offset UTC) × 3600. Esempio: UTC-5 →-5*3600, UTC+2 →2*3600.daylightOffset_sec=0se non vuoi l'aggiustamento dell'ora legale, o3600se la tua regione sta attualmente osservando l'ora legale (+1 ora).
Questi sono applicati qui:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);Configurazione del display
Pin dati matrice
Il pin dei dati è definito qui:
#define MATRIX_PIN 14Se il tuo cablaggio utilizza un GPIO diverso, modifica questo numero per farlo corrispondere.
Layout e ordine dei colori di NeoMatrix
La tua matrice è inizializzata in questo modo:
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);Due ragioni comuni per cui il display sembra "sbagliato":
- Direzione di rotazione / cablaggio:Se il testo appare capovolto o specchiato, regola il
NEO_MATRIX_*bandiere (ALTO/BASSO, SINISTRA/DESTRA, RIGHE/COLUMNNE, PROGRESSIVO/ZIGZAG). - Ordine dei colori:Questo codice utilizza
NEO_RGB. Alcuni pannelli sonoNEO_GRB. Se il rosso/verde/blu non corrispondono, cambiaNEO_RGBnell'ordine corretto.
Luminosità
La luminosità è impostata suinitMatrix():
matrix.setBrightness(40);Aumenta per un display più luminoso, riduci per abbassare il calore e il consumo energetico.
Come viene generato il tempo comeHH:MM
L'orologio memorizza l'ora formattata in un buffer di 6 caratteri:
char timeText[6] = "00:00";PoiupdateTimeText()legge l'ora locale sincronizzata con NTP e scrive il testo:
// Format HH:MM
snprintf(timeText, sizeof(timeText), "%02d:%02d",
timeinfo.tm_hour,
timeinfo.tm_min);Questo viene aggiornato una volta al secondo nel ciclo principale.
Come funziona lo scrolling su un display 8×8
Una matrice 8×8 è troppo stretta per essere visualizzata.HH:MMin un colpo solo, quindi il bozzetto scorre il testo. Disegna il tempo in una posizione X variabile.scrollX), quindi lo sposta a sinistra di un pixel ad ogni aggiornamento.
int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;Ogni passo di scorrimento:
matrix.fillScreen(0);
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;Quando il testo esce completamente sul lato sinistro, il codice lo reimposta per ricominciare dal bordo destro:
int16_t textWidth = 30;
if (scrollX < -textWidth) {
scrollX = matrix.width();
}Uscita del Serial Monitor (debugging)
Questo schizzo stampa messaggi utili:
- Progresso della connessione Wi-Fi e indirizzo IP
- Se la sincronizzazione dell'ora è riuscita
- La stringa temporale formattata (ad esempio,
Time text: 14:32)
Se il display è vuoto, il Monitor Serial è il primo posto da controllare per confermare che Wi-Fi e NTP stiano funzionando.
Dimostrazione del progetto
Dopo il caricamento e il ripristino:
- ESP32 si connette al Wi-Fi
- Sincronizza l'ora da
pool.ntp.org - Mostre
OKbrevemente sulla matrice - Scorre continuamente l'ora attuale come
HH:MM
Download e collegamenti
Il codice completo è fornito sotto a questo articolo. Anche parti, strumenti e schede tecniche sono collegate sotto a questo articolo.
Questo tutorial è parte di: Matrice LED RGB ESP32-S3
- Progetti con Matrice LED RGB ESP32-S3 (Gioco Inclinazione, Testo, Freccia, Demo WiFi)
- Progetto Matrice LED RGB ESP32-S3 2 - Testo Scorrevole
- Progetto ESP32-S3 Matrice LED RGB 3 - Testo da telefono cellulare
- Progetto Matrice LED RGB ESP32-S3 4 - Punta inclinata
- Progetto Matrice LED RGB ESP32-S3 5 - Freccia sempre verso l'alto
- Progetto 6 della matrice LED RGB ESP32-S3 - Gioco Cible
- Progetto Orologio Internet con Matrice LED RGB ESP32-S3 - Orologio a colori multipli con visualizzazione di Ora e Data
- Progetto Orologio Internet con Matrice LED RGB ESP32-S3 - Colore Notte 3 con Data
- Progetto di orologio Internet con matrice LED RGB ESP32-S3 - 5 colori arcobaleno
- Progetto Orologio Internet con Matrice LED RGB ESP32-S3 - 4 Colori casuali
- Test della matrice LED RGB ESP32-S3 per impostazione RGB, GRB
/*
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
}
}
Cose di cui potresti avere bisogno
-
Amazon
-
eBay
-
AliExpressAcquista ESP32-S3 RGB Matrix su AliExpress (2)s.click.aliexpress.com
-
AliExpressAcquista la matrice RGB ESP32-S3 da AliExpresss.click.aliexpress.com
Risorse e riferimenti
-
Video
File📁
File Fritzing
-
esp32-S3-supermini-tht parte fritzing
esp32-S3-supermini-tht.fzpz0.02 MB