Search Code

Proiect de ceas Wi-Fi + NTP cu matrice LED RGB ESP32-S3 -1 Ceas de bază

Proiect de ceas Wi-Fi + NTP cu matrice LED RGB ESP32-S3 -1 Ceas de bază

Ceas Internet cu ESP32-S3 și NeoMatrix 8×8 (Wi-Fi + Timp NTP)

Acest proiect transformă un ESP32-S3 și un NeoMatrix RGB 8×8 (NeoPixel/WS2812) într-un mic ceas internet. ESP32 se conectează la Wi-Fi, sincronizează ora locală de la un server NTP, apoi defilează ora ca HH:MM pe afișajul 8×8.

ESP32-s3_internet_clock_animation

 

Cum funcționează (la nivel general)

1) ESP32-S3 se conectează la routerul tău folosind <WiFi.h>.
2) Sincronizează ora de la un server NTP folosind "time.h" și configTime().
3) Ora este formatată ca HH:MM și salvată într-un mic buffer de text.
4) NeoMatrix afișează textul și îl defilează pe panoul 8×8.

Culoare RGB

Culoarea textului ceasului este controlată folosind valori RGB (Roșu, Verde, Albastru), unde fiecare canal de culoare variază de la 0 la 255, iar diferite combinații creează diferite culori pe NeoMatrix. Prin ajustarea variabilelor color_RED, color_GREEN și color_BLUE, poți personaliza cu ușurință aspectul ceasului în orice culoare dorești. Pentru a găsi rapid valorile RGB exacte pentru o anumită culoare, poți folosi selectorul online de culori RGB Color Picker .

Biblioteci folosite

Aceste includeri îți spun exact de ce depinde schița:

#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. Acesta va aduce și dependențele necesare, cum ar fi Adafruit GFX Library și Adafruit NeoPixel.

Setări importante ale utilizatorului pe care TREBUIE să le editezi

1) Culoarea textului (RGB)

Setază culoarea textului ceasului folosind valori 0–255:

//setează culoarea afișajului compusă din Roșu, Verde și Albastru 
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;

Aceste valori sunt folosite aici:

matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE));

Notă: Dacă setezi toate culorile la 0 (negru), textul devine invizibil. Schița include o verificare de siguranță:

// dacă utilizatorul a setat toate culorile la 0, afișajul va fi oprit, deci setează-l pe verde
if (color_RED == 0 && color_GREEN == 0 && color_BLUE == 0) {
  color_GREEN = 200;
}

Acest lucru asigură că matricea nu arată niciodată „moartă” din cauza unei setări de culoare invizibile.

2) SSID-ul și parola Wi-Fi

Înlocuiește acestea cu numele și parola reale ale rețelei Wi-Fi:

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

În timpul pornirii, ESP32 afișează progresul conexiunii în Monitorul Serial și expiră după aproximativ 15 secunde (30 de încercări × 500ms).

3) Server NTP

Serverul NTP implicit este:

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

Îl poți păstra așa cum este. Dacă vrei vreodată să folosești un server local, înlocuiește numele de gazdă cu serverul NTP preferat.

4) Decalajul fusului orar și decalajul orei de vară

Aceste două setări controlează ora locală:

// Aproximativ Toronto: UTC-5, plus 1 oră pentru ora de vară
const long  gmtOffset_sec      = -5 * 3600;  // -5 ore
const int   daylightOffset_sec = 3600;       // +1 oră pentru ora de vară

Cum să le setezi:

  • gmtOffset_sec = (decalajul UTC în ore) × 3600. Exemplu: UTC-5 → -5*3600, UTC+2 → 2*3600.
  • daylightOffset_sec = 0 dacă nu dorești ajustarea orei de vară, sau 3600 dacă regiunea ta respectă în prezent ora de vară (+1 oră).

Acestea sunt aplicate aici:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Configurarea afișajului

Pinul de date al matricei

Pinul de date este definit aici:

#define MATRIX_PIN 14

Dacă cablajul tău folosește un alt GPIO, schimbă acest număr pentru a se potrivi.

Dispunerea NeoMatrix + ordinea culorilor

Matricea ta este inițializată astfel:

Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
  NEO_MATRIX_TOP    + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS   + NEO_MATRIX_PROGRESSIVE,
  NEO_RGB           + NEO_KHZ800);

Două motive comune pentru care afișajul arată „greșit”:

  • Rotație / direcția cablajului: Dacă textul apare inversat sau în oglindă, ajustează flagurile NEO_MATRIX_* (TOP/BOTTOM, LEFT/RIGHT, ROWS/COLUMNS, PROGRESSIVE/ZIGZAG).
  • Ordinea culorilor: Acest cod folosește NEO_RGB. Unele panouri sunt NEO_GRB. Dacă roșu/verde/albastru nu se potrivesc, schimbă NEO_RGB în ordinea corectă.

Luminozitate

Luminozitatea este setată în initMatrix():

matrix.setBrightness(40);

