This tutorial is part of: ESP32-S3 RGB LED матрица
Одличен проект за креирање за забавни и практични апликации со користење на ESP32-S3 RGB Matrix модулот. Линкови до други видеа се наоѓаат под оваа статија.
ESP32-S3 RGB LED матрица Wi-Fi + NTP часовник проект -1 Основен часовник
Интернет часовник со ESP32-S3 со 8×8 NeoMatrix (Wi-Fi + NTP време)
Овој проект го претвора ESP32-S3 и 8×8 RGB NeoMatrix (NeoPixel/WS2812) во мал интернет часовник. ESP32 се поврзува на Wi-Fi, го синхронизира локалното време од NTP сервер, а потоа го лизга времето како HH:MM низ 8×8 екранот.

Како работи (на високо ниво)
1) ESP32-S3 се поврзува на вашиот рутер користејќи <WiFi.h>.
2) Го синхронизира времето од NTP сервер користејќи "time.h" и configTime().
3) Времето се форматира како HH:MM и се зачувува во мал текстуален бафер.
4) NeoMatrix го прикажува текстот и го лизга низ 8×8 панелот.

RGB боја
Бојата на текстот на часовникот се контролира со RGB (црвена, зелена, сина) вредности, каде што секој канал на боја се движи од 0 до 255 и различни комбинации создаваат различни бои на NeoMatrix. Со прилагодување на color_RED, color_GREEN и color_BLUE променливите, лесно можете да го прилагодите изгледот на часовникот на која било боја што сакате. За брзо да ги најдете точните RGB вредности за одредена боја, можете да го користите онлајн RGB Color Picker Color Picker .

