Search Code

Proiect de ceas cu matrice LED RGB ESP32-S3 conectat la internet - 3 culori de noapte cu dată

Proiect de ceas cu matrice LED RGB ESP32-S3 conectat la internet - 3 culori de noapte cu dată

Ceas Internet RGB NeoMatrix ESP32-S3 cu Luminozitate Automată Zi/Noapte

Acest proiect este un Ceas Internet cu Matrice RGB ESP32-S3 care ajustează automat luminozitatea ziua și noaptea. ESP32-S3 se conectează la Wi-Fi, sincronizează ora curentă de la un server NTP și defilează ora în format HH:MM pe o matrice RGB NeoMatrix 8×8. Ceasul suportă, de asemenea, culori RGB fixe sau ciclice pentru textul afișat.

Ce face acest ceas

După pornire, ESP32-S3 se conectează la rețeaua ta Wi-Fi și preia ora locală curentă de pe internet. Ora defilează lin pe matricea LED. Pe timpul nopții, afișajul se diminuează automat la o luminozitate mai scăzută, în timp ce ziua revine la un nivel mai luminos.

ESP32-s3_internet_clock_animation

Biblioteci utilizate

Acest sketch folosește următoarele biblioteci:

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

Instalează Adafruit NeoMatrix din Managerul de Biblioteci Arduino. Toate dependențele necesare, cum ar fi Adafruit GFX Library și Adafruit NeoPixel, vor fi instalate automat.

Configurare importantă pentru utilizator

SSID-ul și parola Wi-Fi (sensibile la majuscule)

Înlocuiește următoarele valori cu propriile tale credențiale Wi-Fi:

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

Important: SSID-urile Wi-Fi sunt sensibile la majuscule. Un SSID numit "Book" nu este același cu "book". Dacă majusculele nu se potrivesc exact, ESP32 nu se va putea conecta.

Server NTP, fus orar și ora de vară

Ceasul sincronizează ora folosind următorul server NTP:

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

Ora locală este calculată folosind aceste decalaje:

const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec definește decalajul tău UTC în secunde
  • daylightOffset_sec adaugă o oră când ora de vară este activă (folosește 0 dacă nu este necesar)

Aceste valori sunt aplicate cu:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Luminozitate automată zi / noapte

Luminozitatea afișajului se schimbă automat în funcție de ora curentă:

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

Între 10 PM și 6 AM, luminozitatea matricei este redusă pentru a fi confortabilă în medii întunecate. În afara acestor ore, luminozitatea completă de zi este restabilită. Poți ajusta aceste valori pentru a se potrivi iluminării camerei tale.

Configurarea culorilor RGB

Culoarea textului ceasului este definită folosind valori RGB (Roșu, Verde, Albastru), unde fiecare canal variază de la 0 la 255. Mai multe culori pot fi stocate într-un array și ciclate automat:

uint8_t userColors[][3] = {
  {17, 43, 171},  // Albastru deschis
  {255, 0, 0},    // Roșu
  {0, 255, 0},    // Verde
  {255, 165, 0},  // Portocaliu
  {255, 0, 255}   // Magenta
};

Dacă useFixedColor este setat la true, ceasul folosește întotdeauna o singură culoare. Dacă este setat la false, culoarea se schimbă automat după fiecare defilare completă a orei.

Pentru a găsi rapid valorile RGB exacte pentru orice culoare, folosește instrumentul de selectare a culorilor RGB: Selector de Culori .

Afișarea orei și defilarea

Ora curentă este formatată ca HH:MM și stocată într-un mic buffer de caractere. Deoarece afișajul are doar 8 pixeli lățime, textul defilează lin de la dreapta la stânga. Odată ce ora părăsește complet afișajul, următoarea culoare (dacă este activată) este selectată pentru următoarea trecere.

Demonstrație

După încărcarea sketch-ului:

  • ESP32-S3 se conectează la Wi-Fi
  • Ora este sincronizată de pe internet
  • Ora curentă defilează pe matricea RGB
  • Luminozitatea se schimbă automat între zi și noapte
  • Culoarea textului rămâne fixă sau se ciclizează în funcție de setările tale

Descărcări și linkuri

Codul sursă complet este furnizat mai jos în acest articol. Linkuri către piese, unelte și fișe tehnice sunt disponibile mai jos în acest articol.

Imagini

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
Limba: 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();
  }
}

Lucruri de care ai putea avea nevoie

Resurse și referințe

Fișiere📁

Fișier Fritzing