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 - 4 losowe kolory
Zegar internetowy ESP32-S3 z losowymi kolorami RGB
Ten projekt to zegar internetowy ESP32-S3 z matrycą RGB, który łączy się z Wi-Fi, synchronizuje czas lokalny z serwera NTP i przewija czas w formacie HH:MM przez wbudowaną matrycę 8×8 RGB NeoMatrix. W tej wersji godziny, dwukropek i minuty są renderowane w losowych kolorach wybieranych przy każdym pełnym cyklu przewijania, tworząc dynamiczny i zabawny wyświetlacz zegara, który stale się zmienia.

Jak działa ten zegar
Po zasileniu płytki przez USB-C, ESP32-S3 łączy się z Twoją siecią Wi-Fi i pobiera aktualny czas lokalny z internetu. Czas jest dzielony na trzy części—godziny, dwukropek i minuty—a każda część jest rysowana osobno na matrycy RGB. Gdy tekst całkowicie przewinie się poza ekran, dla następnego przejścia wybierane są nowe losowe kolory.
Użyte biblioteki
Ten szkic używa 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. Wymagane zależności, takie jak Adafruit GFX Library i Adafruit NeoPixel, zostaną zainstalowane automatycznie.

Ważna konfiguracja użytkownika
Pin danych matrycy (wbudowana matryca RGB)
Chociaż matryca RGB jest zintegrowana z płytką, pin danych musi być nadal zdefiniowany w kodzie:

#define MATRIX_PIN 14
GPIO 14 jest powszechnie używany na płytkach ESP32-S3 z matrycą RGB. Jeśli Twój wariant płytki używa innego pinu, zaktualizuj tę wartość odpowiednio.
Nazwa Wi-Fi (SSID) i hasło (rozróżniana wielkość liter)
Zastąp dane logowania Wi-Fi własnymi danymi sieci:
const char* WIFI_SSID = "twoja nazwa WiFi";
const char* WIFI_PASSWORD = "haslo123";
Ważne: Nazwy Wi-Fi (SSID) są rozróżniane pod względem wielkości liter. Nazwa "Book" nie jest taka sama jak "book". Jeśli wielkość liter nie będzie dokładnie zgodna, ESP32-S3 nie połączy się.
Serwer NTP, strefa czasowa i czas letni
Synchronizacja czasu odbywa się za pomocą internetowego serwera NTP:
const char* ntpServer = "pool.ntp.org";
Czas lokalny jest obliczany przy użyciu przesunięć UTC i czasu letniego:
// Toronto: UTC-5, plus 1 godzina czasu letniego
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
gmtOffset_sec: przesunięcie UTC w sekundach (dostosuj do swojej lokalizacji)daylightOffset_sec: użyj3600, gdy czas letni jest aktywny, lub0w przeciwnym razie
Te ustawienia są stosowane za pomocą:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Automatyczna jasność dzień / noc
Zegar automatycznie dostosowuje jasność na podstawie bieżącej godziny:
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 wyświetlacz przygasa, aby zmniejszyć odblaski w ciemnym otoczeniu. W ciągu dnia matryca wraca do normalnej jasności.
Zachowanie losowych kolorów RGB
Predefiniowana lista kolorów RGB jest przechowywana w tablicy, gdzie każdy kolor jest zdefiniowany przy użyciu wartości czerwonego, zielonego i niebieskiego w zakresie od 0 do 255:
uint8_t userColors[][3] = {
{255, 0, 0}, // Czerwony
{0, 255, 0}, // Zielony
{0, 0, 255}, // Niebieski
{255, 165, 0}, // Pomarańczowy
{255, 0, 255}, // Magenta
{0, 255, 255}, // Cyjan
{255, 255, 0} // Żółty
};
Przy każdym pełnym cyklu przewijania:
- Cyfry godzin otrzymują losowy kolor
- Dwukropek otrzymuje inny losowy kolor
- Cyfry minut otrzymują kolejny losowy kolor
To tworzy stale zmieniającą się kombinację kolorów, która utrzymuje zegar wizualnie interesującym. Aby stworzyć własne kolory, możesz użyć narzędzia RGB Color Picker: RGB Color Picker.
Logika renderowania czasu
Czas jest dzielony na trzy komponenty:
- Godziny:
HH - Dwukropek:
: - Minuty:
MM
Każda część jest rysowana osobno, aby mogła mieć własny kolor, podczas gdy wszystkie części poruszają się razem, tworząc płynną animację przewijania na wyświetlaczu 8×8.
Generowanie losowych kolorów
Aby zapewnić losowość kolorów, szkic inicjuje generator liczb losowych przy starcie, używając niepodłączonego pinu analogowego:
randomSeed(analogRead(0));
To gwarantuje, że kombinacje kolorów będą różne przy każdym włączeniu zasilania i każdym cyklu przewijania.
Demonstracja
Po wgraniu szkicu i zasileniu płytki przez USB-C:
- ESP32-S3 łączy się z Twoją siecią Wi-Fi
- Czas jest synchronizowany z internetu
- Czas przewija się w formacie
HH:MM - Godziny, dwukropek i minuty zmieniają kolory na losowe przy każdym cyklu
- Wyświetlacz automatycznie przygasa w nocy
Pliki do pobrania i linki
Pełny kod źródłowy znajduje się poniżej tego artykułu. Przydatne narzędzia i odniesienia są podlinkowane 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 - 2 zegary wielokolorowe z wyświetlaniem czasu i daty
- 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
- ESP32-S3 RGB LED Matrix test for RGB, GRB setting
/*
* =====================================================================================
* ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 4- Random Color
* =====================================================================================
watch video https://youtube.com/shorts/4iWjLiD7fS8
📚⬇️ Download and resource page https://robojax.com/RJT843
* Author: Gemini (AI Thought Partner) & 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 after the time finishes a full scroll.
* 3. Auto-Brightness: Dims the LEDs during night hours (User-configurable).
* =====================================================================================
*/
/*
* =====================================================================================
* ESP32-S3 INTERNET CLOCK - MULTI-COLOR ELEMENTS
* =====================================================================================
* Each part of the time (HH : MM) gets a different random color from your list.
* Colors only change once the full scroll cycle is finished.
* =====================================================================================
*/
#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define MATRIX_PIN 14
// --- CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
uint8_t userColors[][3] = {
{255, 0, 0}, // Red
{0, 255, 0}, // Green
{0, 0, 255}, // Blue
{255, 165, 0}, // Orange
{255, 0, 255}, // Magenta
{0, 255, 255}, // Cyan
{255, 255, 0} // Yellow
};
int totalColors = sizeof(userColors) / sizeof(userColors[0]);
// Variables to store the current random color indices
int hourColorIdx = 0;
int colonColorIdx = 1;
int minColorIdx = 2;
// --- GLOBALS ---
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);
char hourText[3], minText[3];
int16_t scrollX = 8;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;
// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID = "your WiFi SSID";
const char* WIFI_PASSWORD = "passW0rd";
// 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
void updateTimeParts() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) return;
snprintf(hourText, sizeof(hourText), "%02d", timeinfo.tm_hour);
snprintf(minText, sizeof(minText), "%02d", timeinfo.tm_min);
if (timeinfo.tm_hour >= NIGHT_START_HOUR || timeinfo.tm_hour < NIGHT_END_HOUR) {
matrix.setBrightness(NIGHT_BRIGHTNESS);
} else {
matrix.setBrightness(DAY_BRIGHTNESS);
}
}
void scrollTime() {
matrix.fillScreen(0);
int x = scrollX;
// 1. Draw Hours
matrix.setTextColor(matrix.Color(userColors[hourColorIdx][0], userColors[hourColorIdx][1], userColors[hourColorIdx][2]));
matrix.setCursor(x, 0);
matrix.print(hourText);
x += 12; // Move 12 pixels (2 digits * 6px)
// 2. Draw Colon
matrix.setTextColor(matrix.Color(userColors[colonColorIdx][0], userColors[colonColorIdx][1], userColors[colonColorIdx][2]));
matrix.setCursor(x, 0);
matrix.print(":");
x += 6; // Move 6 pixels
// 3. Draw Minutes
matrix.setTextColor(matrix.Color(userColors[minColorIdx][0], userColors[minColorIdx][1], userColors[minColorIdx][2]));
matrix.setCursor(x, 0);
matrix.print(minText);
matrix.show();
scrollX--;
// Total width is roughly 30 pixels (HH=12, :=6, MM=12)
if (scrollX < -30) {
scrollX = matrix.width();
// Pick NEW random colors for the next cycle
hourColorIdx = random(0, totalColors);
colonColorIdx = random(0, totalColors);
minColorIdx = random(0, totalColors);
}
}
void setup() {
Serial.begin(115200);
// Seed the random generator using an unconnected analog pin
randomSeed(analogRead(0));
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
// Configure time via NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("Waiting for time...");
delay(2000); // small wait for initial sync
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(DAY_BRIGHTNESS);
}
void loop() {
if (millis() % 1000 == 0) updateTimeParts();
if (millis() - lastScrollMs >= scrollIntervalMs) {
lastScrollMs = millis();
scrollTime();
}
}
Zasoby i odniesienia
-
Wideo
-
Wewnętrzny🎨 Color picker Toolrobojax.com
Pliki📁
Plik Fritzing
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB