Search Code

ESP32-S3 RGB LED ম্যাট্রিক্স ইন্টারনেট ক্লক প্রজেক্ট - ২ ক্লক মাল্টি কালার সময় ও তারিখ ডিসপ্লে

ESP32-S3 RGB LED ম্যাট্রিক্স ইন্টারনেট ক্লক প্রজেক্ট - ২ ক্লক মাল্টি কালার সময় ও তারিখ ডিসপ্লে

ESP32-S3 RGB নিওম্যাট্রিক্স ইন্টারনেট ঘড়ি সময় ও তারিখ প্রদর্শন সহ

এই প্রকল্পটি একটি উন্নত ESP32-S3 RGB ম্যাট্রিক্স ইন্টারনেট ঘড়ি যা শুধু বর্তমান সময় দেখায় না, পর্যায়ক্রমে তারিখও প্রদর্শন করে। ESP32-S3 Wi-Fi-এর সাথে সংযুক্ত হয়, NTP সার্ভার থেকে সময় সিঙ্ক্রোনাইজ করে, এবং একটি 8×8 RGB নিওম্যাট্রিক্স জুড়ে HH:MM বা তারিখ (উদাহরণস্বরূপ SEP 21) স্ক্রল করে। ডিসপ্লেটি স্বয়ংক্রিয় দিন/রাতের উজ্জ্বলতা নিয়ন্ত্রণ এবং কাস্টমাইজযোগ্য RGB রঙ সমর্থন করে।

ESP32-s3_internet_clock_animation

এই ঘড়িটি কী করে

আপনার Wi-Fi নেটওয়ার্কে সংযুক্ত হওয়ার পরে, ESP32-S3 ইন্টারনেট থেকে বর্তমান স্থানীয় সময় আনে। ঘড়িটি সাধারণত সময় স্ক্রল করে, কিন্তু একটি নির্দিষ্ট ব্যবধানে এটি তারিখ দেখাতে স্যুইচ করে। পাঠ্যের রঙ একটি নির্দিষ্ট রঙে স্থির করা যেতে পারে বা একাধিক ব্যবহারকারী-সংজ্ঞায়িত রঙের মাধ্যমে স্বয়ংক্রিয়ভাবে ঘোরানো যেতে পারে। রাতে উজ্জ্বলতা স্বয়ংক্রিয়ভাবে কমিয়ে দেওয়া হয় যাতে ডিসপ্লেটি চোখের জন্য আরামদায়ক হয়।

ব্যবহৃত লাইব্রেরি

এই স্কেচটি নিম্নলিখিত লাইব্রেরিগুলির উপর নির্ভর করে:

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

Arduino লাইব্রেরি ম্যানেজার থেকে Adafruit NeoMatrix ইনস্টল করুন। Adafruit GFX Library এবং Adafruit NeoPixel-এর মতো সমস্ত প্রয়োজনীয় নির্ভরতা স্বয়ংক্রিয়ভাবে ইনস্টল হয়ে যাবে।

গুরুত্বপূর্ণ ব্যবহারকারী কনফিগারেশন

Wi-Fi SSID এবং পাসওয়ার্ড (কেস-সংবেদনশীল)

আপনাকে অবশ্যই Wi-Fi শংসাপত্রগুলি আপনার নিজের নেটওয়ার্ক তথ্য দিয়ে প্রতিস্থাপন করতে হবে:

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

গুরুত্বপূর্ণ: Wi-Fi SSID গুলি কেস-সংবেদনশীল। উদাহরণস্বরূপ, "Book" নামের একটি SSID "book"-এর মতো নয়। যদি বড় হাতের অক্ষরটি হুবহু মিলে না যায়, তাহলে ESP32 সংযোগ করতে ব্যর্থ হবে।

NTP সার্ভার, সময় অঞ্চল এবং ডেলাইট সেভিং

ঘড়িটি একটি ইন্টারনেট সময় সার্ভার ব্যবহার করে:

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

স্থানীয় সময় এই অফসেটগুলি ব্যবহার করে গণনা করা হয়:

const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec: আপনার UTC অফসেট সেকেন্ডে (উদাহরণ: UTC-5 = -5 * 3600)
  • daylightOffset_sec: DST-এর জন্য 3600 ব্যবহার করুন বা DST ব্যবহার না হলে 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] = {
  {17, 43, 171},  // হালকা নীল
  {255, 0, 0},    // লাল
  {0, 255, 0},    // সবুজ
  {255, 165, 0},  // কমলা
  {255, 0, 255}   // ম্যাজেন্টা
};

প্রতিটি রঙ RGB (লাল, সবুজ, নীল) মান ব্যবহার করে যা 0 থেকে 255 পর্যন্ত। এই সংখ্যাগুলি পরিবর্তন করে, আপনি ডিসপ্লের জন্য প্রায় যেকোনো রঙ তৈরি করতে পারেন। যদি useFixedColor true-তে সেট করা থাকে, তাহলে ঘড়িটি সর্বদা একটি রঙ ব্যবহার করে। যদি false-তে সেট করা থাকে, তাহলে প্রতিটি সম্পূর্ণ স্ক্রলের পরে রঙ স্বয়ংক্রিয়ভাবে পরিবর্তিত হয়।

