Search Code

ESP32-S3 RGB LED matrica internet sat projekat - 5 duginih boja

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.

ESP32-s3_internet_clock_animation

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: Koristite 3600 ako je ljetno računanje vremena aktivno, ili 0 ako 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 primjer JAN 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:MM formatu
  • 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.

Images

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
Language: 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();
  }
}

Resources & references

Files📁

Fritzing File