Search Code

ESP32-S3 RGB LED matrica internet sat projekat - 3 noćne boje sa datumom

ESP32-S3 RGB LED matrica internet sat projekat - 3 noćne boje sa datumom

ESP32-S3 RGB NeoMatrix Internet Sat s automatskim podešavanjem svjetline za dan/noć

Ovaj projekat je ESP32-S3 RGB Matrix Internet sat koji automatski podešava svjetlinu tokom dana i noći. ESP32-S3 se povezuje na Wi-Fi, sinhronizuje trenutno vrijeme sa NTP servera i pomiče vrijeme u HH:MM formatu preko 8×8 RGB NeoMatrix ekrana. Sat također podržava fiksne ili ciklične RGB boje za tekst na ekranu.

Šta ovaj sat radi

Nakon uključivanja, ESP32-S3 se povezuje na vašu Wi-Fi mrežu i preuzima trenutno lokalno vrijeme s interneta. Vrijeme se glatko pomiče preko LED matrice. Tokom noćnih sati, ekran se automatski prigušuje na nižu svjetlinu, dok se tokom dana vraća na svjetliji nivo.

ESP32-s3_internet_clock_animation

Korištene biblioteke

Ovaj sketch koristi sljedeće biblioteke:

#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 poput 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)

Zamijenite sljedeće vrijednosti svojim Wi-Fi kredencijalima:

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

Važno: Wi-Fi SSID-ovi su osjetljivi na velika/mala slova. 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 sinhronizuje vrijeme koristeći sljedeći NTP 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 definira vaš UTC offset u sekundama
  • daylightOffset_sec dodaje jedan sat kada je ljetno računanje vremena aktivno (koristite 0 ako nije potrebno)

Ove vrijednosti se primjenjuju sa:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Automatska svjetlina za dan/noć

Svjetlina ekrana se automatski mijenja na osnovu trenutnog sata:

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

Između 22:00 i 6:00, svjetlina matrice se smanjuje kako bi bila ugodna u tamnim okruženjima. Izvan tih sati, vraća se puna dnevna svjetlina. Ove vrijednosti možete prilagoditi osvjetljenju svoje prostorije.

RGB konfiguracija boja

Boja teksta sata definirana je pomoću RGB (crvena, zelena, plava) vrijednosti, gdje svaki kanal ide od 0 do 255. Više boja može se pohraniti u niz i automatski ciklirati:

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

Ako je useFixedColor postavljen na true, sat uvijek koristi jednu boju. Ako je postavljen na false, boja se automatski mijenja nakon svakog punog prolaska vremena.

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

Prikaz vremena i pomicanje

Trenutno vrijeme je formatirano kao HH:MM i pohranjeno u mali bafer znakova. Pošto je ekran širok samo 8 piksela, tekst se glatko pomiče s desna na lijevo. Kada vrijeme u potpunosti napusti ekran, sljedeća boja (ako je omogućena) se bira za sljedeći prolaz.

Demonstracija

Nakon uploada sketch-a:

  • ESP32-S3 se povezuje na Wi-Fi
  • Vrijeme se sinhronizuje s interneta
  • Trenutno vrijeme se pomiče preko RGB matrice
  • Svjetlina se automatski mijenja između dana i noći
  • Boja teksta ostaje fiksna ili se ciklira na osnovu vaših postavki

Preuzimanja i linkovi

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