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

پروژه ساعت اینترنتی ماتریس LED RGB ESP32-S3 - ۳ رنگ شب با تاریخ

پروژه ساعت اینترنتی ماتریس LED RGB ESP32-S3 - ۳ رنگ شب با تاریخ

ساعت اینترنتی ESP32-S3 RGB NeoMatrix با روشنایی خودکار روز/شب

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

این ساعت چه کاری انجام می‌دهد

پس از روشن شدن، ESP32-S3 به شبکه Wi-Fi شما متصل می‌شود و زمان محلی فعلی را از اینترنت دریافت می‌کند. زمان به‌طور روان در نمایشگر LED حرکت می‌کند. در ساعات شب، نمایشگر به‌طور خودکار به روشنایی کمتری کاهش می‌یابد، در حالی که در طول روز به سطح روشنایی بیشتری برمی‌گردد.

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

کتابخانه‌های مورد استفاده

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

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

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

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

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

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

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

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

سرور NTP، منطقه زمانی و صرفه‌جویی در نور روز

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

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

زمان محلی با استفاده از این اختلافات محاسبه می‌شود:

const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;
  • gmtOffset_secتفصیل می‌دهد که偏移 UTC شما در ثانیه‌ها چیست
  • daylightOffset_secیک ساعت به زمان اضافه می‌کند زمانی که ساعت تابستانی فعال است (استفاده0اگر لازم نیست)

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

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

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

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

const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22; // 10 PM
const int NIGHT_END_HOUR = 6;    // 6 AM

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

پیکربندی رنگ RGB

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

uint8_t userColors[][3] = {
  {17, 43, 171},  // Light Blue
  {255, 0, 0},    // Red
  {0, 255, 0},    // Green
  {255, 165, 0},  // Orange
  {255, 0, 255}   // Magenta
};

اگرuseFixedColorتنظیم شده است برایtrue، ساعت همیشه از یک رنگ استفاده می‌کند. اگر تنظیم شده باشد بهfalseرنگ به طور خودکار پس از هر بار اسکرول کامل زمان تغییر می‌کند.

برای پیدا کردن سریع مقادیر دقیق RGB برای هر رنگ، از ابزار انتخاب کننده رنگ RGB استفاده کنید:انتخابگر رنگ RGB.

نمایش زمان و اسکرول کردن

زمان کنونی به صورت فرمت‌بندی شده استHH:MMو در یک بافر کاراکتری کوچک ذخیره می‌شود. به دلیل اینکه نمایشگر تنها ۸ پیکسل عرض دارد، متن به طور روان از راست به چپ حرکت می‌کند. به محض اینکه زمان به طور کامل از نمایشگر خارج می‌شود، رنگ بعدی (در صورت فعال بودن) برای دور بعدی انتخاب می‌شود.

به نمایش

پس از بارگذاری طرح:

  • ESP32-S3 به Wi-Fi متصل می‌شود.
  • زمان از اینترنت هماهنگ شده است
  • زمان فعلی در ماتریس RGB حرکت می‌کند
  • روشنایی به طور خودکار بین روز و شب تغییر می‌کند
  • رنگ متن ثابت باقی می‌ماند یا بر اساس تنظیمات شما تغییر می‌کند.

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

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

تصاویر

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
870-ESP32-S3 RGB LED Matrix Internte Clock Project 3 - Night Color with Date
زبان: C++
/*
 * =====================================================================================
 * ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 3- Night color with Date
 * =====================================================================================
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT840
 * Author: Gemini (AI Thought Partner) & Ahmad Shamshiri (Robojax.com)
 * Date: 07 Jan 2026

 * * FEATURES:
 * 1. WiFi/NTP Time: Syncs automatically with internet time servers.
 * 2. Cycle-Based Color: Color changes ONLY after the time finishes a full scroll.
 * 3. Auto-Brightness: Dims the LEDs during night hours (User-configurable).
 * =====================================================================================
 */

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

#define MATRIX_PIN 14

// --- BRIGHTNESS CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22; // 10 PM
const int NIGHT_END_HOUR = 6;    // 6 AM

// --- COLOR CONFIGURATION ---
bool useFixedColor = false; 
int fixedColorIndex = 0;    
uint8_t userColors[][3] = {
  {17, 43, 171},  // Light Blue
  {255, 0, 0},    // Red
  {0, 255, 0},    // Green
  {255, 165, 0},  // Orange
  {255, 0, 255}   // Magenta
};

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

int currentColorIndex = 0;
int totalColors = sizeof(userColors) / sizeof(userColors[0]);

// --- INTERVALS ---
unsigned long lastTimeUpdateMs = 0;
const uint16_t timeUpdateIntervalMs = 1000;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;

// --- GLOBAL VARIABLES ---
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;


const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;

void updateTimeText() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;
  
  // Format HH:MM
  snprintf(timeText, sizeof(timeText), "%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min);

  // Apply Auto-Brightness
  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);
  
  // Pick the color (Fixed or Cycle)
  int idx = useFixedColor ? fixedColorIndex : currentColorIndex;
  matrix.setTextColor(matrix.Color(userColors[idx][0], userColors[idx][1], userColors[idx][2]));

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

  scrollX--;

  // Width for "HH:MM" is roughly 30 pixels
  int16_t textWidth = 30;
  
  // TRIGGER: When time is fully off-screen
  if (scrollX < -textWidth) {
    scrollX = matrix.width(); // Reset position to right side
    
    // Cycle to the next color in the array for the next pass
    if (!useFixedColor) {
      currentColorIndex = (currentColorIndex + 1) % totalColors;
      Serial.print("Next cycle color index: ");
      Serial.println(currentColorIndex);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(DAY_BRIGHTNESS);
  
  updateTimeText();
}

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

  // Update time digits and brightness once per second
  if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
    lastTimeUpdateMs = now;
    updateTimeText(); 
  }

  // Handle the scrolling animation
  if (now - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = now;
    scrollTime();
  }
}

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

فایل‌ها📁

فایل فریزینگ