Este tutorial faz parte de: Matriz de LEDs RGB ESP32-S3
Projeto bacana para criar com aplicações práticas e divertidas usando o módulo ESP32-S3 RGB Matrix. Links para outros vídeos estão abaixo deste artigo.
Projeto de Relógio Básico ESP32-S3 Matriz de LED RGB Wi-Fi + Relógio NTP -1
Relógio de Internet ESP32-S3 com NeoMatrix 8×8 (Wi-Fi + Horário NTP)
Este projeto transforma um ESP32-S3 e uma NeoMatrix RGB 8×8 (NeoPixel/WS2812) em um pequeno relógio de Internet. O ESP32 se conecta ao Wi-Fi, sincroniza a hora local a partir de um servidor NTP e, em seguida, rola o horário comoHH:MMatravés do display 8×8.

Como funciona (em alto nível)
1) O ESP32-S3 conecta-se ao seu roteador usando<WiFi.h>.
2) Ele sincroniza o tempo de um servidor NTP usando"time.h"econfigTime().
O tempo é formatado comoHH:MMe salvo em um pequeno buffer de texto.
4) O NeoMatrix apresenta o texto e o rola pelo painel 8×8.

Cor RGB
A cor do texto do relógio é controlada usando valores RGB (Vermelho, Verde, Azul), onde cada canal de cor varia de 0 a 255 e diferentes combinações criam diferentes cores no NeoMatrix. Ao ajustar ocolor_RED,color_GREEN, ecolor_BLUEvariáveis, você pode facilmente personalizar a aparência do relógio para qualquer cor que desejar. Para encontrar rapidamente os valores RGB exatos de uma cor específica, você pode usar o seletor de cores RGB online.Seletor de Cores.

