Search Code

ESP32-S3 RGB LED-matrix internetklokproject - 5 Regenboogkleur

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.

ESP32-s3_internet_clock_animation

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: Gebruik 3600 als zomertijd actief is, of 0 als 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 (bijvoorbeeld JAN 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.

Afbeeldingen

ESP32 S3 Matrix
ESP32 S3 Matrix
ESP32 S3 Matrix  pin out
ESP32 S3 Matrix pin out
ESP32-S3_RGB_8x8_matrix-3
ESP32-S3_RGB_8x8_matrix-3
ESP32-S3_RGB_8x8_matrix1
ESP32-S3_RGB_8x8_matrix1
ESP32-S3_RGB_8x8_matrix-2
ESP32-S3_RGB_8x8_matrix-2
ESP32-s3_internet_clock_animation
ESP32-s3_internet_clock_animation
872-ESP32-S3 RGB LED Matrix Internte Clock Project 5 - Rainbow Color
Taal: C++
/*
 * =====================================================================================
 * 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

Bestanden📁

Fritzing-bestand