This tutorial is part of: ESP32-S3 RGB LED matrica
Kul projekat za kreiranje zabave i praktičnih aplikacija korištenjem ESP32-S3 RGB Matrix modula. Linkovi do drugih videa nalaze se ispod ovog članka.
ESP32-S3 RGB LED matrica internet sat projekat - 5 duginih boja
ESP32-S3 Internet sat s duginim efektom duginih boja
Ovaj projekat je ESP32-S3 RGB Matrix Internet sat koji se povezuje na Wi-Fi, sinhronizuje lokalno vrijeme sa NTP servera i prikazuje vrijeme u HH:MM formatu preko ugrađenog 8×8 RGB NeoMatrix ekrana. Za razliku od verzija sa jednoličnim ili nasumičnim bojama, ovaj sat koristi glatki efekt duginih boja, gdje se svaki znak kontinuirano mijenja kroz RGB spektar dok se pomiče. Sat također povremeno prikazuje datum i automatski prilagođava svjetlinu između dana i noći.

Kako ovaj sat radi
Nakon što se napaja putem USB-C priključka, ESP32-S3 se povezuje na vašu Wi-Fi mrežu i preuzima trenutno lokalno vrijeme s interneta. Ekran normalno prikazuje vrijeme koje se pomiče, ali u definisanom intervalu prelazi na prikaz datuma. I vrijeme i datum prikazuju se pomoću dinamičkog efekta duginih boja, stvarajući živahan i animiran prikaz na malom 8×8 matricnom ekranu.
Korištene biblioteke
Skica se oslanja na sljedeće biblioteke:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
Instalirajte Adafruit NeoMatrix pomoću Arduino Library Manager-a. Njegove zavisnosti, uključujući Adafruit GFX Library i Adafruit NeoPixel, bit će automatski instalirane.

Važna korisnička konfiguracija
Matrix data pin (ugrađeni RGB matrix)
Iako je RGB matrix priključen na ESP32-S3 ploču, data pin i dalje mora biti definisan u kodu:

