This tutorial is part of: ESP32-S3 RGB LED-matrix
Een gaaf project om te maken voor de lol en voor praktische toepassingen met de ESP32-S3 RGB-matrixmodule. Links naar andere video's vind je onderaan dit artikel.
ESP32-S3 RGB LED-matrix internetklokproject - 5 Regenboogkleur
ESP32-S3 internetklok met regenboogkleureffect
Dit project is een ESP32-S3 RGB-matrix-internetklok die verbinding maakt met Wi-Fi, de lokale tijd synchroniseert vanaf een NTP-server en de tijd in HH:MM-formaat over de ingebouwde 8×8 RGB-NeoMatrix laat scrollen. In tegenstelling tot effen of willekeurige kleurversies gebruikt deze klok een vloeiend regenboogkleureffect, waarbij elk teken continu door het RGB-spectrum verschuift terwijl het scrollt. De klok toont ook periodiek de datum en past de helderheid automatisch aan tussen dag en nacht.

Hoe deze klok werkt
Zodra de klok via USB-C van stroom wordt voorzien, maakt de ESP32-S3 verbinding met uw Wi-Fi-netwerk en haalt de huidige lokale tijd van internet op. Het display scrollt normaal gesproken de tijd, maar schakelt met een vast interval over naar het tonen van de datum. Zowel de tijd als de datum worden weergegeven met een dynamisch regenboogeffect, wat zorgt voor een levendig en geanimeerd display op de kleine 8×8-matrix.
Gebruikte bibliotheken
De sketch maakt gebruik van de volgende bibliotheken:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
Installeer Adafruit NeoMatrix via de Arduino Library Manager. De afhankelijkheden, waaronder Adafruit GFX Library en Adafruit NeoPixel, worden automatisch geïnstalleerd.

Belangrijke gebruikersconfiguratie
Matrix-datapin (ingebouwde RGB-matrix)
Hoewel de RGB-matrix aan het ESP32-S3-bord is bevestigd, moet de datapin nog steeds in de code worden gedefinieerd:

#define MATRIX_PIN 14
GPIO 14 wordt vaak gebruikt op ESP32-S3 RGB-matrixborden. Als uw bordvariant een andere pin gebruikt, werk deze waarde dan bij.
Wi-Fi-SSID en wachtwoord (hoofdlettergevoelig)
Vervang de Wi-Fi-referenties door uw eigen netwerkgegevens:
const char* WIFI_SSID = "uw WIFI";
const char* WIFI_PASSWORD = "wachtW0ord";
Belangrijk: Wi-Fi-SSID's zijn hoofdlettergevoelig. Een SSID met de naam "Boek" is niet hetzelfde als "boek". Als de hoofdletters niet exact overeenkomen, kan de ESP32-S3 geen verbinding maken.
NTP-server, tijdzone en zomertijd
De klok synchroniseert de tijd met behulp van een internet-NTP-server:
const char* ntpServer = "pool.ntp.org";
De lokale tijd wordt berekend met behulp van deze offsets:
// Toronto-achtig: UTC-5, plus 1 uur zomertijd
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
gmtOffset_sec: UTC-offset in seconden (voorbeeld: UTC-5 =-5 * 3600)daylightOffset_sec: Gebruik3600als zomertijd actief is, of0als deze niet wordt gebruikt
Deze waarden worden toegepast met:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Automatische dag-/nacht-helderheid
De helderheid verandert automatisch op basis van het huidige uur:
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
Tussen 22:00 en 06:00 uur wordt de matrix gedimd om schittering te verminderen. Gedurende de dag wordt de normale helderheid hersteld.
Regenboogkleureffect
Dit project gebruikt een klassiek RGB-kleurwiel om vloeiende regenboogkleuren te genereren. Elk teken wordt getekend met een iets andere kleuroffset, en de kleuren verschuiven in de loop van de tijd, wat een vloeiende regenbooganimatie oplevert.
// Helper om regenboogkleuren te maken
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);
}
Terwijl de tekst scrollt, schuift elk teken door het RGB-spectrum, wat een continu regenboogeffect creëert dat er bijzonder indrukwekkend uitziet op het kleine 8×8-display.
Gedrag van tijd- en datumweergave
De klok onderhoudt afzonderlijke buffers voor tijd en datum:
- Tijd:
HH:MM - Datum:
MMM DD(bijvoorbeeldJAN 08)
De datum wordt met een vast interval getoond:
const uint32_t dateIntervalMs = 60000; // Toon datum elke 1 minuut
Aan het einde van elke volledige scrollcyclus beslist de code of de tijd wordt blijven getoond of wordt overgeschakeld naar de datum.
Scrolllogica op een 8×8-matrix
Omdat het display slechts 8 pixels breed is, scrollt de tekst vloeiend van rechts naar links. Zodra de tekst volledig van het scherm is verdwenen, wordt de cursor gereset en wordt de volgende inhoud (tijd of datum) voor de volgende doorgang geladen.
Demonstratie
Na het uploaden van de sketch en het voeden van het bord via USB-C:
- Maakt de ESP32-S3 verbinding met uw Wi-Fi-netwerk
- Wordt de tijd vanaf internet gesynchroniseerd
- Scrollt de tijd in
HH:MM-formaat - Verschijnt de datum periodiek
- Wordt alle tekst weergegeven met een vloeiend geanimeerd regenboogeffect
- Wordt het display 's nachts automatisch gedimd en overdag helderder
Downloads en links
De volledige broncode wordt onder dit artikel verstrekt. Nuttige hulpmiddelen en referenties, waaronder de RGB-kleurkiezer, zijn ook onder dit artikel gelinkt.
This tutorial is part of: ESP32-S3 RGB LED-matrix
- ESP32-S3 RGB LED-matrixproject 1- Basispunt
- ESP32-S3 RGB LED-matrixproject 2 - Scrollende tekst
- ESP32-S3 RGB LED-matrixproject 3 - Tekst vanaf mobiele telefoon
- ESP32-S3 RGB LED-matrixproject 4 - Kantelpunt
- ESP32-S3 RGB LED-matrixproject 5 - Pijl altijd omhoog
- ESP32-S3 RGB LED-matrixproject 6 - Cible-spel
- ESP32-S3 RGB LED-matrix Wi-Fi + NTP-tijdklokproject -1 Basisklok
- ESP32-S3 RGB LED-matrix internetklokproject - 2 klokken multi-kleur tijd- en datumweergave
- ESP32-S3 RGB LED-matrix internetklokproject - 3 nachtkleuren met datum
- ESP32-S3 RGB LED-matrix internetklokproject - 4 willekeurige kleuren
- 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();
}
}
Hulpmiddelen en referenties
-
Video
-
Intern🎨 Color picker Toolrobojax.com
Bestanden📁
Fritzing-bestand
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB