Search Code

Projekt zegara internetowego z matrycą LED RGB ESP32-S3 - 3 kolory nocne z datą

Projekt zegara internetowego z matrycą LED RGB ESP32-S3 - 3 kolory nocne z datą

Zegar internetowy ESP32-S3 RGB NeoMatrix z automatyczną jasnością dzień/noc

Ten projekt to zegar internetowy ESP32-S3 RGB Matrix, który automatycznie dostosowuje jasność w ciągu dnia i nocy. ESP32-S3 łączy się z Wi-Fi, synchronizuje aktualny czas z serwera NTP i przewija czas w formacie HH:MM przez matrycę 8×8 RGB NeoMatrix. Zegar obsługuje również stałe lub cyklicznie zmieniające się kolory RGB dla tekstu wyświetlacza.

Co robi ten zegar

Po włączeniu zasilania ESP32-S3 łączy się z siecią Wi-Fi i pobiera aktualny czas lokalny z internetu. Czas płynnie przewija się przez matrycę LED. W godzinach nocnych wyświetlacz automatycznie przyciemnia się do niższej jasności, a w ciągu dnia wraca do jaśniejszego poziomu.

Animacja zegara internetowego ESP32-s3

Użyte biblioteki

Ten szkic używa następujących bibliotek:

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

Zainstaluj Adafruit NeoMatrix z Menedżera bibliotek Arduino. Wszystkie wymagane zależności, takie jak Adafruit GFX Library i Adafruit NeoPixel, zostaną zainstalowane automatycznie.

Ważna konfiguracja użytkownika

Nazwa SSID i hasło Wi-Fi (rozróżniane są wielkie i małe litery)

Zastąp następujące wartości własnymi danymi logowania do Wi-Fi:

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

Ważne: Nazwy SSID Wi-Fi są rozróżniane pod względem wielkości liter. Nazwa SSID "Book" nie jest taka sama jak "book". Jeśli wielkość liter nie będzie dokładnie zgodna, ESP32 nie połączy się.

Serwer NTP, strefa czasowa i czas letni

Zegar synchronizuje czas za pomocą następującego serwera NTP:

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

Czas lokalny jest obliczany przy użyciu tych przesunięć:

const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec określa przesunięcie względem UTC w sekundach
  • daylightOffset_sec dodaje jedną godzinę, gdy obowiązuje czas letni (użyj 0, jeśli nie jest potrzebny)

Te wartości są stosowane za pomocą:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Automatyczna jasność dzień / noc

Jasność wyświetlacza zmienia się automatycznie w zależności od bieżącej godziny:

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

Między 22:00 a 6:00 jasność matrycy jest zmniejszana, aby zapewnić komfort w ciemnym otoczeniu. Poza tymi godzinami przywracana jest pełna jasność dzienna. Możesz dostosować te wartości do oświetlenia w swoim pomieszczeniu.

Konfiguracja kolorów RGB

Kolor tekstu zegara jest definiowany za pomocą wartości RGB (czerwony, zielony, niebieski), gdzie każdy kanał ma zakres od 0 do 255. Wiele kolorów można przechowywać w tablicy i automatycznie cyklicznie zmieniać:

uint8_t userColors[][3] = {
  {17, 43, 171},  // Jasnoniebieski
  {255, 0, 0},    // Czerwony
  {0, 255, 0},    // Zielony
  {255, 165, 0},  // Pomarańczowy
  {255, 0, 255}   // Magenta
};

Jeśli useFixedColor jest ustawione na true, zegar zawsze używa jednego koloru. Jeśli ustawione na false, kolor automatycznie zmienia się po każdym pełnym przewinięciu czasu.

Aby szybko znaleźć dokładne wartości RGB dla dowolnego koloru, użyj narzędzia do wyboru kolorów RGB: Wybór koloru .

Wyświetlanie czasu i przewijanie

Aktualny czas jest formatowany jako HH:MM i przechowywany w małym buforze znaków. Ponieważ wyświetlacz ma tylko 8 pikseli szerokości, tekst płynnie przewija się od prawej do lewej. Gdy czas całkowicie opuści wyświetlacz, wybierany jest następny kolor (jeśli włączony) na kolejne przejście.

Demonstracja

Po wgraniu szkicu:

  • ESP32-S3 łączy się z Wi-Fi
  • Czas jest synchronizowany z internetu
  • Aktualny czas przewija się przez matrycę RGB
  • Jasność automatycznie zmienia się między dniem a nocą
  • Kolor tekstu pozostaje stały lub zmienia się cyklicznie zgodnie z ustawieniami

Pliki do pobrania i linki

Pełny kod źródłowy znajduje się poniżej tego artykułu. Linki do części, narzędzi i kart katalogowych są dostępne poniżej tego artykułu.

Obrazy

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
Język: 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();
  }
}

Rzeczy, których możesz potrzebować

Zasoby i odniesienia

Pliki📁

Plik Fritzing