Crește pentru un afișaj mai luminos, reduce pentru mai puțină căldură și consum de energie.

Cum este generată ora ca HH:MM

Ceasul stochează ora formatată într-un buffer de 6 caractere:

char timeText[6] = "00:00";

Apoi updateTimeText() citește ora locală sincronizată NTP și scrie textul:

// Format HH:MM
snprintf(timeText, sizeof(timeText), "%02d:%02d",
         timeinfo.tm_hour,
         timeinfo.tm_min);

Aceasta este actualizată o dată pe secundă în bucla principală.

Cum funcționează derularea pe un afișaj 8×8

O matrice 8×8 este prea îngustă pentru a afișa HH:MM dintr-o dată, astfel încât schița derulează textul. Desenează ora la o poziție X variabilă (scrollX), apoi o mută la stânga cu un pixel la fiecare actualizare.

int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;

Fiecare pas de derulare:

matrix.fillScreen(0);
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;

Când textul iese complet pe partea stângă, codul îl resetează pentru a începe din nou de la marginea dreaptă:

int16_t textWidth = 30;
if (scrollX < -textWidth) {
  scrollX = matrix.width();
}

Ieșirea Serial Monitor (debugging)

Această schiță afișează mesaje utile:

  • Progresul conexiunii Wi-Fi și adresa IP
  • Dacă sincronizarea timpului a reușit
  • Șirul de timp formatat (de exemplu, Text timp: 14:32)

Dacă afișajul este gol, Serial Monitor este primul loc de verificat pentru a confirma că Wi-Fi și NTP funcționează.

Demonstrația proiectului

După încărcare și resetare:

  • ESP32 se conectează la Wi-Fi
  • Sincronizează timpul de la pool.ntp.org
  • Afișează OK scurt pe matrice
  • Derulează continuu ora curentă ca HH:MM

Descărcări și linkuri

Codul complet este furnizat mai jos în acest articol. Piese, unelte și fișe tehnice 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
868-ESP32-S3 RGB LED Matrix Internte Clock Project 1 - Basic Clock
Limba: C++
/*
This is ESP32 sketch that connects to the internet, gets the time and displays it on the RGB matrix
you must set your WiFi correctly to make sure it gets connected. 
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT838
 * Author:  Ahmad Shamshiri (Robojax.com)
 * Date: 07 Jan 2026
www.Robojax.com
https://youTube.com/@robojax


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

//set the color of diplay make of Red, Green and Blue 
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;

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



#define MATRIX_PIN 14

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

unsigned long lastTimeUpdateMs = 0;
const uint16_t timeUpdateIntervalMs = 1000;

//prototypes
bool updateTimeText();  // forward declaration
void scrollTime();      // forward declaration



// 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



bool updateTimeText() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time for display");
    return false;
  }

  // Format HH:MM
  snprintf(timeText, sizeof(timeText), "%02d:%02d",
           timeinfo.tm_hour,
           timeinfo.tm_min);

  Serial.print("Time text: ");
  Serial.println(timeText);
  return true;
}

void scrollTime() {
  matrix.fillScreen(0);
  matrix.setCursor(scrollX, 0);
  matrix.print(timeText);
  matrix.show();

  scrollX--;

  // Rough width: 5 characters ("HH:MM") × 6 pixels each ≈ 30 px
  int16_t textWidth = 30;
  if (scrollX < -textWidth) {
    scrollX = matrix.width();  // reset to right edge (8)
  }
}


void initMatrix() {
  matrix.begin();
  matrix.setBrightness(40);        // be careful with heat
  matrix.setTextWrap(false);
  matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE)); // color of text
}

void showMessage(const char* msg) {
  matrix.fillScreen(0);
  matrix.setCursor(0, 0);  // top-left
  matrix.print(msg);
  matrix.show();
}


void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time");
    return;
  }
  // Format: 2025-11-18 14:35:12
  Serial.printf("%04d-%02d-%02d %02d:%02d:%02d\n",
                timeinfo.tm_year + 1900,
                timeinfo.tm_mon + 1,
                timeinfo.tm_mday,
                timeinfo.tm_hour,
                timeinfo.tm_min,
                timeinfo.tm_sec);
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println();
  Serial.println("ESP32-S3 Internet Clock - WiFi + NTP test");

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

// if user set all colors to 0, the dispaly will be turned off so set it green
  if(color_RED ==0 & color_GREEN ==0 && color_BLUE ==0)
  {
    color_GREEN = 200;
  }

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

  printLocalTime(); // print once at startup

    // NEW: init the LED matrix and show a test message
  initMatrix();
  showMessage("OK");
}

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

  // Update the time string "HH:MM" once per second
  if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
    lastTimeUpdateMs = now;
    updateTimeText();  // fills timeText[], e.g. "14:32"
  }

  // Scroll the time across the 8×8 every scrollIntervalMs
  if (now - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = now;
    scrollTime();      // uses timeText and scrollX
  }
}

Lucruri de care ai putea avea nevoie

Resurse și referințe

Fișiere📁

Fișier Fritzing