Search Code

Mashruucda Saacadda NTP + Wi-Fi Matrix LED RGB ee ESP32-S3 -1 Saacad Aasaasi ah

Mashruucda Saacadda NTP + Wi-Fi Matrix LED RGB ee ESP32-S3 -1 Saacad Aasaasi ah

Saat-ga Internet-ka ee ESP32-S3 oo leh 8×8 NeoMatrix (Wi-Fi + Waqtiga NTP)

Mashruucani wuxuu u beddelaa ESP32-S3 iyo 8×8 RGB NeoMatrix (NeoPixel/WS2812) saacad yar oo internet ah. ESP32 wuxuu ku xidhmaa Wi-Fi, wuxuu ku waafajiyaa waqtiga maxalliga ah ee server-ka NTP, ka dibna wuxuu ku duubaa waqtiga sida HH:MM guud ahaan bandhigga 8×8.

ESP32-s3_internet_clock_animation

 

Sida ay u shaqeyso (heer sare)

1) ESP32-S3 wuxuu ku xidhmaa router-kaaga isagoo isticmaalaya <WiFi.h>.
2) Wuxuu waqtiga ka soo qaadaa server-ka NTP isagoo isticmaalaya "time.h" iyo configTime().
3) Waqtiga waxaa loo qaabeeyaa sida HH:MM waxaana lagu kaydiyaa kayd yar oo qoraal ah.
4) NeoMatrix wuxuu muujiyaa qoraalka wuxuuna ku duubaa guud ahaan panel-ka 8×8.

Midabka RGB

Midabka qoraalka saacadda waxaa lagu xakameeyaa iyadoo la isticmaalayo qiimayaasha RGB (Casaan, Cagaar, Buluug), halkaasoo kanaal kasta oo midab uu u dhexeeyo 0 ilaa 255 iyo isku-dhafan kala duwan oo abuuraya midabyo kala duwan oo ku yaal NeoMatrix. Adiga oo hagaajinaya doorsoomayaasha color_RED, color_GREEN, iyo color_BLUE, waxaad si fudud u habeysan kartaa muuqaalka saacadda midab kasta oo aad jeceshahay. Si dhakhso ah ugu helista qiimayaasha RGB ee saxda ah ee midab gaar ah, waxaad isticmaali kartaa Xulaha Midabka RGB ee khadka tooska ah Xulaha Midabka .

Maktabadaha la isticmaalay

Kuwani waxay kuugu sheegayaan si sax ah waxa sketch-ku ku xiran yahay:

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

Ku rakib Adafruit NeoMatrix adigoo isticmaalaya Maareeyaha Maktabadda Arduino. Waxay sidoo kale soo jiidi doontaa ku-tiirsanaanta loo baahan yahay sida Adafruit GFX Library iyo Adafruit NeoPixel.

Dejinta muhiimka ah ee isticmaalaha ee waa inaad wax ka beddeshaa

1) Midabka qoraalka (RGB)

Deji midabka qoraalka saacadda adigoo isticmaalaya qiimayaasha 0–255:

//deji midabka bandhigga oo ka kooban Casaan, Cagaar iyo Buluug
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;

Qiimayaashan waxaa lagu isticmaalaa halkan:

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

Fiiro gaar ah: Haddii aad dhigto dhammaan midabada 0 (madow), qoraalku wuxuu noqdaa mid aan la arki karin. Sketch-ku wuxuu ku darayaa hubin amni:

// haddii isticmaaluhu dhigay dhammaan midabada 0, bandhigga wuu demin doonaa marka dhig cagaar
if (color_RED == 0 && color_GREEN == 0 && color_BLUE == 0) {
  color_GREEN = 200;
}

Tani waxay hubinaysaa in matrix-ku uusan waligiis u ekaan “dhintay” sababtoo ah dejinta midab aan la arki karin.

2) Wi-Fi SSID iyo erayga sirta ah

Ku beddel kuwan magaca Wi-Fi-gaaga dhabta ah iyo erayga sirta ah:

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

Inta lagu jiro bilowga, ESP32 wuxuu daabacaa horumarka xidhiidhka ee Serial Monitor wuxuuna waqti ka dhamaadaa qiyaastii 15 ilbiriqsi (30 isku day × 500ms).

3) Server-ka NTP

Server-ka NTP ee caadiga ah waa:

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

Waxaad sii wadi kartaa sida uu yahay. Haddii aad waligaa rabto inaad isticmaasho server maxalli ah, ku beddel magaca server-ka NTP ee aad doorbidayso.