#define MATRIX_PIN 14
GPIO 14 se obično koristi na ESP32-S3 RGB matrix pločama. Ako vaša varijanta ploče koristi drugi pin, ažurirajte ovu vrijednost.
Wi-Fi SSID i lozinka (osjetljivo na velika i mala slova)
Zamijenite Wi-Fi kredencijale s podacima vaše mreže:
const char* WIFI_SSID = "your WIFI";
const char* WIFI_PASSWORD = "passW0rd";
Važno: Wi-Fi SSID-ovi su osjetljivi na velika i mala slova. SSID nazvan "Book" nije isti kao "book". Ako se velika i mala slova ne poklapaju tačno, ESP32-S3 se neće moći povezati.
NTP server, vremenska zona i ljetno računanje vremena
Sat sinhronizuje vrijeme koristeći internet NTP server:
const char* ntpServer = "pool.ntp.org";
Lokalno vrijeme izračunava se pomoću ovih pomaka:
// Toronto-ish: UTC-5, plus 1 hour DST
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
gmtOffset_sec: UTC pomak u sekundama (primjer: UTC-5 =-5 * 3600)daylightOffset_sec: Koristite3600ako je ljetno računanje vremena aktivno, ili0ako se ne koristi
Ove vrijednosti primjenjuju se pomoću:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Automatska svjetlina dan / noć
Svjetlina se automatski mijenja na osnovu trenutnog sata:
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
Između 22:00 i 6:00, matrica se prigušuje kako bi se smanjilo odsjaj. Tokom dnevnih sati, normalna svjetlina se vraća.
Efekt duginih boja
Ovaj projekat koristi klasični RGB kotač boja za generisanje glatkih duginih boja. Svaki znak se crta s malo drugačijim pomakom boje, a boje se mijenjaju tokom vremena, stvarajući tekuću dugu animaciju.
// Helper to create Rainbow Colors
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return matrix.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return matrix.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return matrix.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
Dok se tekst pomiče, svaki znak prolazi kroz RGB spektar, stvarajući kontinuirani efekt duge koji izgleda posebno impresivno na malom 8×8 ekranu.
Ponašanje prikaza vremena i datuma
Sat održava odvojene buffere za vrijeme i datum:
- Vrijeme:
HH:MM - Datum:
MMM DD(na primjerJAN 08)
Datum se prikazuje u fiksnom intervalu:
const uint32_t dateIntervalMs = 60000; // Show date every 1 minute
Na kraju svakog punog ciklusa pomicanja, kod odlučuje hoće li nastaviti prikazivati vrijeme ili preći na datum.
Logika pomicanja na 8×8 matrici
Budući da je ekran širok samo 8 piksela, tekst se glatko pomiče s desna na lijevo. Kada tekst u potpunosti napusti ekran, kursor se resetuje i sljedeći sadržaj (vrijeme ili datum) učitava se za sljedeći prolaz.
Demonstracija
Nakon što prenesete skicu i napajate ploču putem USB-C priključka:
- ESP32-S3 se povezuje na vašu Wi-Fi mrežu
- Vrijeme se sinhronizuje s interneta
- Vrijeme se pomiče u
HH:MMformatu - Datum se pojavljuje povremeno
- Sav tekst prikazuje se s glatkim animiranim efektom duginih boja
- Ekran se automatski prigušuje noću i posvjetljuje tokom dana
Preuzimanja i linkovi
Kompletni izvorni kod je naveden ispod ovog članka. Korisni alati i reference, uključujući RGB Color Picker, također su povezani ispod ovog članka.
This tutorial is part of: ESP32-S3 RGB LED matrica
- ESP32-S3 RGB LED Matrix projekat 1 - Osnovna tačka
- ESP32-S3 RGB LED Matrix projekat 2 - Tekst koji se pomiče
- ESP32-S3 RGB LED Matrix projekat 3 - Tekst sa mobilnog telefona
- ESP32-S3 RGB LED Matrix projekat 4 - Tilt tačka
- ESP32-S3 RGB LED Matrica Projekat 5 - Strelica uvijek gore
- ESP32-S3 RGB LED Matrix projekat 6 - Cible igra
- ESP32-S3 RGB LED matrica Wi-Fi + NTP sat vremena projekat -1 Osnovni sat
- ESP32-S3 RGB LED matrica Internet sat projekat - 2 sata višebojni prikaz vremena i datuma
- ESP32-S3 RGB LED matrica internet sat projekat - 3 noćne boje sa datumom
- ESP32-S3 RGB LED matrica internet sat projekat - 4 nasumične boje
- ESP32-S3 RGB LED Matrix test for RGB, GRB setting
/*
* =====================================================================================
* ESP32-S3 CLOCK - RAINBOW DATE & SOLID TIME - Project 5- RAINBOW MODE
* =====================================================================================
watch video https://youtube.com/shorts/4iWjLiD7fS8
📚⬇️ Download and resource page https://robojax.com/RJT842
* Author: Gemini (AI Thought Partner) & Ahmad Shamshiri (Robojax.com)
* Date: 07 Jan 2026
* =====================================================================================
* ESP32-S3 INTERNET RGB CLOCK - RAINBOW MODE
* * FEATURES:
* - Full Rainbow: Time and Date use flowing rainbow colors.
* - Auto-Brightness: Dims at night (22:00 to 06:00).
* - Custom WiFi: Robust connection logic with retries.
* =====================================================================================
*/
#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define MATRIX_PIN 14
// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID = "your WIFI";
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
// --- BRIGHTNESS CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
// --- INTERVALS & TRACKING ---
unsigned long lastDateShowMs = 0;
const uint32_t dateIntervalMs = 60000; // Show date every 1 minute
bool isShowingDate = false;
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;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;
unsigned long lastTimeUpdateMs = 0;
// Helper to create Rainbow Colors
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return matrix.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return matrix.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return matrix.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void updateClockData() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) return;
// Update Time and Date strings
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]);
// Handle Night Dimming
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);
int len = strlen(currentDisplayText);
int16_t x = scrollX;
// Draw each character with a shifting rainbow color
for (int i = 0; i < len; i++) {
uint8_t colorPos = (uint8_t)((i * 30) + (millis() / 5));
matrix.setTextColor(Wheel(colorPos));
matrix.setCursor(x + (i * 6), 0);
matrix.print(currentDisplayText[i]);
}
matrix.show();
scrollX--;
int16_t textWidth = len * 6;
if (scrollX < -textWidth) {
scrollX = matrix.width();
// Switch between Date and Time at end of cycle
if (millis() - lastDateShowMs > dateIntervalMs) {
strcpy(currentDisplayText, dateText);
lastDateShowMs = millis();
isShowingDate = true;
} else {
strcpy(currentDisplayText, timeText);
isShowingDate = false;
}
}
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\nESP32-S3 Rainbow Clock Initializing...");
// 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());
}
// 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);
updateClockData();
strcpy(currentDisplayText, timeText); // Load initial time
}
void loop() {
unsigned long now = millis();
// Update time digits and check brightness every second
if (now - lastTimeUpdateMs >= 1000) {
lastTimeUpdateMs = now;
updateClockData();
}
// Handle the scrolling animation
if (now - lastScrollMs >= scrollIntervalMs) {
lastScrollMs = now;
scrollDisplay();
}
}
Resources & references
-
Video
-
Internal🎨 Color picker Toolrobojax.com
Files📁
Fritzing File
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB