Search Code

Proiect de ceas cu matrice LED RGB ESP32-S3 conectat la internet - Afișaj de oră și dată în 2 ceasuri multicolore

Proiect de ceas cu matrice LED RGB ESP32-S3 conectat la internet - Afișaj de oră și dată în 2 ceasuri multicolore

Ceas Internet NeoMatrix RGB ESP32-S3 cu afișare a orei și datei

Acest proiect este un ceas Internet îmbunătățit cu matrice RGB ESP32-S3, care nu doar afișează ora curentă, dar afișează și data periodic. ESP32-S3 se conectează la Wi-Fi, sincronizează ora de la un server NTP și derulează fie HH:MM, fie data (de exemplu SEP 21) pe o matrice NeoMatrix RGB 8×8. Afișajul suportă control automat al luminozității zi/noapte și culori RGB personalizabile.

ESP32-s3_internet_clock_animation

Ce face acest ceas

După conectarea la rețeaua ta Wi-Fi, ESP32-S3 preia ora locală curentă de pe internet. Ceasul derulează în mod normal ora, dar la un interval fix comută pentru a afișa data. Culoarea textului poate fi fixată la o singură culoare sau poate cicla automat prin mai multe culori definite de utilizator. Luminozitatea este redusă automat noaptea pentru a face afișajul mai ușor pentru ochi.

Biblioteci utilizate

Acest sketch depinde de 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 Arduino Library Manager. Toate dependențele necesare, cum ar fi Adafruit GFX Library și Adafruit NeoPixel, vor fi instalate automat.

Configurare importantă pentru utilizator

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

Trebuie să înlocuiești credențialele Wi-Fi cu informațiile propriei rețele:

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

Important: SSID-urile Wi-Fi sunt sensibile la majuscule. De exemplu, 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 folosește un server de timp de pe internet:

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: Decalajul tău UTC în secunde (exemplu: UTC-5 = -5 * 3600)
  • daylightOffset_sec: Folosește 3600 pentru ora de vară sau 0 dacă ora de vară nu este utilizată

Aceste setări sunt aplicate folosind:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Controlul luminozității (zi / noapte)

Acest proiect ajustează automat luminozitatea în funcție de ora zilei:

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

Între 22:00 și 6:00, luminozitatea este redusă pentru a face afișajul mai puțin deranjant în medii întunecate. Poți ajusta aceste valori după preferințele tale.

Configurarea culorilor RGB

Ceasul suportă atât modul cu culoare fixă, cât și ciclarea automată a culorilor. Culorile RGB definite de utilizator sunt stocate într-un array:

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

Fiecare culoare folosește valori RGB (Roșu, Verde, Albastru) cuprinse între 0 și 255. Schimbând aceste numere, poți crea practic orice culoare pentru afișaj. Dacă useFixedColor este setat la true, ceasul folosește întotdeauna o singură culoare. Dacă este setat la false, culoarea se schimbă automat după fiecare derulare completă.

Pentru a găsi rapid valori RGB precise pentru orice culoare dorită, folosește instrumentul RGB Color Picker Color Picker .

Formatarea orei și datei

Ora este formatată ca HH:MM și stocată într-un mic buffer de caractere. Data este formatată ca un șir de caractere cu majuscule, cum ar fi SEP 21. Afișajul comută automat între oră și dată la un interval fix.

Logica de derulare pe un afișaj 8×8

Deoarece o matrice 8×8 este prea mică pentru a afișa tot textul deodată, sketch-ul derulează textul orizontal. Odată ce textul părăsește complet afișajul, culoarea este actualizată și conținutul comută între oră și dată atunci când este necesar.

Demonstrație

După încărcarea sketch-ului:

  • ESP32 se conectează la Wi-Fi
  • Ora este sincronizată de pe internet
  • Ora curentă se derulează pe matrice
  • Data apare periodic
  • Luminozitatea se ajustează automat pentru zi și noapte

Descărcări și linkuri

Codul sursă complet este furnizat mai jos în acest articol. Linkuri către componente, unelte și fișe tehnice sunt, de asemenea, 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
869-ESP32-S3 RGB LED Matrix Internte Clock Project 2 - Multi Color with Date
Limba: 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();
  }
}

Lucruri de care ai putea avea nevoie

Resurse și referințe

Fișiere📁

Fișier Fritzing