Ten poradnik jest częścią: Matryca LED RGB ESP32-S3
Fajny projekt do stworzenia dla zabawy i praktycznych zastosowań z wykorzystaniem modułu matrycy RGB ESP32-S3. Linki do innych filmów znajdują się poniżej tego artykułu.
Projekt zegara internetowego z matrycą LED RGB ESP32-S3 - 2 zegary wielokolorowe z wyświetlaniem czasu i daty
Zegar internetowy ESP32-S3 RGB NeoMatrix z wyświetlaniem czasu i daty
Ten projekt to ulepszony zegar internetowy ESP32-S3 RGB Matrix, który nie tylko pokazuje aktualny czas, ale także okresowo wyświetla datę. ESP32-S3 łączy się z Wi-Fi, synchronizuje czas z serwera NTP i przewija HH:MM lub datę (na przykład WRZ 21) na matrycy 8×8 RGB NeoMatrix. Wyświetlacz obsługuje automatyczną regulację jasności w dzień i w nocy oraz konfigurowalne kolory RGB.

Co robi ten zegar
Po połączeniu z siecią Wi-Fi ESP32-S3 pobiera aktualny czas lokalny z internetu. Zegar normalnie przewija czas, ale w stałych odstępach przełącza się na wyświetlanie daty. Kolor tekstu może być stały lub automatycznie zmieniać się między wieloma zdefiniowanymi przez użytkownika kolorami. Jasność jest automatycznie zmniejszana w nocy, aby wyświetlacz był łatwiejszy dla oczu.
Użyte biblioteki
Ten szkic zależy od następujących bibliotek:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
Zainstaluj Adafruit NeoMatrix z Menedżera bibliotek Arduino. Wszystkie wymagane zależności, takie jak Adafruit GFX Library i Adafruit NeoPixel, zostaną zainstalowane automatycznie.

Ważna konfiguracja użytkownika
Nazwa i hasło Wi-Fi (wielkość liter ma znaczenie)
Musisz zastąpić dane logowania Wi-Fi własnymi informacjami o sieci:

const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
Ważne: Nazwy Wi-Fi SSID są wrażliwe na wielkość liter. Na przykład SSID o nazwie "Book" nie jest tym samym co "book". Jeśli wielkość liter nie będzie dokładnie zgodna, ESP32 nie połączy się.
Serwer NTP, strefa czasowa i czas letni
Zegar korzysta z internetowego serwera czasu:
const char* ntpServer = "pool.ntp.org";
Czas lokalny jest obliczany przy użyciu tych przesunięć:
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
gmtOffset_sec: Twoje przesunięcie UTC w sekundach (przykład: UTC-5 =-5 * 3600)daylightOffset_sec: Użyj3600dla czasu letniego lub0, jeśli czas letni nie jest stosowany
Te ustawienia są stosowane za pomocą:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Kontrola jasności (dzień / noc)
Ten projekt automatycznie dostosowuje jasność na podstawie godziny dnia:
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
Między 22:00 a 6:00 jasność jest zmniejszana, aby wyświetlacz był mniej rozpraszający w ciemnym otoczeniu. Możesz dostosować te wartości do swoich preferencji.
Konfiguracja kolorów RGB
Zegar obsługuje zarówno tryb stałego koloru, jak i automatyczną zmianę kolorów. Zdefiniowane przez użytkownika kolory RGB są przechowywane w tablicy:
uint8_t userColors[][3] = {
{17, 43, 171}, // Jasnoniebieski
{255, 0, 0}, // Czerwony
{0, 255, 0}, // Zielony
{255, 165, 0}, // Pomarańczowy
{255, 0, 255} // Magenta
};
Każdy kolor używa wartości RGB (czerwony, zielony, niebieski) w zakresie od 0 do 255. Zmieniając te liczby, możesz stworzyć praktycznie dowolny kolor wyświetlacza. Jeśli useFixedColor jest ustawione na true, zegar zawsze używa jednego koloru. Jeśli ustawione na false, kolor automatycznie zmienia się po każdym pełnym przewinięciu.
Aby szybko znaleźć dokładne wartości RGB dla dowolnego koloru, użyj narzędzia do wyboru kolorów RGB Color Picker .
Formatowanie czasu i daty
Czas jest formatowany jako HH:MM i przechowywany w małym buforze znaków. Data jest formatowana jako ciąg wielkimi literami, taki jak WRZ 21. Wyświetlacz automatycznie przełącza się między czasem a datą w stałych odstępach.
Logika przewijania na wyświetlaczu 8×8
Ponieważ matryca 8×8 jest zbyt mała, aby pokazać cały tekst naraz, szkic przewija tekst poziomo. Gdy tekst całkowicie opuści wyświetlacz, kolor jest aktualizowany, a treść przełącza się między czasem a datą, gdy jest to potrzebne.
Demonstracja
Po wgraniu szkicu:
- ESP32 łączy się z Wi-Fi
- Czas jest synchronizowany z internetu
- Aktualny czas przewija się na matrycy
- Data pojawia się okresowo
- Jasność automatycznie dostosowuje się do dnia i nocy
Pliki do pobrania i linki
Pełny kod źródłowy znajduje się poniżej tego artykułu. Linki do części, narzędzi i kart katalogowych są również dostępne poniżej tego artykułu.
Ten poradnik jest częścią: Matryca LED RGB ESP32-S3
- Projekt matrycy LED RGB ESP32-S3 1 – podstawowa kropka
- Projekt matrycy LED RGB ESP32-S3 2 - Przewijany tekst
- Projekt ESP32-S3 z matrycą LED RGB 3 - Tekst z telefonu komórkowego
- Projekt ESP32-S3 z matrycą LED RGB 4 - Punkt przechyłu
- Projekt matrycy LED RGB ESP32-S3 5 - Strzałka zawsze w górę
- Projekt ESP32-S3 z matrycą LED RGB 6 - gra w cel
- Projekt zegara czasu Wi-Fi + NTP z matrycą LED RGB ESP32-S3 -1 Zegar podstawowy
- Projekt zegara internetowego z matrycą LED RGB ESP32-S3 - 3 kolory nocne z datą
- Projekt zegara internetowego z matrycą LED RGB ESP32-S3 - 5 kolorów tęczy
- Projekt zegara internetowego z matrycą LED RGB ESP32-S3 - 4 losowe kolory
- ESP32-S3 RGB LED Matrix test for RGB, GRB setting
/*
* =====================================================================================
* ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 2
Multi color
* =====================================================================================
watch video https://youtube.com/shorts/4iWjLiD7fS8
📚⬇️ Download and resource page https://robojax.com/RJT839
* Author: Ahmad Shamshiri (Robojax.com)
* Date: 07 Jan 2026
* * FEATURES:
* 1. WiFi/NTP Time: Syncs automatically with internet time servers.
* 2. Cycle-Based Color: Color changes ONLY when text finishes a full scroll.
* 3. Auto-Brightness: Dims the LEDs during night hours (User-configurable).
* 4. Periodic Date: Scrolls the date (e.g., "JAN 07") every 2 minutes.
* * USER CONFIGURATION GUIDE:
* -------------------------
* - WiFi: Change 'WIFI_SSID' and 'WIFI_PASSWORD' to your local network.
* - Colors: Add or remove {R, G, B} sets in the 'userColors' array.
* - Night Mode: Adjust 'NIGHT_START_HOUR' and 'NIGHT_BRIGHTNESS'.
* =====================================================================================
*/
#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define MATRIX_PIN 14
// --- BRIGHTNESS CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
// --- COLOR CONFIGURATION ---
bool useFixedColor = false;
int fixedColorIndex = 0;
uint8_t userColors[][3] = {
{17, 43, 171}, // Light Blue
{255, 0, 0}, // Red
{0, 255, 0}, // Green
{255, 165, 0}, // Orange
{255, 0, 255} // Magenta
};
// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
int currentColorIndex = 0;
int totalColors = sizeof(userColors) / sizeof(userColors[0]);
// --- DATE/TIME INTERVALS ---
unsigned long lastDateShowMs = 0;
const uint32_t dateIntervalMs = 30000; // 2 minutes
unsigned long lastTimeUpdateMs = 0;
const uint16_t timeUpdateIntervalMs = 1000;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;
// --- GLOBAL VARIABLES ---
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";
char dateText[10] = "";
char currentDisplayText[12] = "";
int16_t scrollX = 8;
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
void updateTimeAndDate() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) return;
snprintf(timeText, sizeof(timeText), "%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min);
strftime(dateText, sizeof(dateText), "%b %d", &timeinfo);
for (int i = 0; dateText[i]; i++) dateText[i] = toupper(dateText[i]);
if (timeinfo.tm_hour >= NIGHT_START_HOUR || timeinfo.tm_hour < NIGHT_END_HOUR) {
matrix.setBrightness(NIGHT_BRIGHTNESS);
} else {
matrix.setBrightness(DAY_BRIGHTNESS);
}
}
void scrollDisplay() {
matrix.fillScreen(0);
// FIXED LOGIC: Uses currentColorIndex which only changes at the end of a scroll
int idx = useFixedColor ? fixedColorIndex : currentColorIndex;
matrix.setTextColor(matrix.Color(userColors[idx][0], userColors[idx][1], userColors[idx][2]));
matrix.setCursor(scrollX, 0);
matrix.print(currentDisplayText);
matrix.show();
scrollX--;
int16_t textWidth = strlen(currentDisplayText) * 6;
// THE TRIGGER POINT: This happens only when text is fully off-screen
if (scrollX < -textWidth) {
scrollX = matrix.width();
// 1. Cycle the color now and only now
if (!useFixedColor) {
currentColorIndex = (currentColorIndex + 1) % totalColors;
}
// 2. Decide whether to switch between Time and Date
if (millis() - lastDateShowMs > dateIntervalMs) {
strcpy(currentDisplayText, dateText);
lastDateShowMs = millis();
} else {
strcpy(currentDisplayText, timeText);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(DAY_BRIGHTNESS);
updateTimeAndDate();
strcpy(currentDisplayText, timeText);
}
void loop() {
unsigned long now = millis();
if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
lastTimeUpdateMs = now;
updateTimeAndDate();
}
if (now - lastScrollMs >= scrollIntervalMs) {
lastScrollMs = now;
scrollDisplay();
}
}
Rzeczy, których możesz potrzebować
-
Amazon
-
Allegro
-
AliExpressPurchase ESP32-S3 RGB matrix from AliExpresss.click.aliexpress.com
-
AliExpressPurchase ESP32-S3 RGB matrix from AliExpress (2)s.click.aliexpress.com
Zasoby i odniesienia
-
Wideo
Pliki📁
Plik Fritzing
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB