Search Code

Projekt internetových hodín s RGB LED maticou ESP32-S3 - 4 náhodné farby

Projekt internetových hodín s RGB LED maticou ESP32-S3 - 4 náhodné farby

ESP32-S3 internetové hodiny s náhodnými RGB farbami

Tento projekt je ESP32-S3 RGB Matrix internetový hodinový displej, ktorý sa pripája k Wi-Fi, synchronizuje miestny čas z NTP servera a posúva čas vo formáte HH:MM cez vstavanú 8×8 RGB NeoMatrix. V tejto verzii sú hodiny, dvojbodka a minúty zobrazené v náhodných farbách, ktoré sa vyberajú pri každom úplnom cykle posúvania, čím vytvárajú dynamický a hravý hodinový displej, ktorý sa neustále mení.

ESP32-s3_internet_clock_animation

Ako tieto hodiny fungujú

Po napájaní dosky cez USB-C sa ESP32-S3 pripojí k vašej Wi-Fi sieti a získa aktuálny miestny čas z internetu. Čas je rozdelený na tri časti—hodiny, dvojbodku a minúty—a každá časť je vykreslená samostatne na RGB matici. Keď sa text úplne posunie z obrazovky, pre ďalší prechod sa vyberú nové náhodné farby.

Použité knižnice

Tento náčrt používa nasledujúce knižnice:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

Nainštalujte Adafruit NeoMatrix zo správcu knižníc Arduino. Požadované závislosti ako Adafruit GFX Library a Adafruit NeoPixel sa nainštalujú automaticky.

Dôležitá konfigurácia používateľa

Pin dát matice (vstavaná RGB matica)

Hoci je RGB matica integrovaná na doske, pin dát musí byť stále definovaný v kóde:

#define MATRIX_PIN 14

GPIO 14 sa bežne používa na ESP32-S3 RGB maticových doskách. Ak váš variant dosky používa iný pin, aktualizujte túto hodnotu podľa potreby.

Wi-Fi SSID a heslo (rozlišujú sa veľké a malé písmená)

Nahraďte Wi-Fi prihlasovacie údaje údajmi vašej vlastnej siete:

const char* WIFI_SSID     = "your WiFi SSID";
const char* WIFI_PASSWORD = "passW0rd";

Dôležité: Wi-Fi SSID rozlišuje veľké a malé písmená. SSID s názvom "Book" nie je rovnaké ako "book". Ak sa veľkosť písmen presne nezhoduje, ESP32-S3 sa nepripojí.

NTP server, časové pásmo a letný čas

Synchronizácia času sa vykonáva pomocou internetového NTP servera:

const char* ntpServer = "pool.ntp.org";

Miestny čas sa vypočíta pomocou UTC a offsetov letného času:

// Toronto-ish: UTC-5, plus 1 hodina DST
const long  gmtOffset_sec     = -5 * 3600;
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec: UTC offset v sekundách (upravte podľa vašej polohy)
  • daylightOffset_sec: Použite 3600, keď je aktívny letný čas, alebo 0 v opačnom prípade

Tieto nastavenia sa aplikujú pomocou:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Automatický jas deň / noc

Hodiny automaticky upravujú jas na základe aktuálnej hodiny:

const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;

Medzi 22:00 a 6:00 sa displej stlmí, aby sa znížilo oslnenie v tmavom prostredí. Počas denných hodín sa matica vráti na normálny jas.

Správanie náhodných RGB farieb

Vopred definovaný zoznam RGB farieb je uložený v poli, kde každá farba je definovaná pomocou hodnôt červenej, zelenej a modrej v rozsahu od 0 do 255:

uint8_t userColors[][3] = {
  {255, 0, 0},    // Červená
  {0, 255, 0},    // Zelená
  {0, 0, 255},    // Modrá
  {255, 165, 0},  // Oranžová
  {255, 0, 255},  // Purpurová
  {0, 255, 255},  // Azúrová
  {255, 255, 0}   // Žltá
};

Pri každom úplnom cykle posúvania:

  • Číslice hodín dostanú náhodnú farbu
  • Dvojbodka dostane inú náhodnú farbu
  • Číslice minút dostanú ďalšiu náhodnú farbu

To vytvára neustále sa meniacu farebnú kombináciu, ktorá udržiava hodiny vizuálne zaujímavé. Ak chcete vytvoriť vlastné farby, môžete použiť nástroj RGB Color Picker: RGB Color Picker.

Logika vykresľovania času

Čas je rozdelený na tri komponenty:

  • Hodiny: HH
  • Dvojbodka: :
  • Minúty: MM

Každá časť je vykreslená samostatne, aby mohla mať vlastnú farbu, pričom všetky časti sa pohybujú spolu a vytvárajú plynulú animáciu posúvania cez 8×8 displej.

Generovanie náhodných farieb

Aby sa zabezpečila náhodnosť farieb, náčrt na začiatku inicializuje generátor náhodných čísel pomocou nepripojeného analógového pinu:

randomSeed(analogRead(0));

To zaručuje, že farebné kombinácie sú pri každom zapnutí a každom cykle posúvania iné.

Demonštrácia

Po nahraní náčrtu a napájaní dosky cez USB-C:

  • ESP32-S3 sa pripojí k vašej Wi-Fi sieti
  • Čas sa synchronizuje z internetu
  • Čas sa posúva vo formáte HH:MM
  • Hodiny, dvojbodka a minúty sa každý cyklus menia na náhodné farby
  • Displej sa v noci automaticky stlmí

Stiahnutia a odkazy

Kompletný zdrojový kód je uvedený nižšie v tomto článku. Užitočné nástroje a referencie sú prepojené nižšie v tomto článku.

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
873-ESP32-S3 RGB LED Matrix Internte Clock Project 4 - Random Color
Language: C++
/*
 * =====================================================================================
 * 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();
  }
}

Resources & references

Files📁

Fritzing File