4) Dheellitirka aagga waqtiga iyo dheellitirka iftiinka maalinta

Labadan dejinta ayaa xakameynaya waqtiga maxalliga ah:

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

Sida loo dejiyo:

  • gmtOffset_sec = (saacadaha dheellitirka UTC) × 3600. Tusaale: UTC-5 → -5*3600, UTC+2 → 2*3600.
  • daylightOffset_sec = 0 haddii aadan rabin hagaajinta DST, ama 3600 haddii gobolkaagu hadda uu ilaalinayo DST (+1 saac).

Kuwani waxaa lagu dabaqay halkan:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Qaabaynta bandhigga

Biyinta xogta matrix-ka

Biyinta xogta waxaa lagu qeexay halkan:

#define MATRIX_PIN 14

Haddii fiilooyinkaagu isticmaalaan GPIO kala duwan, beddel lambarkan si uu u waafajiyo.

Qaabka NeoMatrix + nidaamka midabka

Matrix-kaaga waxaa lagu bilaabay sidan:

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

Laba sababood oo caadi ah oo bandhiggu ugu ekaado “khalad”:

  • Wareeg / jihada fiilooyinka: Haddii qoraalku u muuqdo mid rogan ama midabaysan, hagaaji calaamadaha NEO_MATRIX_* (TOP/BOTTOM, LEFT/RIGHT, ROWS/COLUMNS, PROGRESSIVE/ZIGZAG).
  • Nidaamka midabka: Koodhkani wuxuu isticmaalaa NEO_RGB. Qaar ka mid ah panel-yada waa NEO_GRB. Haddii casaan/cagaar/buluug aysan waafaqin, beddel NEO_RGB si uu u noqdo nidaamka saxda ah.

Iftiinka

Iftiinka waxaa lagu dejiyaa initMatrix():

matrix.setBrightness(40);

Kordhi si aad u hesho bandhig ifaya, yaree si aad u hoos u dhigtid kulaylka iyo isticmaalka korontada.

Sida waqtiga loo abuuro sida HH:MM

Saacaddu waxay ku kaydisaa waqtiga qaabeysan kayd 6-xaraf ah:

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

Kad dibna updateTimeText() waxuu akhriyaa waqtiga maxalliga ah ee NTP-ku xidhiidhiyay oo waxuu qoraa qoraalka:

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

Tani waxaa la cusboonaysiiyaa hal mar ilbiriqsi kasta gudaha loop-ka ugu weyn.

Sida scrolling-ku u shaqeeyo bandhigga 8×8

Matrix-ka 8×8 aad buu u cidhiidhiyahay inuu muujiyo HH:MM hal mar, marka sketch-ku wuu scrolling-gareeyaa qoraalka. Wuxuu sawiraa waqtiga meel X ah oo isbeddelaysa (scrollX), ka dibna wuxuu u dhaqaaqaa bidix hal pixel markasta oo cusboonaysiin.

int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;

Tallaabo kasta oo scrolling ah:

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

Marka qoraalku si buuxda uga baxo dhinaca bidix, code-ku wuxuu dib u dejiyaa si uu uga bilaabo mar kale dhinaca midig:

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

Wax soo saarka Serial Monitor (khalad-baaris)

Sketch-kani wuxuu daabacaa fariimo faa'iido leh:

  • Horumarinta xidhiidhka Wi-Fi iyo ciwaanka IP
  • In isku-duubista waqtigu ku guulaysatay iyo in kale
  • Qoraalka waqtiga ee qaabaysan (tusaale, Qoraalka waqtiga: 14:32)

Haddii bandhigu maran yahay, Serial Monitor waa meesha koowaad ee la hubiyo si loo xaqiijiyo in Wi-Fi iyo NTP ay shaqeynayaan.

Muuujinta mashruuca

Ka dib marka la soo geliyo oo la dib u bilaabo:

  • ESP32 wuxuu ku xidhmaa Wi-Fi
  • Wuxuu waqtiga ka soo qaadaa pool.ntp.org
  • Wuxuu muujiyaa OK si kooban matrix-ka
  • Wuxuu si joogto ah u scrolling-gareeyaa waqtiga hadda jira sida HH:MM

Soo dejinta iyo xiriiriyeyaasha

Code-ka buuxa ayaa hoos lagu bixiyay maqaalkan. Qaybaha, qalabka, iyo xaashiyaha xogta ayaa sidoo kale hoos lagu xidhiidhiyay maqaalkan.

Sawirro

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

Waad u baahan tahay

Kheyraadka & Tixraacyada

Faylasha📁

Faylka Fritzing