Search Code

Projekt internetových hodín s RGB LED maticou ESP32-S3 - 3 nočné farby s dátumom

Projekt internetových hodín s RGB LED maticou ESP32-S3 - 3 nočné farby s dátumom

ESP32-S3 RGB NeoMatrix internetové hodiny s automatickým jasom deň/noc

Tento projekt je ESP32-S3 RGB Matrix internetový hodinový displej, ktorý automaticky upravuje jas počas dňa a noci. ESP32-S3 sa pripojí k Wi-Fi, synchronizuje aktuálny čas z NTP servera a zobrazuje čas vo formáte HH:MM posúvaním cez 8×8 RGB NeoMatrix. Hodiny tiež podporujú pevné alebo cyklické RGB farby pre text displeja.

Čo tieto hodiny robia

Po zapnutí sa ESP32-S3 pripojí k vašej Wi-Fi sieti a získa aktuálny miestny čas z internetu. Čas sa plynulo posúva cez LED maticu. Počas nočných hodín sa displej automaticky stlmí na nižší jas, zatiaľ čo cez deň sa prepne späť na jasnejšiu úroveň.

ESP32-s3_internet_clock_animation

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 z Arduino Library Manager. Všetky potrebné závislosti, ako napríklad Adafruit GFX Library a Adafruit NeoPixel, sa nainštalujú automaticky.

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

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

Nahraďte nasledujúce hodnoty vlastnými Wi-Fi prihlasovacími údajmi:

const char* WIFI_SSID     = "WiFi";
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 to isté ako "book". Ak sa veľkosť písmen presne nezhoduje, ESP32 sa nepripojí.

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

Hodiny synchronizujú čas pomocou nasledujúceho NTP servera:

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

Miestny čas sa vypočíta pomocou týchto offsetov:

const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec definuje váš UTC offset v sekundách
  • daylightOffset_sec pridá jednu hodinu, keď je aktívny letný čas (použite 0, ak nie je potrebný)

Tieto hodnoty sa aplikujú pomocou:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Automatický jas deň / noc

Jas displeja sa automaticky mení na základe aktuálnej hodiny:

const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22; // 10 PM
const int NIGHT_END_HOUR = 6;    // 6 AM

Medzi 22:00 a 6:00 sa jas matice zníži, aby bol pohodlný v tmavom prostredí. Mimo týchto hodín sa obnoví plný denný jas. Tieto hodnoty môžete upraviť podľa osvetlenia vašej miestnosti.

Konfigurácia RGB farieb

Farba textu hodín je definovaná pomocou RGB (červená, zelená, modrá) hodnôt, kde každý kanál sa pohybuje od 0 do 255. Viacero farieb môže byť uložených v poli a automaticky cyklovaných:

uint8_t userColors[][3] = {
  {17, 43, 171},  // Svetlo modrá
  {255, 0, 0},    // Červená
  {0, 255, 0},    // Zelená
  {255, 165, 0},  // Oranžová
  {255, 0, 255}   // Purpurová
};

Ak je useFixedColor nastavené na true, hodiny vždy používajú jednu farbu. Ak je nastavené na false, farba sa automaticky zmení po každom úplnom posunutí času.

Na rýchle nájdenie presných RGB hodnôt pre akúkoľvek farbu použite nástroj RGB Color Picker: Color Picker .

Zobrazenie času a posúvanie

Aktuálny čas je formátovaný ako HH:MM a uložený v malom znakovom bufferi. Pretože displej je široký iba 8 pixelov, text sa plynulo posúva sprava doľava. Keď čas úplne opustí displej, vyberie sa ďalšia farba (ak je povolená) pre ďalší prechod.

Demonštrácia

Po nahraní náčrtu:

  • ESP32-S3 sa pripojí k Wi-Fi
  • Čas sa synchronizuje z internetu
  • Aktuálny čas sa posúva cez RGB maticu
  • Jas sa automaticky mení medzi dňom a nocou
  • Farba textu zostáva pevná alebo cykluje podľa vašich nastavení

Stiahnutia a odkazy

Kompletný zdrojový kód je uvedený nižšie v tomto článku. Odkazy na diely, nástroje a datasheety sú dostupné 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
870-ESP32-S3 RGB LED Matrix Internte Clock Project 3 - Night Color with Date
Language: C++
/*
 * =====================================================================================
 * ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 3- Night color with Date
 * =====================================================================================
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT840
 * 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).
 * =====================================================================================
 */

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

#define MATRIX_PIN 14

// --- BRIGHTNESS CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22; // 10 PM
const int NIGHT_END_HOUR = 6;    // 6 AM

// --- COLOR CONFIGURATION ---
bool useFixedColor = false; 
int fixedColorIndex = 0;    
uint8_t userColors[][3] = {
  {17, 43, 171},  // Light Blue
  {255, 0, 0},    // Red
  {0, 255, 0},    // Green
  {255, 165, 0},  // Orange
  {255, 0, 255}   // Magenta
};

// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID     = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";

int currentColorIndex = 0;
int totalColors = sizeof(userColors) / sizeof(userColors[0]);

// --- INTERVALS ---
unsigned long lastTimeUpdateMs = 0;
const uint16_t timeUpdateIntervalMs = 1000;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;

// --- GLOBAL VARIABLES ---
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";
int16_t scrollX = 8;


const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;

void updateTimeText() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;
  
  // Format HH:MM
  snprintf(timeText, sizeof(timeText), "%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min);

  // Apply Auto-Brightness
  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);
  
  // Pick the color (Fixed or Cycle)
  int idx = useFixedColor ? fixedColorIndex : currentColorIndex;
  matrix.setTextColor(matrix.Color(userColors[idx][0], userColors[idx][1], userColors[idx][2]));

  matrix.setCursor(scrollX, 0);
  matrix.print(timeText);
  matrix.show();

  scrollX--;

  // Width for "HH:MM" is roughly 30 pixels
  int16_t textWidth = 30;
  
  // TRIGGER: When time is fully off-screen
  if (scrollX < -textWidth) {
    scrollX = matrix.width(); // Reset position to right side
    
    // Cycle to the next color in the array for the next pass
    if (!useFixedColor) {
      currentColorIndex = (currentColorIndex + 1) % totalColors;
      Serial.print("Next cycle color index: ");
      Serial.println(currentColorIndex);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(DAY_BRIGHTNESS);
  
  updateTimeText();
}

void loop() {
  unsigned long now = millis();

  // Update time digits and brightness once per second
  if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
    lastTimeUpdateMs = now;
    updateTimeText(); 
  }

  // Handle the scrolling animation
  if (now - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = now;
    scrollTime();
  }
}

Things you might need

Resources & references

Files📁

Fritzing File