যেকোনো রঙের জন্য সঠিক RGB মান দ্রুত খুঁজে পেতে, RGB কালার পিকার টুল কালার পিকার ব্যবহার করুন।

সময় এবং তারিখ ফরম্যাটিং

সময়টি HH:MM হিসাবে ফরম্যাট করা হয় এবং একটি ছোট ক্যারেক্টার বাফারে সংরক্ষিত থাকে। তারিখটি একটি বড় হাতের স্ট্রিং হিসাবে ফরম্যাট করা হয় যেমন SEP 21। ডিসপ্লেটি একটি নির্দিষ্ট ব্যবধানে স্বয়ংক্রিয়ভাবে সময় এবং তারিখের মধ্যে স্যুইচ করে।

8×8 ডিসপ্লেতে স্ক্রলিং লজিক

যেহেতু একটি 8×8 ম্যাট্রিক্স একবারে সম্পূর্ণ পাঠ্য দেখানোর জন্য খুব ছোট, তাই স্কেচটি পাঠ্যটি অনুভূমিকভাবে স্ক্রল করে। একবার পাঠ্যটি সম্পূর্ণরূপে ডিসপ্লে ছেড়ে গেলে, রঙ আপডেট হয় এবং প্রয়োজনে সামগ্রীটি সময় এবং তারিখের মধ্যে স্যুইচ করে।

প্রদর্শন

স্কেচটি আপলোড করার পরে:

  • ESP32 Wi-Fi-এর সাথে সংযুক্ত হয়
  • সময় ইন্টারনেট থেকে সিঙ্ক্রোনাইজ হয়
  • বর্তমান সময় ম্যাট্রিক্স জুড়ে স্ক্রল হয়
  • তারিখ পর্যায়ক্রমে প্রদর্শিত হয়
  • উজ্জ্বলতা দিন এবং রাতের জন্য স্বয়ংক্রিয়ভাবে সামঞ্জস্য হয়

ডাউনলোড এবং লিংক

সম্পূর্ণ সোর্স কোড এই নিবন্ধের নীচে দেওয়া হয়েছে। যন্ত্রাংশ, সরঞ্জাম এবং ডেটাশিটের লিংকও এই নিবন্ধের নীচে উপলব্ধ।

ছবি

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
869-ESP32-S3 RGB LED Matrix Internte Clock Project 2 - Multi Color with Date
ভাষা: C++
/*
 * =====================================================================================
 * ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 2
 Multi color
 * =====================================================================================
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT839
 * Author:  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 when text finishes a full scroll.
 * 3. Auto-Brightness: Dims the LEDs during night hours (User-configurable).
 * 4. Periodic Date: Scrolls the date (e.g., "JAN 07") every 2 minutes.
 * * USER CONFIGURATION GUIDE:
 * -------------------------
 * - WiFi: Change 'WIFI_SSID' and 'WIFI_PASSWORD' to your local network.
 * - Colors: Add or remove {R, G, B} sets in the 'userColors' array.
 * - Night Mode: Adjust 'NIGHT_START_HOUR' and 'NIGHT_BRIGHTNESS'.
 * =====================================================================================
 */

#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; 
const int NIGHT_END_HOUR = 6;

// --- 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]);

// --- DATE/TIME INTERVALS ---
unsigned long lastDateShowMs = 0;
const uint32_t dateIntervalMs = 30000; // 2 minutes
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";
char dateText[10] = "";
char currentDisplayText[12] = ""; 
int16_t scrollX = 8;


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

void updateTimeAndDate() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;
  
  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]);

  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);
  
  // FIXED LOGIC: Uses currentColorIndex which only changes at the end of a scroll
  int idx = useFixedColor ? fixedColorIndex : currentColorIndex;
  matrix.setTextColor(matrix.Color(userColors[idx][0], userColors[idx][1], userColors[idx][2]));

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

  scrollX--;

  int16_t textWidth = strlen(currentDisplayText) * 6;
  
  // THE TRIGGER POINT: This happens only when text is fully off-screen
  if (scrollX < -textWidth) {
    scrollX = matrix.width(); 
    
    // 1. Cycle the color now and only now
    if (!useFixedColor) {
      currentColorIndex = (currentColorIndex + 1) % totalColors;
    }

    // 2. Decide whether to switch between Time and Date
    if (millis() - lastDateShowMs > dateIntervalMs) {
      strcpy(currentDisplayText, dateText);
      lastDateShowMs = millis();
    } else {
      strcpy(currentDisplayText, timeText);
    }
  }
}

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);
  
  updateTimeAndDate();
  strcpy(currentDisplayText, timeText); 
}

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

  if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
    lastTimeUpdateMs = now;
    updateTimeAndDate(); 
  }

  if (now - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = now;
    scrollDisplay();
  }
}

আপনাকে যা প্রয়োজন হতে পারে

সম্পদ ও রেফারেন্সসমূহ

ফাইলসমূহ📁

ফ্রিটজিং ফাইল