Этот учебник является частью: ESP32-S3 RGB LED матрица
Замечательный проект для создания развлекательных и практических приложений с использованием модуля RGB-матрицы ESP32-S3. Ссылки на другие видеоролики находятся ниже этой статьи.
ESP32-S3 RGB LED матрица Wi-Fi + NTP проект часы - 1 базовые часы
ESP32-S3 Интернет-часы с 8×8 NeoMatrix (Wi-Fi + NTP Время)
Этот проект превращает ESP32-S3 и матрицу RGB NeoMatrix 8×8 (NeoPixel/WS2812) в крошечные интернет-часы. ESP32 подключается к Wi-Fi, синхронизирует местное время с NTP-сервера, а затем прокручивает время какHH:MMпо всему экрану 8×8.

Как это работает (на высоком уровне)
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Выбор цвета.

Используемые библиотеки
Это включает в себя подробное объяснение того, от чего зависит эскиз:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>УстановитьAdafruit NeoMatrixиспользуя Диспетчер библиотек Arduino. Он также загрузит необходимые зависимости, такие какAdafruit GFX LibraryиAdafruit NeoPixel.
Важные настройки пользователя, которые ВЫ ДОЛЖНЫ изменить
1) Цвет текста (RGB)
Установите цвет текста часов, используя значения от 0 до 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;Эти значения используются здесь:
matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE));Примечание:Если вы установите все цвета на 0 (черный), текст станет невидимым. Эскиз включает проверку безопасности:
// 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;
}Это гарантирует, что матрица никогда не выглядит "мертвой" из-за невидимой настройки цвета.
2) SSID Wi-Fi и пароль
Замените это на ваше настоящее имя и пароль от Wi-Fi:
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";Во время загрузки ESP32 выводит прогресс подключения в Serial Monitor и завершает попытки после примерно 15 секунд (30 попыток × 500 мс).
3) NTP сервер
Сервер NTP по умолчанию:
const char* ntpServer = "pool.ntp.org";Вы можете оставить всё как есть. Если вы когда-либо захотите использовать локальный сервер, замените имя хоста на ваш предпочтительный NTP-сервер.
4) Смещение часового пояса и смещение на летнее время
Эти два параметра управляют местным временем:
// 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Как их установить:
gmtOffset_sec= (Часы смещения по UTC) × 3600. Пример: UTC-5 →-5*3600, UTC+2 →2*3600.daylightOffset_sec=0если вы не хотите изменения на летнее/зимнее время, или3600если ваш регион в настоящее время соблюдает летнее время (+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_*флаги (ВЕРХ/НИЗ, ЛЕВО/ПРАВО, СТРОКИ/СТОЛБЦЫ, ПРОГРЕССИВНЫЙ/ЗИГЗАГ). - Цветовой порядок:Этот код использует
NEO_RGBНекоторые панели являютсяNEO_GRB. Если красный/зеленый/синий не совпадают, изменитеNEO_RGBв правильный порядок.
Яркость
Яркость установлена вinitMatrix():
matrix.setBrightness(40);Увеличьте для более яркого отображения, уменьшите, чтобы снизить тепло и потребление энергии.
Как генерируется время какHH:MM
Часы хранят отформатированное время в буфере на 6 символов:
char timeText[6] = "00:00";ЗатемupdateTimeText()считывает локальное время, синхронизированное с NTP, и выводит текст:
// Format 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();
}Вывод последовательного монитора (отладка)
Этот эскиз выводит полезные сообщения:
- Процесс подключения Wi-Fi и IP-адрес
- Успешно ли синхронизировалось время
- Отформатированная строка времени (например,
Time text: 14:32)
Если дисплей пустой, первым местом для проверки является Серийный монитор, чтобы подтвердить, что Wi-Fi и NTP работают.
Демонстрация проекта
После загрузки и сброса:
- ESP32 подключается к Wi-Fi
- Синхронизирует время с
pool.ntp.org - Шоу
OKкратко о матрице - Постоянно прокручивает текущее время как
HH:MM
Загрузки и ссылки
Н полный код представлен ниже этой статьи. Части, инструменты и технические характеристики также связаны ниже этой статьи.
Этот учебник является частью: ESP32-S3 RGB LED матрица
- Проект матрицы RGB LED ESP32-S3 1 - Основной штрих
- Проект RGB LED матрицы ESP32-S3 2 - Прокручиваемый текст
- Проект RGB LED матрицы ESP32-S3 3 - Текст с мобильного телефона
- Проект RGB LED матрицы ESP32-S3 4 - Наклоненная точка
- Проект матрицы RGB LED на ESP32-S3 5 - Стрелка всегда вверх
- Проект матрицы RGB LED ESP32-S3 6 - Игра цель
- ESP32-S3 RGB светодиодная матрица Интернет-часы - 2-часовой многоцветный дисплей времени и даты
- Проект интернет-часов на матрице RGB LED ESP32-S3 - 3 ночных цвета с датой
- Проект интернет-часов на матрице RGB LED ESP32-S3 - 5 радуга цветов
- Проект интернет-часы с матрицей RGB LED на ESP32-S3 - 4 случайных цвета
- Тест матрицы RGB LED ESP32-S3 для настройки 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
}
}
Вещи, которые могут вам понадобиться
-
Амазонка
-
eBay
-
АлиЭкспрессКупить ESP32-S3 RGB-матрицу на AliExpresss.click.aliexpress.com
-
АлиЭкспрессПриобретите ESP32-S3 RGB Matrix на AliExpress (2)s.click.aliexpress.com
Ресурсы и ссылки
Файлы📁
Файл Fritzing
-
esp32-S3-supermini-tht часть фритзинга
esp32-S3-supermini-tht.fzpz0.02 MB