Search Code

Proiect de ceas internet cu matrice LED RGB ESP32-S3 - 5 culori curcubeu

Proiect de ceas internet cu matrice LED RGB ESP32-S3 - 5 culori curcubeu

Ceas Internet ESP32-S3 cu efect de culoare curcubeu

Acest proiect este un ceas Internet cu matrice RGB ESP32-S3 care se conectează la Wi-Fi, sincronizează ora locală de la un server NTP și defilează ora în format HH:MM pe matricea RGB NeoMatrix 8×8 încorporată. Spre deosebire de versiunile cu culori solide sau aleatorii, acest ceas folosește un efect de culoare curcubeu lin, în care fiecare caracter se schimbă continuu prin spectrul RGB pe măsură ce defilează. Ceasul afișează, de asemenea, periodic data și ajustează automat luminozitatea între zi și noapte.

ESP32-s3_internet_clock_animation

Cum funcționează acest ceas

Odată alimentat prin USB-C, ESP32-S3 se conectează la rețeaua ta Wi-Fi și preia ora locală curentă de pe internet. Afișajul afișează în mod normal ora prin defilare, dar la un interval definit trece la afișarea datei. Atât ora, cât și data sunt redate folosind un efect dinamic de curcubeu, creând un afișaj vibrant și animat pe mica matrice 8×8.

Biblioteci folosite

Schița se bazează pe următoarele biblioteci:

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

Instalează Adafruit NeoMatrix folosind Managerul de Biblioteci Arduino. Dependențele sale, inclusiv Adafruit GFX Library și Adafruit NeoPixel, vor fi instalate automat.

Configurare importantă pentru utilizator

Pinul de date al matricei (matrice RGB încorporată)

Deși matricea RGB este atașată la placa ESP32-S3, pinul de date trebuie totuși definit în cod:

#define MATRIX_PIN 14

GPIO 14 este folosit în mod obișnuit pe plăcile cu matrice RGB ESP32-S3. Dacă varianta plăcii tale folosește un pin diferit, actualizează această valoare.

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

Înlocuiește credențialele Wi-Fi cu detaliile propriei rețele:

const char* WIFI_SSID     = "your 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-S3 nu se va putea conecta.

Server NTP, fus orar și ora de vară

Ceasul sincronizează ora folosind un server NTP de pe internet:

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

Ora locală este calculată folosind aceste decalaje:

// Toronto-ish: UTC-5, plus 1 oră DST
const long  gmtOffset_sec     = -5 * 3600;
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec: decalajul UTC în secunde (exemplu: UTC-5 = -5 * 3600)
  • daylightOffset_sec: folosește 3600 dacă ora de vară este activă, sau 0 dacă nu este folosită

Aceste valori sunt aplicate folosind:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Luminozitate automată zi / noapte

Luminozitatea 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;
const int NIGHT_END_HOUR = 6;

Între 22:00 și 6:00, matricea se diminuează pentru a reduce strălucirea. În timpul orelor de zi, luminozitatea normală este restabilită.

Efect de culoare curcubeu

Acest proiect folosește o roată clasică de culori RGB pentru a genera culori curcubeu line. Fiecare caracter este desenat cu un decalaj de culoare ușor diferit, iar culorile se schimbă în timp, producând o animație fluidă de curcubeu.

