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

پروژه ساعت اینترنتی ماتریس LED RGB ESP32-S3 - ۵ رنگ رنگین کمان

پروژه ساعت اینترنتی ماتریس LED RGB ESP32-S3 - ۵ رنگ رنگین کمان

ساعت اینترنتی ESP32-S3 با افکت رنگین کمان

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

ESP32-s3_ساعت_آنلاین_انیمیشن

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

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

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

اسکچ به کتابخانه‌های زیر تکیه دارد:

#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 به برد ESP32-S3 متصل است، اما پایه داده هنوز باید در شِفر (کود) تعریف شود:

#define MATRIX_PIN 14

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

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

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

const char* WIFI_SSID     = "your WIFI";
const char* WIFI_PASSWORD = "passW0rd";

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

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

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

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

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

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

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

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

تنظیم خودکارBrightness روز / شب

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

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

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

اثر رنگین کمان

این پروژه از یک چرخ رنگ RGB کلاسیک استفاده می‌کند تا رنگ‌های رنگین‌کمانی روانی تولید کند. هر شخصیت با یک تغییر رنگ کمی متفاوت طراحی شده است و رنگ‌ها در طول زمان تغییر می‌کنند و یک انیمیشن رنگین‌کمانی جاری ایجاد می‌کنند.

// Helper to create Rainbow Colors
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) {
    return matrix.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if (WheelPos < 170) {
    WheelPos -= 85;
    return matrix.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return matrix.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

با حرکت متن، هر خصیصه در طیف RGB پیش می‌رود و اثر رنگین‌کمان مداومی ایجاد می‌کند که به‌ویژه بر روی صفحه نمایش کوچک ۸×۸ به طرز چشمگیری به نظر می‌رسد.

رفتار نمایش زمان و تاریخ

ساعت حافظه‌های جداگانه‌ای برای زمان و تاریخ نگه می‌دارد:

  • زمان: HH:MM
  • تاریخ: MMM DD(برای مثالJAN 08)

تاریخ در یک بازه ثابت نمایش داده می‌شود:

const uint32_t dateIntervalMs = 60000; // Show date every 1 minute

در پایان هر چرخه کامل اسکرول، شِفر (کود) تصمیم می‌گیرد که آیا به نمایش زمان ادامه دهد یا به تاریخ منتقل شود.

منطق اسکرول در یک ماتریس ۸×۸

به دلیل اینکه نمایشگر تنها 8 پیکسل عرض دارد، متن به آرامی از راست به چپ حرکت می‌کند. زمانی که متن کاملاً از صفحه خارج شد، نشانگر بازنشانی می‌شود و محتوای بعدی (زمان یا تاریخ) برای دور بعدی بارگذاری می‌شود.

مظاهرات

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

  • ESP32-S3 به شبکه Wi-Fi شما متصل می‌شود.
  • زمان از اینترنت همزمان‌سازی شده است
  • زمان به جلو می‌غلتدHH:MMفرمت
  • تاریخ به‌طور دوره‌ای نمایش داده می‌شود.
  • تمام متن با یک اثر رنگین کمان متحرک و نرم نمایش داده می‌شود.
  • نمایش به طور خودکار در شب کم نور می‌شود و در طول روز روشن‌تر می‌شود.

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

شِفر (کود) منبع کامل در زیر این مقاله ارائه شده است. ابزارها و منابع مفید، از جمله انتخابگر رنگ 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
872-ESP32-S3 RGB LED Matrix Internte Clock Project 5 - Rainbow Color
زبان: C++
/*
 * =====================================================================================
 * ESP32-S3 CLOCK - RAINBOW DATE & SOLID TIME - Project 5- RAINBOW MODE
 * =====================================================================================
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT842
 * Author: Gemini (AI Thought Partner) & Ahmad Shamshiri (Robojax.com)
 * Date: 07 Jan 2026

 * =====================================================================================
 * ESP32-S3 INTERNET RGB CLOCK - RAINBOW MODE

 * * FEATURES: 
 * - Full Rainbow: Time and Date use flowing rainbow colors.
 * - Auto-Brightness: Dims at night (22:00 to 06:00).
 * - Custom WiFi: Robust connection logic with retries.
 * =====================================================================================
 */

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

#define MATRIX_PIN 14

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

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

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

// --- INTERVALS & TRACKING ---
unsigned long lastDateShowMs = 0;
const uint32_t dateIntervalMs = 60000; // Show date every 1 minute
bool isShowingDate = false;

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";
char dateText[10] = "";
char currentDisplayText[12] = ""; 
int16_t scrollX = 8;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;
unsigned long lastTimeUpdateMs = 0;

// Helper to create Rainbow Colors
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return matrix.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return matrix.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return matrix.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

void updateClockData() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;
  
  // Update Time and Date strings
  snprintf(timeText, sizeof(timeText), "%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min);
  strftime(dateText, sizeof(dateText), "%b %d", &timeinfo);
  for (int i = 0; dateText[i]; i++) dateText[i] = toupper(dateText[i]);

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

void scrollDisplay() {
  matrix.fillScreen(0);
  
  int len = strlen(currentDisplayText);
  int16_t x = scrollX;

  // Draw each character with a shifting rainbow color
  for (int i = 0; i < len; i++) {
    uint8_t colorPos = (uint8_t)((i * 30) + (millis() / 5)); 
    matrix.setTextColor(Wheel(colorPos));
    matrix.setCursor(x + (i * 6), 0);
    matrix.print(currentDisplayText[i]);
  }

  matrix.show();
  scrollX--;

  int16_t textWidth = len * 6;
  if (scrollX < -textWidth) {
    scrollX = matrix.width();
    
    // Switch between Date and Time at end of cycle
    if (millis() - lastDateShowMs > dateIntervalMs) {
      strcpy(currentDisplayText, dateText);
      lastDateShowMs = millis();
      isShowingDate = true;
    } else {
      strcpy(currentDisplayText, timeText);
      isShowingDate = false;
    }
  }
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("\nESP32-S3 Rainbow Clock Initializing...");

  // 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());
  }

  // Configure time via NTP
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  Serial.println("Waiting for time...");
  delay(2000); // small wait for initial sync

  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(DAY_BRIGHTNESS);
  
  updateClockData();
  strcpy(currentDisplayText, timeText); // Load initial time
}

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

  // Update time digits and check brightness every second
  if (now - lastTimeUpdateMs >= 1000) {
    lastTimeUpdateMs = now;
    updateClockData(); 
  }

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

فایل‌ها📁

فایل فریزینگ