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

پروژه ساعت اینترنتی ماتریس LED RGB ESP32-S3 - ۴ رنگ تصادفی

پروژه ساعت اینترنتی ماتریس LED RGB ESP32-S3 - ۴ رنگ تصادفی

ساعت اینترنتی ESP32-S3 با رنگ‌های تصادفی RGB

این پروژه یک ساعت اینترنتی ماتریس RGB ESP32-S3 است که به Wi-Fi متصل می‌شود، زمان محلی را از یک سرور NTP همگام‌سازی می‌کند و زمان را به صورت اسکرول نمایش می‌دهد.HH:MMدر این نسخه، ساعت‌ها، دو نقطه و دقیقه‌ها هر یک به صورت فرمت در ماتریس RGB NeoMatrix 8×8 داخلی نمایش داده می‌شوند.رنگ‌های تصادفیدر هر چرخه پیمایش کامل انتخاب شده، یک نمایش ساعت پویا و بازیگوش ایجاد می‌کند که به‌طور مداوم تغییر می‌کند.

ساعت_اینترنتی_انیمیشن_ESP32-s3

چطور این ساعت کار می‌کند

پس از تغذیه برد از طریق USB-C، ESP32-S3 به شبکه Wi-Fi شما متصل می‌شود و زمان محلی فعلی را از اینترنت دریافت می‌کند. زمان به سه بخش تقسیم می‌شود-ساعت، دو نقطه و دقیقه-و هر بخش به طور جداگانه بر روی ماتریس RGB نمایش داده می‌شود. هنگامی که متن به طور کامل از صفحه خارج می‌شود، رنگ‌های تصادفی جدیدی برای عبور بعدی انتخاب می‌شوند.

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

این طرح از کتابخانه‌های زیر استفاده می‌کند:

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

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

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

پایه داده ماتریس (ماتریس RGB داخلی)

اگرچه ماتریس RGB بر روی برد یکپارچه شده است، اما پایه داده هنوز باید در شِفر (کود) تعریف شود:

#define MATRIX_PIN 14

GPIO 14 معمولاً در تخته‌های ماتریس RGB ESP32-S3 استفاده می‌شود. اگر نوع تخته شما از پایه دیگری استفاده می‌کند، این مقدار را به‌روزرسانی کنید.

SSID و رمز عبور Wi-Fi (حساس به حروف بزرگ و کوچک)

جزئیات شبکه خود را جایگزین اطلاعات ورود به سیستم Wi-Fi کنید:

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

مهم:شناسه‌های SSID وای‌فای عبارتند ازحساس به بزرگی و کوچکی حروف. یک SSID به نام"Book"فرق دارد با"book"اگر حروف بزرگ و کوچک دقیقا مطابقت نداشته باشند، ESP32-S3 از اتصال بازخواهد ماند.

سرور NTP، منطقه زمانی و تابستانی

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

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

زمان محلی با استفاده از UTC و تفکیک صرفه‌جویی در وقت محاسبه می‌شود:

// Toronto-ish: UTC-5, plus 1 hour DST
const long  gmtOffset_sec     = -5 * 3600;
const int   daylightOffset_sec = 3600;
  • gmtOffset_secاختلاف زمان UTC به ثانیه (بر اساس موقعیت شما تنظیم شود)
  • daylightOffset_secاستفاده کنید3600زمانی که ساعت تابستانی فعال است، یا0در غیر این صورت

این تنظیمات با استفاده از:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

روشنایی خودکار روز / شب

ساعت به طور خودکار روشنایی را بر اساس ساعت فعلی تنظیم می‌کند:

const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;

در بازه زمانی بین ساعت ۱۰ شب تا ۶ صبح، نمایش کم نور می‌شود تا در محیط‌های تاریک از تابش خیره‌کننده کاسته شود. در ساعات روز، ماتریس به روشنایی عادی بازمی‌گردد.

رفتار رنگ RGB تصادفی

یک لیست از پیش تعریف شده از رنگ‌های RGB در یک آرایه ذخیره شده است که هر رنگ با استفاده از مقادیر قرمز، سبز و آبی تعریف شده و این مقادیر از ۰ تا ۲۵۵ متغیر هستند:

uint8_t userColors[][3] = {
  {255, 0, 0},    // Red
  {0, 255, 0},    // Green
  {0, 0, 255},    // Blue
  {255, 165, 0},  // Orange
  {255, 0, 255},  // Magenta
  {0, 255, 255},  // Cyan
  {255, 255, 0}   // Yellow
};

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

  • چنــدعدد ساعترنگی تصادفی به آنها اختصاص داده می‌شود
  • متن:دو نقطهرنگ تصادفی متفاوتی دریافت می‌کند
  • متن:دقایق اعدادیک رنگ تصادفی دیگر دریافت کنید

این ترکیب رنگی که به طور مداوم در حال تغییر است، ساعت را از نظر بصری جالب نگه می‌دارد. برای ایجاد رنگ‌های سفارشی خود، می‌توانید از ابزار انتخاب رنگ RGB استفاده کنید:انتخابگر رنگ RGB.

منطق رندرینگ زمان

زمان به سه بخش تقسیم می‌شود:

  • ساعات: HH
  • کولون: :
  • دقایق: MM

هر بخش به طور جداگانه طراحی شده است تا بتواند رنگ خود را داشته باشد، در حالی که همه بخش‌ها به صورت یکجا حرکت می‌کنند تا یک انیمیشن اسکرول نرم را در نمایشگر ۸×۸ تشکیل دهند.

تولید رنگ تصادفی

برای اطمینان از تصادفی بودن رنگ، طرح در هنگام راه‌اندازی مولد عدد تصادفی را با استفاده از یک پایه آنالوگ غیرمتصل بذر می‌زند:

randomSeed(analogRead(0));

این اطمینان می‌دهد که ترکیب‌های رنگی در هر تقویت قدرت و هر چرخه نوار مختلف هستند.

تظاهرات

پس از بارگذاری طرح و تأمین برق برد از طریق USB-C:

  • ESP32-S3 به شبکه Wi-Fi شما متصل می‌شود.
  • زمان از اینترنت همزمان‌سازی شده است
  • زمان به جلو می‌رود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
873-ESP32-S3 RGB LED Matrix Internte Clock Project 4 - Random Color
زبان: C++
/*
 * =====================================================================================
 * ساعت RGB اینترنتی ESP32-S3 (ماتریس 8x8) - پروژه 4- رنگ تصادفی
 * =====================================================================================
 * ویدیو را مشاهده کنید https://youtube.com/shorts/4iWjLiD7fS8
 * 📚⬇️ صفحه دانلود و منابع https://robojax.com/RJT838
 * نویسنده: جمنای (همکار تفکری هوش مصنوعی) و احمد شمشیری (Robojax.com)
 * تاریخ: 07 ژانویه 2026
 * 
 * ویژگی‌ها:
 * 1. زمان WiFi/NTP: به طور خودکار با سرورهای زمان اینترنت همگام‌سازی می‌شود.
 * 2. رنگ مبتنی بر چرخه: رنگ فقط پس از اتمام یک چرخش کامل تغییر می‌کند.
 * 3. تنظیم خودکار روشنایی: در ساعات شب LED‌ها را کم نور می‌کند (قابل تنظیم توسط کاربر).
 * =====================================================================================
 * 
 * =====================================================================================
 * ساعت اینترنتی ESP32-S3 - عناصر چند رنگ
 * =====================================================================================
 * هر قسمت از زمان (ساعت : دقیقه) رنگ تصادفی متفاوتی از لیست شما دریافت می‌کند.
 * رنگ‌ها تنها پس از اتمام چرخه چرخش کامل تغییر می‌کنند.
 * =====================================================================================
 */
#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

#define MATRIX_PIN 14

 // --- پیکربندی ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;

uint8_t userColors[][3] = {
  {255, 0, 0}, // قرمز
  {0, 255, 0}, // سبز
  {0, 0, 255}, // آبی
  {255, 165, 0}, // پرتقال
  {255, 0, 255}, // مجنتا
  {0, 255, 255}, // سایان
  {255, 255, 0} // زرد
};
int totalColors = sizeof(userColors) / sizeof(userColors[0]);

 // متغیرهایی برای ذخیره شاخص‌های رنگ تصادفی فعلی
int hourColorIdx = 0;
int colonColorIdx = 1;
int minColorIdx = 2;

 // --- جهانیات ---
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
  NEO_MATRIX_TOP    + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS   + NEO_MATRIX_PROGRESSIVE,
  NEO_RGB           + NEO_KHZ800);

char hourText[3], minText[3];
int16_t scrollX = 8;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;

 // 👇 نام و رمز عبور واقعی WiFi خانگی خود را جایگزین کنید
const char* WIFI_SSID     = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";

void updateTimeParts() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;

  snprintf(hourText, sizeof(hourText), "%02d", timeinfo.tm_hour);
  snprintf(minText, sizeof(minText), "%02d", timeinfo.tm_min);

  if (timeinfo.tm_hour >= NIGHT_START_HOUR || timeinfo.tm_hour < NIGHT_END_HOUR) {
    matrix.setBrightness(NIGHT_BRIGHTNESS);
  } else {
    matrix.setBrightness(DAY_BRIGHTNESS);
  }
}

void scrollTime() {
  matrix.fillScreen(0);

  int x = scrollX;

 // ساعت‌های رسم کردن
  matrix.setTextColor(matrix.Color(userColors[hourColorIdx][0], userColors[hourColorIdx][1], userColors[hourColorIdx][2]));
  matrix.setCursor(x, 0);
  matrix.print(hourText);
  x += 12; // ۱۲ پیکسل حرکت دهید (۲ رقم * ۶ پیکسل)

 // 2. کُلُن را بکشید
  matrix.setTextColor(matrix.Color(userColors[colonColorIdx][0], userColors[colonColorIdx][1], userColors[colonColorIdx][2]));
  matrix.setCursor(x, 0);
  matrix.print(":");
  x += 6; // حرکت 6 پیکسل

 // 3. رسم صورت جلسه
  matrix.setTextColor(matrix.Color(userColors[minColorIdx][0], userColors[minColorIdx][1], userColors[minColorIdx][2]));
  matrix.setCursor(x, 0);
  matrix.print(minText);

  matrix.show();
  scrollX--;

 // عرض کل تقریباً 30 پیکسل است (HH=12، :=6، MM=12)
  if (scrollX < -30) {
    scrollX = matrix.width();

 // رنگ‌های جدید تصادفی را برای چرخه بعدی انتخاب کنید
    hourColorIdx = random(0, totalColors);
    colonColorIdx = random(0, totalColors);
    minColorIdx = random(0, totalColors);
  }
}

void setup() {
  Serial.begin(115200);

 // ژنراتور تصادفی را با استفاده از یک پایه آنالوگ غیر متصل راه‌اندازی کنید
  randomSeed(analogRead(0));

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(500);

  configTime(-5 * 3600, 3600, "pool.ntp.org");
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(DAY_BRIGHTNESS);
}

void loop() {
  if (millis() % 1000 == 0) updateTimeParts();

  if (millis() - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = millis();
    scrollTime();
  }
}

فایل‌ها📁

فایل فریزینگ