// Helper pentru a crea culori curcubeu
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) {
    return matrix.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if (WheelPos < 170) {
    WheelPos -= 85;
    return matrix.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return matrix.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Pe măsură ce textul defilează, fiecare caracter avansează prin spectrul RGB, creând un efect continuu de curcubeu care arată deosebit de impresionant pe micul afișaj 8×8.

Comportamentul afișării orei și datei

Ceasul menține buffere separate pentru oră și dată:

  • Ora: HH:MM
  • Data: MMM DD (de exemplu JAN 08)

Data este afișată la un interval fix:

const uint32_t dateIntervalMs = 60000; // Afișează data la fiecare 1 minut

La sfârșitul fiecărui ciclu complet de defilare, codul decide dacă să continue afișarea orei sau să treacă la dată.

Logica de defilare pe o matrice 8×8

Deoarece afișajul are doar 8 pixeli lățime, textul defilează lin de la dreapta la stânga. Odată ce textul iese complet de pe ecran, cursorul se resetează și următorul conținut (ora sau data) este încărcat pentru următoarea trecere.

Demonstrație

După încărcarea schiței și alimentarea plăcii prin USB-C:

  • ESP32-S3 se conectează la rețeaua ta Wi-Fi
  • Ora este sincronizată de pe internet
  • Ora defilează în format HH:MM
  • Data apare periodic
  • Tot textul este redat cu un efect animat lin de curcubeu
  • Afișajul se diminuează automat noaptea și se luminează ziua

Descărcări și linkuri

Codul sursă complet este furnizat mai jos în acest articol. Instrumente utile și referințe, inclusiv selectorul de culori RGB, sunt, de asemenea, legate 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
872-ESP32-S3 RGB LED Matrix Internte Clock Project 5 - Rainbow Color
Limba: C++
/*
 * =====================================================================================
 * ESP32-S3 CLOCK - RAINBOW DATE & SOLID TIME - Project 5- RAINBOW MODE
 * =====================================================================================
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT842
 * Author: Gemini (AI Thought Partner) & Ahmad Shamshiri (Robojax.com)
 * Date: 07 Jan 2026

 * =====================================================================================
 * ESP32-S3 INTERNET RGB CLOCK - RAINBOW MODE

 * * FEATURES: 
 * - Full Rainbow: Time and Date use flowing rainbow colors.
 * - Auto-Brightness: Dims at night (22:00 to 06:00).
 * - Custom WiFi: Robust connection logic with retries.
 * =====================================================================================
 */

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

#define MATRIX_PIN 14

// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID     = "your WIFI";
const char* WIFI_PASSWORD = "passW0rd";

// NTP (time) server
const char* ntpServer = "pool.ntp.org";

// Toronto-ish: UTC-5, plus 1 hour DST. 
const long  gmtOffset_sec     = -5 * 3600;  // -5 hours
const int   daylightOffset_sec = 3600;      // +1 hour for DST

// --- BRIGHTNESS CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;

// --- INTERVALS & TRACKING ---
unsigned long lastDateShowMs = 0;
const uint32_t dateIntervalMs = 60000; // Show date every 1 minute
bool isShowingDate = false;

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;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;
unsigned long lastTimeUpdateMs = 0;

// Helper to create Rainbow Colors
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return matrix.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return matrix.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return matrix.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

void updateClockData() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;
  
  // Update Time and Date strings
  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]);

  // Handle Night Dimming
  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);
  
  int len = strlen(currentDisplayText);
  int16_t x = scrollX;

  // Draw each character with a shifting rainbow color
  for (int i = 0; i < len; i++) {
    uint8_t colorPos = (uint8_t)((i * 30) + (millis() / 5)); 
    matrix.setTextColor(Wheel(colorPos));
    matrix.setCursor(x + (i * 6), 0);
    matrix.print(currentDisplayText[i]);
  }

  matrix.show();
  scrollX--;

  int16_t textWidth = len * 6;
  if (scrollX < -textWidth) {
    scrollX = matrix.width();
    
    // Switch between Date and Time at end of cycle
    if (millis() - lastDateShowMs > dateIntervalMs) {
      strcpy(currentDisplayText, dateText);
      lastDateShowMs = millis();
      isShowingDate = true;
    } else {
      strcpy(currentDisplayText, timeText);
      isShowingDate = false;
    }
  }
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("\nESP32-S3 Rainbow Clock Initializing...");

  // Connect to WiFi
  Serial.print("Connecting to WiFi: ");
  Serial.println(WIFI_SSID);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  int retries = 0;
  while (WiFi.status() != WL_CONNECTED && retries < 30) { // ~15s timeout
    delay(500);
    Serial.print(".");
    retries++;
  }
  Serial.println();

  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi connection FAILED");
  } else {
    Serial.print("WiFi connected. IP: ");
    Serial.println(WiFi.localIP());
  }

  // Configure time via NTP
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  Serial.println("Waiting for time...");
  delay(2000); // small wait for initial sync

  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(DAY_BRIGHTNESS);
  
  updateClockData();
  strcpy(currentDisplayText, timeText); // Load initial time
}

void loop() {
  unsigned long now = millis();

  // Update time digits and check brightness every second
  if (now - lastTimeUpdateMs >= 1000) {
    lastTimeUpdateMs = now;
    updateClockData(); 
  }

  // Handle the scrolling animation
  if (now - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = now;
    scrollDisplay();
  }
}

Resurse și referințe

Fișiere📁

Fișier Fritzing