شِفر (کود) جستجو

پروژه ساعت پایه ESP32-S3 ماتریس LED RGB با Wi-Fi + ساعت زمان NTP -1

پروژه ساعت پایه ESP32-S3 ماتریس LED RGB با Wi-Fi + ساعت زمان NTP -1

ساعت اینترنتی ESP32-S3 با NeoMatrix 8×8 (Wi-Fi + زمان NTP)

این پروژه یک ESP32-S3 و یک ماتریس RGB 8×8 نئو (NeoPixel/WS2812) را به یک ساعت اینترنتی کوچک تبدیل می‌کند. ESP32 به Wi-Fi متصل می‌شود، زمان محلی را از یک سرور NTP همزمان می‌کند و سپس زمان را به صورت متحرک نمایش می‌دهد.HH:MMبر روی نمایشگر ۸×۸.

ESP32-s3_حرکت_ساعت_اینترنتی

نحوه کارکرد آن (در سطح بالا)

1) ESP32-S3 به روتر شما متصل می‌شود با استفاده از<WiFi.h>.
۲) زمان را از یک سرور NTP همگام‌سازی می‌کند با استفاده از"time.h"وconfigTime().
زمان به صورت فرمت شده استHH:MMو در یک بافر متنی کوچک ذخیره شد.
۴) نئوماتریکس متن را نمایش می‌دهد و آن را بر روی پنل ۸×۸ اسکرول می‌کند.

رنگ RGB

رنگ متن ساعت با استفاده از مقادیر RGB (قرمز، سبز، آبی) کنترل می‌شود، که در آن هر کانال رنگی از ۰ تا ۲۵۵ متغیر است و ترکیب‌های مختلف رنگ‌های مختلفی روی NeoMatrix ایجاد می‌کنند. با تنظیمcolor_RED,color_GREEN, andcolor_BLUEشما می‌توانید به راحتی ظاهر ساعت را به هر رنگی که می‌پسندید سفارشی‌سازی کنید. برای پیدا کردن سریع مقدار دقیق RGB برای یک رنگ خاص، می‌توانید از انتخاب‌گر رنگ RGB آنلاین استفاده کنید.انتخابگر رنگ.

کتابخانه های استفاده شده

این موارد به شما دقیقاً می‌گویند که طرح به چه چیزی وابسته است:

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

نصب کنیدآدا فرویت نئوماتریکساستفاده از مدیر کتابخانه آردوینو. همچنین وابستگی‌های مورد نیاز را نیز بارگذاری خواهد کرد مانندAdafruit GFX LibraryوAdafruit NeoPixel.

تنظیمات مهم کاربری که باید ویرایش کنید

1) رنگ متن (RGB)

رنگ متن ساعت خود را با استفاده از مقادیر ۰-۲۵۵ تنظیم کنید:

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

این مقادیر در اینجا استفاده می‌شوند:

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

توجه:اگر تمامی رنگ‌ها را به ۰ (سیاه) تنظیم کنید، متن نامرئی می‌شود. طراحی شامل یک بررسی ایمنی است:

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

این اطمینان می‌دهد که ماتریس هرگز به دلیل تنظیم رنگ نامرئی "مرده" به نظر نمی‌رسد.

2) SSID و رمز عبور Wi-Fi

این‌ها را با نام واقعی Wi-Fi و رمزعبور خود جایگزین کنید:

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

در حین راه‌اندازی، ESP32 پیشرفت اتصال را در نمایشگر مسلسل چاپ می‌کند و پس از حدود ۱۵ ثانیه (۳۰ تلاش × ۵۰۰ میلی‌ثانیه) زمانش به پایان می‌رسد.

سرور NTP

سرور NTP پیش‌فرض عبارت است از:

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

شما می‌توانید آن را به همانی که هست نگه دارید. اگر هر زمان بخواهید از یک سرور محلی استفاده کنید، نام میزبان را با سرور NTP مورد نظر خود جایگزین کنید.

۴) تفاوت زمان منطقه‌ای و تفاوت زمان صرفه‌جویی در روشنایی روز

این دو تنظیم زمان محلی را کنترل می‌کنند:

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

چگونه آن‌ها را تنظیم کنیم:

  • gmtOffset_sec= (ساعت جابه‌جایی UTC) × ۳۶۰۰. مثال: UTC-5 →-5*3600, UTC+2 →2*3600.
  • daylightOffset_sec=0اگر نمی‌خواهید تنظیمات DST انجام شود، یا3600اگر منطقه شما در حال حاضر ساعت تابستانی را رعایت می‌کند (+1 ساعت).

اینها در اینجا اعمال می‌شوند:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

پیکربندی نمایش

پایه داده ماتریسی

پایه داده اینجا تعریف شده است:

#define MATRIX_PIN 14

اگر سیم‌کشی شما از GPIO متفاوتی استفاده می‌کند، این شماره را تغییر دهید تا مطابقت داشته باشد.

چیدمان NeoMatrix + ترتیب رنگ

ماتریس شما به این شکل اولیه‌سازی شده است:

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

دو دلیل متداول که باعث می‌شود نمایش به‌نظر "نادرست" برسد:

  • جهت چرخش / سیم‌کشی:اگر متن به صورت معکوس یا وارونه نمایش داده می‌شود، تنظیمات را تغییر دهید.NEO_MATRIX_*پرچم‌ها (بالا/پایین، چپ/راست، ردیف‌ها/ستون‌ها، پیشرفته/زلزله‌ای).
  • ترتیب رنگ:این شِفر (کود) ازNEO_RGB. برخی از پنل ها هستندNEO_GRBاگر قرمز/سبز/آبی مطابقت ندارند، تغییر دهیدNEO_RGBبه ترتیب صحیح.

روشنایی

روشنایی تنظیم شده است درinitMatrix():

matrix.setBrightness(40);

برای افزایش روشنایی نمایش، افزایش دهید و برای کاهش گرما و مصرف برق، کاهش دهید.

چگونه زمان تولید می‌شود به عنوانHH:MM

ساعت زمان فرمت شده را در یک بافر ۶ کاراکتری ذخیره می‌کند:

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

سپسupdateTimeText()زمان محلی همگام‌شده با NTP را می‌خواند و متن را می‌نویسد:

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

این هر ثانیه یک بار در حلقه اصلی به‌روزرسانی می‌شود.

نحوه کارکرد اسکرولینگ روی نمایشگر ۸×۸

یک ماتریس ۸×۸ خیلی باریک است تا نمایش داده شود.HH:MMبه طور همزمان، بنابراین طرح متن را اسکرول می‌کند. در حالیکه زمان را در یک موقعیت X متغیر به تصویر می‌کشد.scrollX)، سپس آن را در هر بروزرسانی یک پیکسل به سمت چپ حرکت می‌دهد.

int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;

هر مرحله اسکرول:

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

زمانی که متن کاملاً از سمت چپ خارج می‌شود، شِفر (کود) آن را بازنشانی می‌کند تا دوباره از لبه سمت راست شروع شود:

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

خروجی نمایشگر مسلسل (اشکال‌زدایی)

این طرح پیام‌های مفیدی را چاپ می‌کند:

  • پیشرفت اتصال Wi-Fi و آدرس IP
  • آیا همزمانی زمان موفق بود؟
  • زمان قالب‌بندی شده (به عنوان مثال،Time text: 14:32)

اگر صفحه نمایش خالی است، نمایشگر مسلسل اولین جایی است که باید بررسی کنید تا تأیید کنید که Wi-Fi و NTP در حال کار هستند.

مظاهره پروژه

پس از بارگذاری و بازنشانی:

  • ESP32 به Wi-Fi متصل می‌شود
  • زمان را از سنک می‌کندpool.ntp.org
  • نمایش‌هاOKبه طور مختصر در مورد ماتریس
  • به طور مداوم زمان فعلی را پیمایش می‌کند همانطور کهHH:MM

دانلودها و واصل‌ها

شِفر (کود) کامل در زیر این مقاله ارائه شده است. قطعات، ابزار و برگه‌های اطلاعات نیز در زیر این مقاله پیوند داده شده‌اند.

تصاویر

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
زبان: 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
  }
}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

فایل‌ها📁

فایل فریزینگ