Search Code

ESP32-S3 RGB LED matrica Wi-Fi + NTP sat vremena projekat -1 Osnovni sat

ESP32-S3 RGB LED matrica Wi-Fi + NTP sat vremena projekat -1 Osnovni sat

ESP32-S3 Internet sat s 8×8 NeoMatrix (Wi-Fi + NTP vrijeme)

Ovaj projekat pretvara ESP32-S3 i 8×8 RGB NeoMatrix (NeoPixel/WS2812) u mali internet sat. ESP32 se povezuje na Wi-Fi, sinhronizuje lokalno vrijeme sa NTP servera, zatim pomiče vrijeme kao HH:MM preko 8×8 ekrana.

ESP32-s3_internet_clock_animation

 

Kako radi (na visokom nivou)

1) ESP32-S3 se povezuje na vaš router koristeći <WiFi.h>.
2) Sinhronizuje vrijeme sa NTP servera koristeći "time.h" i configTime().
3) Vrijeme se formatira kao HH:MM i sprema u mali tekstualni bafer.
4) NeoMatrix prikazuje tekst i pomiče ga preko 8×8 panela.

RGB boja

Boja teksta sata se kontroliše koristeći RGB (crvena, zelena, plava) vrijednosti, gdje svaki kanal boje ide od 0 do 255 i različite kombinacije stvaraju različite boje na NeoMatrix-u. Podešavanjem color_RED, color_GREEN i color_BLUE varijabli, lako možete prilagoditi izgled sata bilo kojoj boji koju želite. Da brzo pronađete tačne RGB vrijednosti za određenu boju, možete koristiti online RGB Color Picker Color Picker .

Korišćene biblioteke

Ovi include-ovi vam tačno govore o čemu skica zavisi:

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

Instalirajte Adafruit NeoMatrix koristeći Arduino Library Manager. On će također povući potrebne zavisnosti kao što su Adafruit GFX Library i Adafruit NeoPixel.

Važna korisnička podešavanja koja MORATE izmijeniti

1) Boja teksta (RGB)

Postavite boju teksta sata koristeći vrijednosti 0–255:

//postavi boju ekrana napravljenu od crvene, zelene i plave
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;

Ove vrijednosti se koriste ovdje:

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

Napomena: Ako postavite sve boje na 0 (crna), tekst postaje nevidljiv. Skica uključuje sigurnosnu provjeru:

// ako je korisnik postavio sve boje na 0, ekran će biti ugašen pa ga postavi na zelenu
if (color_RED == 0 && color_GREEN == 0 && color_BLUE == 0) {
  color_GREEN = 200;
}

Ovo osigurava da matrica nikada ne izgleda “mrtvo” zbog nevidljive postavke boje.

2) Wi-Fi SSID i lozinka

Zamijenite ovo sa vašim stvarnim Wi-Fi imenom i lozinkom:

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

Tokom pokretanja, ESP32 štampa napredak povezivanja u Serial Monitor-u i ističe nakon otprilike 15 sekundi (30 pokušaja × 500ms).

3) NTP server

Podrazumijevani NTP server je:

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

Možete ga ostaviti kako jeste. Ako ikada želite koristiti lokalni server, zamijenite naziv hosta sa vašim željenim NTP serverom.

4) Vremenska zona offset i ljetno vrijeme offset

Ova dva podešavanja kontrolišu lokalno vrijeme:

// Toronto-ish: UTC-5, plus 1 sat DST
const long  gmtOffset_sec      = -5 * 3600;  // -5 sati
const int   daylightOffset_sec = 3600;       // +1 sat za DST

Kako ih postaviti:

  • gmtOffset_sec = (UTC offset sati) × 3600. Primjer: UTC-5 → -5*3600, UTC+2 → 2*3600.
  • daylightOffset_sec = 0 ako ne želite prilagođavanje za ljetno vrijeme, ili 3600 ako vaša regija trenutno primjenjuje ljetno vrijeme (+1 sat).

Ovo se primjenjuje ovdje:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Konfiguracija ekrana

Pin za podatke matrice

Pin za podatke je definisan ovdje:

#define MATRIX_PIN 14

Ako vaše povezivanje koristi drugačiji GPIO, promijenite ovaj broj da odgovara.

NeoMatrix raspored + redoslijed boja

Vaša matrica se inicijalizira ovako:

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

Dva česta razloga zašto ekran izgleda “pogrešno”:

  • Rotacija / smjer povezivanja: Ako se tekst pojavi naopako ili zrcaljeno, prilagodite NEO_MATRIX_* zastavice (TOP/BOTTOM, LEFT/RIGHT, ROWS/COLUMNS, PROGRESSIVE/ZIGZAG).
  • Redoslijed boja: Ovaj kod koristi NEO_RGB. Neki paneli su NEO_GRB. Ako crvena/zelena/plava ne odgovaraju, promijenite NEO_RGB u ispravan redoslijed.

Svjetlina

Svjetlina se postavlja u initMatrix():

matrix.setBrightness(40);

Povećajte za svjetliji ekran, smanjite za manje toplote i potrošnje energije.

Kako se vrijeme generiše kao HH:MM

Sat sprema formatirano vrijeme u bafer od 6 karaktera:

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

Zatim updateTimeText() čita lokalno vrijeme sinhronizovano s NTP-om i upisuje tekst:

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

Ovo se ažurira jednom u sekundi u glavnoj petlji.

Kako funkcioniše skrolanje na 8×8 displeju

Matrica 8×8 je preuska da bi prikazala HH:MM odjednom, pa skica skrola tekst. Crta vrijeme na promjenjivoj X poziciji (scrollX), zatim ga pomjera lijevo za jedan piksel pri svakom ažuriranju.

int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;

Svaki korak skrolanja:

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

Kada tekst u potpunosti izađe s lijeve strane, kod ga resetuje da počne ponovo s desne ivice:

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

Serijski monitor izlaz (debugiranje)

Ova skica ispisuje korisne poruke:

  • Napredak Wi-Fi povezivanja i IP adresu
  • Da li je sinhronizacija vremena uspjela
  • Formatirani vremenski string (npr., Time text: 14:32)

Ako je displej prazan, Serijski monitor je prvo mjesto za provjeru kako bi se potvrdilo da Wi-Fi i NTP rade.

Demonstracija projekta

Nakon uploada i resetovanja:

  • ESP32 se povezuje na Wi-Fi
  • Sinhronizuje vrijeme s pool.ntp.org
  • Kratko prikazuje OK na matrici
  • Neprekidno skrola trenutno vrijeme kao HH:MM

Preuzimanja i linkovi

Kompletan kod je dat ispod ovog članka. Dijelovi, alati i tehnički listovi su također povezani ispod ovog članka.

Images

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
Language: 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
  }
}

Things you might need

Resources & references

Files📁

Fritzing File