Search Code

ESP32-S3 RGB LED matrica Internet sat projekat - 2 sata višebojni prikaz vremena i datuma

ESP32-S3 RGB LED matrica Internet sat projekat - 2 sata višebojni prikaz vremena i datuma

ESP32-S3 RGB NeoMatrix Internet Sat s prikazom vremena i datuma

Ovaj projekat je poboljšani ESP32-S3 RGB Matrix Internet sat koji ne samo da prikazuje trenutno vrijeme, već i povremeno prikazuje datum. ESP32-S3 se povezuje na Wi-Fi, sinhronizuje vrijeme sa NTP servera i pomiče ili HH:MM ili datum (na primjer SEP 21) preko 8×8 RGB NeoMatrix ekrana. Displej podržava automatsku kontrolu svjetline za dan/noć i prilagodljive RGB boje.

ESP32-s3_internet_clock_animation

Šta ovaj sat radi

Nakon povezivanja na vašu Wi-Fi mrežu, ESP32-S3 preuzima trenutno lokalno vrijeme sa interneta. Sat normalno pomiče vrijeme, ali u fiksnom intervalu prelazi na prikaz datuma. Boja teksta može biti fiksna na jednu boju ili se automatski mijenjati kroz više korisnički definiranih boja. Svjetlina se automatski smanjuje noću kako bi displej bio lakši za oči.

Korištene biblioteke

Ovaj sketch zavisi od sljedećih biblioteka:

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

Instalirajte Adafruit NeoMatrix iz Arduino Library Manager-a. Sve potrebne zavisnosti kao što su Adafruit GFX Library i Adafruit NeoPixel će se automatski instalirati.

Važna korisnička konfiguracija

Wi-Fi SSID i lozinka (osjetljivo na velika/mala slova)

Morate zamijeniti Wi-Fi kredencijale sa informacijama vaše mreže:

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

Važno: Wi-Fi SSID-ovi su osjetljivi na velika/mala slova. Na primjer, SSID nazvan "Book" nije isti kao "book". Ako se velika i mala slova ne poklapaju tačno, ESP32 neće uspjeti da se poveže.

NTP server, vremenska zona i ljetno računanje vremena

Sat koristi internet vremenski server:

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

Lokalno vrijeme se izračunava koristeći ove offsete:

const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec: Vaš UTC offset u sekundama (primjer: UTC-5 = -5 * 3600)
  • daylightOffset_sec: Koristite 3600 za ljetno računanje vremena ili 0 ako se ljetno računanje vremena ne koristi

Ove postavke se primjenjuju koristeći:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Kontrola svjetline (dan / noć)

Ovaj projekat automatski prilagođava svjetlinu na osnovu sata u danu:

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, svjetlina se smanjuje kako bi displej bio manje ometajući u tamnim okruženjima. Ove vrijednosti možete prilagoditi prema vašim željama.

RGB konfiguracija boja

Sat podržava i fiksni način boja i automatsko mijenjanje boja. Korisnički definirane RGB boje se pohranjuju u niz:

uint8_t userColors[][3] = {
  {17, 43, 171},  // Svijetlo plava
  {255, 0, 0},    // Crvena
  {0, 255, 0},    // Zelena
  {255, 165, 0},  // Narandžasta
  {255, 0, 255}   // Magenta
};

Svaka boja koristi RGB (crvena, zelena, plava) vrijednosti u rasponu od 0 do 255. Promjenom ovih brojeva možete kreirati gotovo bilo koju boju za displej. Ako je useFixedColor postavljen na true, sat uvijek koristi jednu boju. Ako je postavljen na false, boja se automatski mijenja nakon svakog punog pomicanja.

Da brzo pronađete tačne RGB vrijednosti za bilo koju boju koju želite, koristite RGB Color Picker alat Color Picker .

Formatiranje vremena i datuma

Vrijeme je formatirano kao HH:MM i pohranjeno u mali karakter bafer. Datum je formatiran kao string s velikim slovima kao što je SEP 21. Displej se automatski prebacuje između vremena i datuma u fiksnom intervalu.

Logika pomicanja na 8×8 displeju

Pošto je 8×8 matrica premala da prikaže cijeli tekst odjednom, sketch pomiče tekst horizontalno. Kada tekst potpuno napusti displej, boja se ažurira i sadržaj se prebacuje između vremena i datuma kada je potrebno.

Demonstracija

Nakon uploada sketch-a:

  • ESP32 se povezuje na Wi-Fi
  • Vrijeme se sinhronizuje sa interneta
  • Trenutno vrijeme se pomiče preko matrice
  • Datum se pojavljuje periodično
  • Svjetlina se automatski prilagođava za dan i noć

Preuzimanja i linkovi

Kompletan izvorni kod je dat ispod ovog članka. Linkovi za dijelove, alate i tehničke listove također su dostupni 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
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