Bibliotecas utilizadas
Isso inclui informações sobre exatamente do que o esboço depende:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>InstalarAdafruit NeoMatrixusando o Gerenciador de Bibliotecas do Arduino. Ele também irá baixar as dependências necessárias, comoAdafruit GFX LibraryeAdafruit NeoPixel.
Configurações importantes do usuário que você DEVE editar
1) Cor do texto (RGB)
Defina a cor do texto do seu relógio usando valores de 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;Estes valores são utilizados aqui:
matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE));Nota:Se você definir todas as cores como 0 (preto), o texto se torna invisível. O esboço inclui uma verificação de segurança:
// 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;
}Isto garante que a matriz nunca pareça "morta" devido a uma configuração de cor invisível.
2) SSID e senha do Wi-Fi
Substitua isso pelo seu nome e senha de Wi-Fi reais:
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";Durante a inicialização, o ESP32 imprime o progresso da conexão no Monitor Serial e expira após cerca de 15 segundos (30 tentativas × 500ms).
Servidor NTP
O servidor NTP padrão é:
const char* ntpServer = "pool.ntp.org";Você pode mantê-lo como está. Se você quiser usar um servidor local, substitua o nome do host pelo seu servidor NTP preferido.
4) Deslocamento do fuso horário e deslocamento de horário de verão
Essas duas configurações controlam a hora local:
// Toronto-ish: UTC-5, plus 1 hour DST
const long gmtOffset_sec = -5 * 3600; // -5 hours
const int daylightOffset_sec = 3600; // +1 hour for DSTComo configurá-los:
gmtOffset_sec= (horas de diferença UTC) × 3600. Exemplo: UTC-5 →-5*3600, UTC+2 →2*3600.daylightOffset_sec=0se você não deseja o ajuste de horário de verão, ou3600se a sua região está atualmente observando o horário de verão (+1 hora).
Estes são aplicados aqui:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);Configuração de exibição
Pino de dados da matriz
O pino de dados é definido aqui:
#define MATRIX_PIN 14Se a sua fiação usar um GPIO diferente, altere este número para corresponder.
Layout e ordem de cores do NeoMatrix
Sua matriz é inicializada assim:
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);Duas razões comuns pelas quais a tela parece "errada":
- Direção de rotação / fiação:Se o texto aparecer de cabeça para baixo ou espelhado, ajuste o
NEO_MATRIX_*bandeiras (CIMA/BAIXO, ESQUERDA/DIREITA, LINHAS/COLUNAS, PROGRESSIVO/ZIGZAG). - Ordem de cores:Este código usa
NEO_RGB. Alguns painéis sãoNEO_GRB. Se vermelho/vermelho/azul não corresponderem, mudeNEO_RGBpara a ordem correta.
Brilho
A luminosidade é definida eminitMatrix():
matrix.setBrightness(40);Aumente para um display mais brilhante, reduza para diminuir o calor e o consumo de energia.
Como o tempo é gerado comoHH:MM
O relógio armazena o tempo formatado em um buffer de 6 caracteres:
char timeText[6] = "00:00";EntãoupdateTimeText()lê a hora local sincronizada com NTP e escreve o texto:
// Format HH:MM
snprintf(timeText, sizeof(timeText), "%02d:%02d",
timeinfo.tm_hour,
timeinfo.tm_min);Isso é atualizado uma vez por segundo no loop principal.
Como a rolagem funciona em um display 8×8
Uma matriz 8×8 é muito estreita para ser exibida.HH:MMimediatamente, então o esboço rola o texto. Ele desenha o tempo em uma posição X que muda (scrollX), então move-o para a esquerda em um pixel a cada atualização.
int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;Cada passo de rolagem:
matrix.fillScreen(0);
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;Quando o texto sai completamente do lado esquerdo, o código o redefine para começar novamente a partir da borda direita:
int16_t textWidth = 30;
if (scrollX < -textWidth) {
scrollX = matrix.width();
}Saída do Monitor Serial (depuração)
Este esboço imprime mensagens úteis:
- Progresso da conexão Wi-Fi e endereço IP
- Se a sincronização do tempo foi bem-sucedida
- A string de tempo formatada (por exemplo,
Time text: 14:32)
Se o display estiver em branco, o Monitor Serial é o primeiro lugar a verificar para confirmar se o Wi-Fi e o NTP estão funcionando.
Demonstração do projeto
Após o upload e a reinicialização:
- ESP32 conecta-se ao Wi-Fi
- Sincroniza o tempo de
pool.ntp.org - Mostra
OKbrevemente sobre a matriz - Rola continuamente a hora atual conforme
HH:MM
Downloads e links
O código completo está disponível abaixo deste artigo. Peças, ferramentas e folhas de dados também estão vinculadas abaixo deste artigo.
Este tutorial é parte de: Matriz de LEDs RGB ESP32-S3
- Projetos de Matriz de LED RGB ESP32-S3 (Jogo de Inclinação, Texto, Seta, Demonstração WiFi)
- Projeto de Matriz de LED RGB ESP32-S3 2 - Texto Rolante
- Projeto de Matriz LED RGB ESP32-S3 3 - Texto do telefone móvel
- Projeto de Matriz LED RGB ESP32-S3 4 - Ponto Inclinado
- Projeto de Matriz de LED RGB ESP32-S3 5 - Setas sempre para cima
- Projeto de Matriz de LED RGB ESP32-S3 6 - Jogo de Cible
- Projeto de Relógio da Internet com Matriz de LED RGB ESP32-S3 - Exibição de Hora e Data em Multi Cor para 2 Relógios
- Projeto de Relógio da Internet com Matriz de LED RGB ESP32-S3 - 3 Cores Noturnas com Data
- Projeto de Relógio Internet com Matriz LED RGB ESP32-S3 - 5 Cores do Arco-íris
- Projeto de Relógio de Internet com Matriz de LED RGB ESP32-S3 - 4 Cores Aleatórias
- Teste de Matriz de LED RGB ESP32-S3 para configuração 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
}
}
Coisas que você pode precisar
-
Amazonas
-
eBay
-
AliExpressCompre a matriz RGB ESP32-S3 na AliExpress (2)s.click.aliexpress.com
-
AliExpressCompre a matriz RGB ESP32-S3 na AliExpress.s.click.aliexpress.com
Recursos e referências
-
Vídeo
Arquivos📁
Arquivo Fritzing
-
esp32-S3-supermini-tht peça fritzing
esp32-S3-supermini-tht.fzpz0.02 MB