Search Code

Projekt internetových hodín s RGB LED maticou ESP32-S3 - 2 hodiny s viacfarebným zobrazením času a dátumu

Projekt internetových hodín s RGB LED maticou ESP32-S3 - 2 hodiny s viacfarebným zobrazením času a dátumu

ESP32-S3 RGB NeoMatrix internetové hodiny s zobrazením času a dátumu

Tento projekt je vylepšené ESP32-S3 RGB Matrix internetové hodiny, ktoré nielen zobrazujú aktuálny čas, ale tiež pravidelne zobrazujú dátum. ESP32-S3 sa pripojí k Wi-Fi, synchronizuje čas z NTP servera a posúva buď HH:MM alebo dátum (napríklad SEP 21) cez 8×8 RGB NeoMatrix. Displej podporuje automatické nastavenie jasu pre deň/noc a prispôsobiteľné RGB farby.

ESP32-s3_internet_clock_animation

Čo tieto hodiny robia

Po pripojení k vašej Wi-Fi sieti ESP32-S3 načíta aktuálny miestny čas z internetu. Hodiny normálne posúvajú čas, ale v pevnom intervale prepnú na zobrazenie dátumu. Farba textu môže byť pevná alebo sa automaticky meniť medzi viacerými používateľom definovanými farbami. Jas sa v noci automaticky znižuje, aby bol displej šetrnejší k očiam.

Použité knižnice

Tento náčrt závisí od nasledujúcich knižníc:

#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 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ú malé a veľké písmená)

Musíte nahradiť Wi-Fi prihlasovacie údaje vlastnými informáciami o sieti:

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

Dôležité: Wi-Fi SSID rozlišuje malé a veľké písmená. Napríklad 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 používajú internetový časový server:

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: Váš UTC offset v sekundách (príklad: UTC-5 = -5 * 3600)
  • daylightOffset_sec: Použite 3600 pre letný čas alebo 0, ak sa letný čas nepoužíva

Tieto nastavenia sa aplikujú pomocou:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Ovládanie jasu (deň / noc)

Tento projekt automaticky upravuje jas podľa hodiny dňa:

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 jas znižuje, aby bol displej menej rušivý v tmavom prostredí. Tieto hodnoty môžete upraviť podľa svojich preferencií.

Konfigurácia RGB farieb

Hodiny podporujú režim pevnej farby aj automatické striedanie farieb. Používateľom definované RGB farby sú uložené v poli:

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á
};

Každá farba používa RGB (červená, zelená, modrá) hodnoty od 0 do 255. Zmenou týchto čísel môžete vytvoriť prakticky akúkoľvek farbu pre displej. 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í.

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

Formátovanie času a dátumu

Čas je formátovaný ako HH:MM a uložený v malom znakovom bufferi. Dátum je formátovaný ako reťazec s veľkými písmenami, napríklad SEP 21. Displej automaticky prepína medzi časom a dátumom v pevnom intervale.

Logika posúvania na 8×8 displeji

Pretože 8×8 matica je príliš malá na zobrazenie celého textu naraz, náčrt posúva text horizontálne. Keď text úplne opustí displej, farba sa aktualizuje a obsah prepína medzi časom a dátumom podľa potreby.

Demonštrácia

Po nahraní náčrtu:

  • ESP32 sa pripojí k Wi-Fi
  • Čas sa synchronizuje z internetu
  • Aktuálny čas sa posúva cez maticu
  • Dátum sa zobrazuje pravidelne
  • Jas sa automaticky prispôsobuje dňu a noci

Stiahnutia a odkazy

Kompletný zdrojový kód je uvedený nižšie v tomto článku. Odkazy na diely, nástroje a datasheety sú tiež 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
869-ESP32-S3 RGB LED Matrix Internte Clock Project 2 - Multi Color with Date
Language: C++
/*
 * =====================================================================================
 * ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 2
 Multi color
 * =====================================================================================
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT839
 * Author:  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 when text finishes a full scroll.
 * 3. Auto-Brightness: Dims the LEDs during night hours (User-configurable).
 * 4. Periodic Date: Scrolls the date (e.g., "JAN 07") every 2 minutes.
 * * USER CONFIGURATION GUIDE:
 * -------------------------
 * - WiFi: Change 'WIFI_SSID' and 'WIFI_PASSWORD' to your local network.
 * - Colors: Add or remove {R, G, B} sets in the 'userColors' array.
 * - Night Mode: Adjust 'NIGHT_START_HOUR' and 'NIGHT_BRIGHTNESS'.
 * =====================================================================================
 */

#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; 
const int NIGHT_END_HOUR = 6;

// --- 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]);

// --- DATE/TIME INTERVALS ---
unsigned long lastDateShowMs = 0;
const uint32_t dateIntervalMs = 30000; // 2 minutes
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";
char dateText[10] = "";
char currentDisplayText[12] = ""; 
int16_t scrollX = 8;


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

void updateTimeAndDate() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;
  
  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]);

  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);
  
  // FIXED LOGIC: Uses currentColorIndex which only changes at the end of a scroll
  int idx = useFixedColor ? fixedColorIndex : currentColorIndex;
  matrix.setTextColor(matrix.Color(userColors[idx][0], userColors[idx][1], userColors[idx][2]));

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

  scrollX--;

  int16_t textWidth = strlen(currentDisplayText) * 6;
  
  // THE TRIGGER POINT: This happens only when text is fully off-screen
  if (scrollX < -textWidth) {
    scrollX = matrix.width(); 
    
    // 1. Cycle the color now and only now
    if (!useFixedColor) {
      currentColorIndex = (currentColorIndex + 1) % totalColors;
    }

    // 2. Decide whether to switch between Time and Date
    if (millis() - lastDateShowMs > dateIntervalMs) {
      strcpy(currentDisplayText, dateText);
      lastDateShowMs = millis();
    } else {
      strcpy(currentDisplayText, timeText);
    }
  }
}

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);
  
  updateTimeAndDate();
  strcpy(currentDisplayText, timeText); 
}

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

  if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
    lastTimeUpdateMs = now;
    updateTimeAndDate(); 
  }

  if (now - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = now;
    scrollDisplay();
  }
}

Things you might need

Resources & references

Files📁

Fritzing File