Користени библиотеки
Овие вклучувања точно ви кажуваат од што зависи скицата:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
Инсталирајте Adafruit NeoMatrix користејќи го Arduino Library Manager. Тој исто така ќе ги повлече потребните зависности како Adafruit GFX Library и Adafruit NeoPixel.
Важни кориснички поставки што МОРА да ги уредите
1) Боја на текстот (RGB)
Поставете ја бојата на текстот на часовникот користејќи вредности од 0–255:
//поставете ја бојата на екранот составена од црвена, зелена и сина
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;
Овие вредности се користат овде:
matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE));
Забелешка: Ако ги поставите сите бои на 0 (црна), текстот станува невидлив. Скицата вклучува безбедносна проверка:
// ако корисникот ги поставил сите бои на 0, екранот ќе се исклучи, па поставете го на зелено
if (color_RED == 0 && color_GREEN == 0 && color_BLUE == 0) {
color_GREEN = 200;
}
Ова осигурува дека матрицата никогаш не изгледа „мртва“ поради невидлива поставка на боја.
2) Wi-Fi SSID и лозинка
Заменете ги овие со вашето вистинско Wi-Fi име и лозинка:
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
При стартување, ESP32 печати напредок на поврзувањето во Serial Monitor и истекува по околу 15 секунди (30 обиди × 500ms).
3) NTP сервер
Стандардниот NTP сервер е:
const char* ntpServer = "pool.ntp.org";
Можете да го задржите како што е. Ако некогаш сакате да користите локален сервер, заменете го името на домаќинот со вашиот претпочитан NTP сервер.
4) Временска зона поместување и поместување за летно сметање на времето
Овие две поставки го контролираат локалното време:
// Торонто-слично: UTC-5, плус 1 час DST
const long gmtOffset_sec = -5 * 3600; // -5 часа
const int daylightOffset_sec = 3600; // +1 час за DST
Како да ги поставите:
gmtOffset_sec= (UTC поместување во часови) × 3600. Пример: UTC-5 →-5*3600, UTC+2 →2*3600.daylightOffset_sec=0ако не сакате прилагодување за DST, или3600ако вашиот регион моментално применува DST (+1 час).
Овие се применуваат овде:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Конфигурација на екранот
Пин за податоци на матрицата
Пинот за податоци е дефиниран овде:
#define MATRIX_PIN 14
Ако вашето поврзување користи различен GPIO, променете го овој број за да одговара.
NeoMatrix распоред + редослед на бои
Вашата матрица е иницијализирана вака:
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);
Две вообичаени причини зошто екранот изгледа „погрешно“:
- Ротација / насока на поврзување: Ако текстот се појавува наопаку или огледално, прилагодете ги
NEO_MATRIX_*знаменцата (TOP/BOTTOM, LEFT/RIGHT, ROWS/COLUMNS, PROGRESSIVE/ZIGZAG). - Редослед на бои: Овој код користи
NEO_RGB. Некои панели сеNEO_GRB. Ако црвената/зелената/сината не се совпаѓаат, променете гоNEO_RGBво точниот редослед.
Осветленост
Осветленоста е поставена во initMatrix():
matrix.setBrightness(40);
Зголемете ја за посветол екран, намалете ја за помала топлина и потрошувачка на енергија.
Како времето се генерира како HH:MM
Часовникот го складира форматираното време во бафер од 6 карактери:
char timeText[6] = "00:00";
Потоа updateTimeText() ја чита локалното време синхронизирано со NTP и го запишува текстот:
// Формат HH:MM
snprintf(timeText, sizeof(timeText), "%02d:%02d",
timeinfo.tm_hour,
timeinfo.tm_min);
Ова се ажурира еднаш во секунда во главната јамка.
Како функционира лизгањето на 8×8 дисплеј
Матрицата 8×8 е премногу тесна за да го прикаже HH:MM одеднаш, па скицата го лизга текстот. Го црта времето на променлива X позиција (scrollX), потоа го поместува налево за еден пиксел при секое ажурирање.
int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;
Секој чекор на лизгање:
matrix.fillScreen(0);
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;
Кога текстот целосно ќе излезе од левата страна, кодот го ресетира за да започне повторно од десниот раб:
int16_t textWidth = 30;
if (scrollX < -textWidth) {
scrollX = matrix.width();
}
Излез на Serial Monitor (дебагирање)
Оваа скица печати корисни пораки:
- Напредокот на Wi-Fi конекцијата и IP адресата
- Дали синхронизацијата на времето успеала
- Форматираната временска низа (на пр.,
Time text: 14:32)
Ако дисплејот е празен, Serial Monitor е првото место за проверка за да се потврди дека Wi-Fi и NTP работат.
Демонстрација на проектот
По поставување и ресетирање:
- ESP32 се поврзува на Wi-Fi
- Го синхронизира времето од
pool.ntp.org - Накратко прикажува
OKна матрицата - Континуирано го лизга моменталното време како
HH:MM
Преземања и линкови
Целосниот код е даден подолу во овој напис. Делови, алатки и технички листови се исто така поврзани подолу во овој напис.
This tutorial is part of: ESP32-S3 RGB LED матрица
- ESP32-S3 RGB LED матричен проект 1 - Основна точка
- ESP32-S3 RGB LED матричен проект 2 - Лизгачки текст
- Проект 3 со RGB LED матрица на ESP32-S3 - Текст од мобилен телефон
- Проект 4 со RGB LED матрица на ESP32-S3 - Тилт точка
- ESP32-S3 RGB LED матричен проект 5 - Стрелка секогаш нагоре
- ESP32-S3 RGB LED матрица проект 6 - Игра „Цел“
- Проект за интернет часовник со RGB LED матрица базиран на ESP32-S3 - 2 часовници со повеќебоен приказ на време и датум
- ESP32-S3 RGB LED матричен интернет часовник проект - 3 ноќни бои со датум
- Проект за интернет часовник со RGB LED матрица базиран на ESP32-S3 - 5 виножито боја
- Проект за интернет часовник со RGB LED матрица базиран на ESP32-S3 - 4 случајни бои
- 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