کوډ ولټوئ

د ESP32-S3 RGB LED میټرکس انټرنیټ ساعت پروژه - 5 د رینبو رنګ

د ESP32-S3 RGB LED میټرکس انټرنیټ ساعت پروژه - 5 د رینبو رنګ

د ESP32-S3 انټرنیټ ساعت د رینبو رنګ اغېز سره

دا پروژه د ESP32-S3 RGB میټرکس انټرنیټ ساعت دی چې Wi-Fi سره نښلوي، د NTP سرور څخه محلي وخت همغږي کوي، او وخت په HH:MM بڼه کې د جوړ شوي 8×8 RGB NeoMatrix په اوږدو کې سکرول کوي. د جامد یا تصادفي رنګ نسخو برعکس، دا ساعت یو نرم رینبو رنګ اغېز کاروي، چیرې چې هر توری په دوامداره توګه د RGB طیف له لارې بدلیږي لکه څنګه چې سکرول کیږي. ساعت په دوره یي ډول نیټه هم ښیې او په اتوماتيک ډول د ورځې او شپې ترمنځ روښانتیا تنظیموي.

ESP32-s3_internet_clock_animation

دا ساعت څنګه کار کوي

یوځل چې د USB-C له لارې بریښنا شي، ESP32-S3 ستاسو د Wi-Fi شبکې سره نښلوي او د انټرنیټ څخه اوسنی محلي وخت ترلاسه کوي. ښودنه په نورمال ډول وخت سکرول کوي، مګر په ټاکلي وقفه کې د نیټې ښودلو ته اړوي. دواړه وخت او نیټه د متحرک رینبو اغیزې په کارولو سره وړاندې کیږي، چې په کوچني 8×8 میټرکس باندې یو ژوندی او متحرک ښودنه رامینځته کوي.

کارول شوي کتابتونونه

سکیچ په لاندې کتابتونونو تکیه کوي:

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

د Arduino Library Manager په کارولو سره Adafruit NeoMatrix نصب کړئ. د هغې انحصارونه، په شمول د Adafruit GFX Library او Adafruit NeoPixel، په اتوماتيک ډول نصب به شي.

مهمه کاروونکي تنظیم

د میټرکس ډیټا پن (جوړ شوی RGB میټرکس)

که څه هم RGB میټرکس د ESP32-S3 بورډ سره تړلی دی، د ډیټا پن باید لاهم په کوډ کې تعریف شي:

#define MATRIX_PIN 14

GPIO 14 په عمومي ډول د ESP32-S3 RGB میټرکس بورډونو کې کارول کیږي. که ستاسو د بورډ ډول مختلف پن کاروي، دا ارزښت تازه کړئ.

د Wi-Fi SSID او پاسورډ (د لویو او وړو تورو توپیر سره)

د Wi-Fi اسناد د خپل شبکې جزیاتو سره بدل کړئ:

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

مهم: د Wi-Fi SSIDs د لویو او وړو تورو توپیر لري. یو 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 آفسیټ په ثانیو کې (بېلګه: UTC-5 = -5 * 3600)
  • 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;

د ماښام 10 بجو او سهار 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 طیف له لارې پرمخ ځي، چې یو دوامداره رینبو اغېز رامینځته کوي چې په کوچني 8×8 ښودنه کې په ځانګړي ډول اغېزمن ښکاري.

د وخت او نیټې ښودنې چلند

ساعت د وخت او نیټې لپاره جلا بفرونه ساتي:

  • وخت: HH:MM
  • نیټه: MMM DD (د مثال په توګه JAN 08)

نیټه په ټاکلي وقفه کې ښودل کیږي:

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

د هر بشپړ سکرول دورې په پای کې، کوډ پریکړه کوي چې ایا د وخت ښودلو ته دوام ورکړي یا نیټې ته واړوي.

په 8×8 میټرکس کې د سکرول منطق

ځکه چې ښودنه یوازې 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();
  }
}

سرچینې او حوالې

فایلونه📁

Fritzing فایل