Search Code

ESP32-S3 RGB LED ম্যাট্রিক্স প্রজেক্ট ২ - স্ক্রলিং টেক্সট

ESP32-S3 RGB LED ম্যাট্রিক্স প্রজেক্ট ২ - স্ক্রলিং টেক্সট

প্রজেক্ট ২ – ESP32-S3 RGB LED ম্যাট্রিক্সে টেক্সট স্ক্রল

এই প্রজেক্টে আমরা ESP32-S3 RGB LED ম্যাট্রিক্সকে একটি ছোট টেক্সট ব্যানারে রূপান্তর করি। একটি সংক্ষিপ্ত বার্তা (উদাহরণস্বরূপ Robojax) 8×8 RGB ডিসপ্লে জুড়ে স্ক্রল হয়, এবং আপনি সহজেই কোডে সরাসরি টেক্সট, রঙ, উজ্জ্বলতা এবং স্ক্রল গতি পরিবর্তন করতে পারেন। এটি সাধারণ নোটিফিকেশন, নাম ট্যাগ বা ছোট স্ট্যাটাস বার্তার জন্য খুবই উপযোগী।

এই সিরিজের ছয়টি প্রজেক্টই একটি একক YouTube ভিডিওতে প্রদর্শিত এবং ব্যাখ্যা করা হয়েছে। একই ভিডিও এই পৃষ্ঠায় এমবেড করা আছে, তাই আপনি বাস্তব সময়ে টেক্সট স্ক্রল কেমন দেখায় এবং প্রতিটি সেটিং কীভাবে অ্যানিমেশনকে প্রভাবিত করে তা সঠিকভাবে দেখতে পারেন। এই প্রজেক্টের সম্পূর্ণ কোড নিবন্ধের নীচে স্বয়ংক্রিয়ভাবে লোড হয়, এবং আপনি কোড বিভাগের অধীনে তালিকাভুক্ত অ্যাফিলিয়েট স্টোর থেকে ESP32-S3 RGB LED ম্যাট্রিক্স মডিউল কিনতে পারেন।

এই প্রজেক্টটি প্রজেক্ট ১ (চলন্ত বিন্দু এবং রঙ নিয়ন্ত্রণ) এর মৌলিক বিষয়গুলির উপর ভিত্তি করে তৈরি এবং NeoMatrix লাইব্রেরি ব্যবহার করে টেক্সট রেন্ডারিং এবং স্ক্রলিং যোগ করে।

ESP32-S3 RGB LED ম্যাট্রিক্স মডিউল ওভারভিউ

হার্ডওয়্যারটি ছয়টি প্রজেক্টেই একই: Wi-Fi এবং ব্লুটুথ সহ একটি ESP32-S3 মাইক্রোকন্ট্রোলার, একটি 8×8 RGB LED ম্যাট্রিক্স (64টি অ্যাড্রেসযোগ্য RGB LED), একটি QMI8658C অ্যাক্সেলেরোমিটার, USB পোর্ট এবং অ্যাক্সেসযোগ্য IO পিন।

  • ESP32-S3 – উন্নত প্রজেক্টের জন্য Wi-Fi/BLE সহ প্রধান CPU।
  • 8×8 RGB ম্যাট্রিক্স – আইকন, টেক্সট এবং অ্যানিমেশনের জন্য 64টি RGB LED।
  • QMI8658C অ্যাক্সেলেরোমিটার – পরবর্তী প্রজেক্টে কাত এবং অভিযোজনের জন্য ব্যবহৃত হয়।
  • USB পোর্ট – Arduino IDE এর মাধ্যমে পাওয়ার এবং প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়।
  • উন্মুক্ত পিন – আপনাকে অন্যান্য IO-এর জন্য বোর্ডটিকে সাধারণ ESP32-এর মতো ব্যবহার করতে দেয়।
  • Boot / Reset বোতাম – ফার্মওয়্যার আপলোড এবং স্কেচ পুনরায় চালু করার জন্য।

প্রজেক্ট ২-এ আমরা মূলত ম্যাট্রিক্স এবং NeoMatrix টেক্সট ফাংশনের উপর ফোকাস করি। অ্যাক্সেলেরোমিটার এখনও ব্যবহার করা হয়নি, তবে একই বোর্ড পরবর্তী সমস্ত ইন্টারঅ্যাকশন এবং গেম প্রজেক্টও পরিচালনা করবে।

ভিডিওতে কভার করা প্রজেক্ট (টাইমস্ট্যাম্প)

এই নিবন্ধের সাথে যুক্ত ভিডিওটি ছয়টি প্রজেক্টই কভার করে। আনুমানিক টাইমস্ট্যাম্পগুলি হল:

  • 00:00 – ভূমিকা
  • 02:01 – ESP32 বোর্ড ইনস্টল করা
  • 03:32 – লাইব্রেরি ইনস্টল করা
  • 05:32 – প্রজেক্ট ১: চলন্ত বিন্দু
  • 11:11 – প্রজেক্ট ২: টেক্সট স্ক্রল
  • 12:59 – প্রজেক্ট ৩: HTTP টেক্সট
  • 16:41 – প্রজেক্ট ৪: কাত বিন্দু
  • 18:55 – প্রজেক্ট ৫: উপরের তীর
  • 20:02 – প্রজেক্ট ৬: টার্গেট গেম

এই নিবন্ধটি পড়ার সময় ভিডিওটি দেখতে উৎসাহিত করা হচ্ছে। এটি LED ম্যাট্রিক্সে লাইভ টেক্সট স্ক্রলিং দেখায় এবং Arduino IDE-তে সমস্ত ধাপ অতিক্রম করে।

Arduino IDE-তে ESP32 বোর্ড ইনস্টল করা

টেক্সট স্ক্রল কোড চালানোর আগে, নিশ্চিত করুন যে আপনার Arduino IDE-তে ESP32 সমর্থন ইনস্টল করা আছে:

  1. File > Preferences খুলুন এবং “Additional Boards Manager URLs”-তে ESP32 বোর্ড URL যোগ করুন।
  2. Tools > Board > Boards Manager…-এ যান, ESP32 অনুসন্ধান করুন এবং অফিসিয়াল ESP32 প্যাকেজ ইনস্টল করুন।
  3. Tools > Board থেকে আপনার ESP32-S3 RGB ম্যাট্রিক্স বোর্ড নির্বাচন করুন।
  4. USB-এর মাধ্যমে মডিউলটি সংযুক্ত করুন এবং Tools > Port-এর অধীনে সঠিক COM/সিরিয়াল পোর্ট চয়ন করুন।

বোর্ডের ধরন বা পোর্ট সঠিক না হলে, স্কেচ আপলোড হবে না।

NeoMatrix এবং প্রয়োজনীয় লাইব্রেরি ইনস্টল করা

টেক্সট স্ক্রলটি Adafruit NeoMatrix এবং এর নির্ভরতাগুলি ব্যবহার করে প্রয়োগ করা হয়েছে। ভিডিওতে, সেগুলি Library Manager-এর মাধ্যমে ইনস্টল করা হয়েছে।

আপনার প্রয়োজন হবে:

  • Adafruit NeoMatrix
  • Adafruit NeoPixel
  • Adafruit GFX Library
  1. Sketch > Include Library > Manage Libraries… খুলুন।
  2. Adafruit NeoMatrix অনুসন্ধান করুন এবং Install ক্লিক করুন।
  3. প্রম্পট করা হলে, নির্ভরতা হিসাবে Adafruit GFX এবং Adafruit NeoPixel ইনস্টল করার অনুমতি দিন।

ইনস্টলেশন সফল হলে, আপনার File > Examples > Adafruit NeoMatrix এবং File > Examples > Adafruit NeoPixel-এর অধীনে উদাহরণ স্কেচ দেখা উচিত।

প্রজেক্ট ২ – কোড সেটিংস (টেক্সট স্ক্রল)

সম্পূর্ণ টেক্সট স্ক্রল স্কেচটি ওয়েবসাইটে এই নিবন্ধের নীচে স্বয়ংক্রিয়ভাবে লোড হয়। এখানে আমরা কেবলমাত্র কনফিগারেশন মানগুলিতে ফোকাস করি যা আপনি সম্ভবত সম্পাদনা করতে চান: পিন, ম্যাট্রিক্স আকার, উজ্জ্বলতা, টেক্সট স্ট্রিং, রঙ, স্ক্রল গতি এবং ঐচ্ছিক দিক।

নীচের সমস্ত স্নিপেট স্কেচের শীর্ষে কনফিগারেশন বিভাগ থেকে নেওয়া হয়েছে যাতে আপনি মূল লজিক স্পর্শ না করে দ্রুত আচরণ সামঞ্জস্য করতে পারেন।

ম্যাট্রিক্স পিন এবং আকার

প্রজেক্ট ১-এর মতো, RGB ম্যাট্রিক্সটি GPIO 14-এর সাথে সংযুক্ত এবং 64টি LED (8×8) ধারণ করে। নিশ্চিত করুন যে এই দুটি লাইন আপনার মডিউলের সাথে মেলে:


 // 8×8 RGB ম্যাট্রিক্সের সাথে সংযুক্ত পিন 
const int MATRIX_PIN = 14; // এই মডিউলে অবশ্যই 14 হতে হবে // ম্যাট্রিক্স আকার (প্রস্থ এবং উচ্চতা)
 const int MATRIX_WIDTH = 8; 
const int MATRIX_HEIGHT = 8; 

আপনি যদি NeoMatrix লাইব্রেরি থেকে একটি উদাহরণ অনুলিপি করেন, তবে এটি একটি ভিন্ন পিন বা আকার ব্যবহার করতে পারে; এই বোর্ডের সাথে মেলাতে সর্বদা সেগুলি পরিবর্তন করুন।

টেক্সটের উজ্জ্বলতা

উজ্জ্বলতা সাধারণত 0 থেকে 255 এর মধ্যে একটি মান দিয়ে নিয়ন্ত্রিত হয়, যেখানে 0 বন্ধ এবং 255 সর্বোচ্চ উজ্জ্বলতা। একটি মাঝারি মান সাধারণত যথেষ্ট:


// সামগ্রিক ম্যাট্রিক্স উজ্জ্বলতা (0–255)
uint8_t matrixBrightness = 40; // আরামদায়ক ইনডোর উজ্জ্বলতা // In
setup():
matrix.setBrightness(matrixBrightness);

আপনি যদি প্যানেলটি উজ্জ্বল পরিবেশে বা অল্প সময়ের জন্য ব্যবহার করেন, তাহলে এই মান বাড়াতে পারেন, তবে ডিসপ্লের কাছাকাছি থাকলে খুব বেশি বাড়ানো এড়িয়ে চলুন।

স্ক্রল করার টেক্সট

প্রকৃত বার্তাটি একটি স্ট্রিং হিসেবে সংরক্ষিত থাকে। ভিডিওতে, উদাহরণ টেক্সটটি হলো Robojax। আপনি এটি আপনার পছন্দের যেকোনো ছোট লেবেল বা বার্তায় পরিবর্তন করতে পারেন:


 // 8×8 ম্যাট্রিক্সে স্ক্রল করার টেক্সট const char scrollText[] = "Robojax";
 // আপনার বার্তায় এটি পরিবর্তন করুন

মনে রাখবেন এটি শুধুমাত্র একটি 8×8 ম্যাট্রিক্স, তাই খুব দীর্ঘ বার্তা স্ক্রল করতে বেশি সময় নেবে এবং পড়া কঠিন হতে পারে।

টেক্সটের রঙ (RGB মান)

স্ক্রলিং টেক্সটের রঙ লাল, সবুজ এবং নীল উপাদান দ্বারা নির্ধারিত হয় (0–255)। উদাহরণস্বরূপ, খাঁটি লাল হলো (255, 0, 0), খাঁটি সবুজ হলো (0, 255, 0), এবং খাঁটি নীল হলো (0, 0, 255)। স্কেচে আপনি এরকম কিছু দেখতে পাবেন:


 // টেক্সটের রঙ (R, G, B) uint8_t textRed = 255; // লাল উপাদান uint8_t textGreen = 0; // সবুজ উপাদান uint8_t textBlue = 0; // নীল উপাদান

রঙ পরিবর্তন করতে:

  • হলুদ: textRed = 255; textGreen = 255; textBlue = 0;
  • সায়ান: textRed = 0; textGreen = 255; textBlue = 255;
  • সাদা: textRed = 255; textGreen = 255; textBlue = 255;

ভিডিওতে আরও দেখানো হয়েছে কীভাবে একটি অনলাইন কালার পিকার ব্যবহার করে RGB মান খুঁজে বের করে কোডে সেগুলি প্রবেশ করানো যায়।

স্ক্রল গতি (ফ্রেমের মধ্যে বিলম্ব)

স্ক্রল গতি প্রতিটি আপডেট ধাপের মধ্যে মিলিসেকেন্ডে একটি বিলম্ব মান দ্বারা নিয়ন্ত্রিত হয়। ছোট মান টেক্সটকে দ্রুত সরায়; বড় মান এটিকে ধীর করে দেয়। স্কেচে, আপনার এরকম একটি ভেরিয়েবল খুঁজে পাওয়া উচিত:


// স্ক্রল ধাপের মধ্যে বিলম্ব (মিলিসেকেন্ডে) int scrollDelayMs = 50;
// ছোট = দ্রুত, বড় = ধীর

উদাহরণ:

  • scrollDelayMs = 20; → দ্রুত স্ক্রলিং।
  • scrollDelayMs = 50; → মাঝারি গতি (ভিডিওর মতো)।
  • scrollDelayMs = 100; বা তার বেশি → ধীর, সহজে পড়া যায় এমন স্ক্রল।

loop() এর ভিতরে, টেক্সটের অবস্থান প্রতিবার পুনরায় আঁকার পরে এই মানটি একটি delay(scrollDelayMs); কলের মাধ্যমে ব্যবহৃত হয়।

স্ক্রল দিক (ঐচ্ছিক)

“বেসিক টেক্সট স্ক্রল” প্রকল্পে আমরা সাধারণত বাম দিকে স্ক্রল করি, তবে একটি প্রতীকী দিকনির্দেশ ভেরিয়েবল সংজ্ঞায়িত করা দরকারী যাতে আপনি পরে অন্যান্য দিক (বাম, ডান, উপরে, নিচে) নিয়ে পরীক্ষা করতে পারেন।

একটি সাধারণ প্যাটার্ন হলো:


 // স্ক্রল দিক নির্বাচক // 0 = বাম, 1 = ডান, 2 = উপরে, 3 = নিচে
int scrollDirection = 0; // ডিফল্ট: বাম দিকে স্ক্রল

মূল লুপ তারপর scrollDirection পরীক্ষা করে এবং নির্বাচিত দিকে টেক্সট সরায়। প্রজেক্ট 2 এর জন্য আপনি এটি 0 (বাম) এ রাখতে পারেন, তবে পরে যদি স্কেচটি বাড়ান তাহলে আপনি এরকম শর্ত যোগ করতে পারেন:


 if (scrollDirection == 0) {
// টেক্সট বামে সরান
} else if (scrollDirection == 1) {
// টেক্সট ডানে সরান
} else if (scrollDirection == 2) {
// টেক্সট উপরে সরান
} else if (scrollDirection == 3) {
// টেক্সট নিচে সরান
}

এই নিবন্ধের জন্য আমরা শুধুমাত্র সেটিংটি নথিভুক্ত করছি। সম্পূর্ণ বাস্তবায়ন নিবন্ধের নিচে লোড করা কোডের অংশ।

সারসংক্ষেপ

প্রজেক্ট 2 আপনার ESP32-S3 RGB LED ম্যাট্রিক্সকে একটি সহজ কিন্তু আকর্ষণীয় টেক্সট ডিসপ্লেতে রূপান্তরিত করে। কোডের শীর্ষে মাত্র কয়েকটি ভেরিয়েবল সম্পাদনা করে, আপনি দ্রুত পরিবর্তন করতে পারেন:

  • কোন বার্তাটি প্রদর্শিত হবে (scrollText)।
  • টেক্সটের রঙ (textRed, textGreen, textBlue)।
  • ম্যাট্রিক্সের উজ্জ্বলতা (matrixBrightness)।
  • স্ক্রলিংয়ের গতি (scrollDelayMs)।
  • স্ক্রলিংয়ের দিক (scrollDirection, যদি আপনি এটি ব্যবহার করতে চান)।

এই প্রকল্পের সম্পূর্ণ স্কেচটি এই নিবন্ধের নিচে উপলব্ধ (ওয়েবসাইট দ্বারা স্বয়ংক্রিয়ভাবে লোড করা হয়)। বিস্তারিত ধাপে ধাপে কনফিগারেশন এবং স্ক্রলিং টেক্সটের লাইভ প্রদর্শনের জন্য, ভিডিওটির সংশ্লিষ্ট অংশটি দেখতে ভুলবেন না। আপনি যদি প্রকল্পটি পছন্দ করেন এবং নিজে এটি তৈরি করতে চান, তাহলে কোডের নিচে তালিকাভুক্ত অ্যাফিলিয়েট লিংক থেকে ESP32-S3 RGB LED ম্যাট্রিক্স মডিউলটিও কিনতে পারেন।

ছবি

ESP32 S3 Matrix
ESP32 S3 Matrix
ESP32 S3 Matrix  pin out
ESP32 S3 Matrix pin out
ESP32-S3_RGB_8x8_matrix1
ESP32-S3_RGB_8x8_matrix1
ESP32-S3_RGB_8x8_matrix-2
ESP32-S3_RGB_8x8_matrix-2
ESP32-S3-Mtrix - Alway Up
ESP32-S3-Mtrix - Alway Up
800-ESP32-S3 RGB LED Matrix Project 2 - Scrolling Text
ভাষা: C++
/* 
  Project 2: Text scroll – ESP32-S3 RGB LED Matrix (Waveshare)

  This sketch displays the scrolling text on 8x8 matrix

  ▶️ Video Tutorial:
  https://youtu.be/JKLuYrRcLMI

  📚⬇️ Resources & Code Page:
  https://robojax.com/RJT829

  QMI8658_RGB_2
*/
#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

// -------- LED MATRIX SETUP --------
#define MATRIX_PIN    14
#define MATRIX_WIDTH  8
#define MATRIX_HEIGHT 8

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(
  MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_PIN,
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
  NEO_RGB + NEO_KHZ800
);

// =========================
// USER SETTINGS
// =========================

// Text to scroll
const char* MESSAGE = "ROBOJAX ";

// Brightness (0–255)
uint8_t BRIGHTNESS = 10;

// Scroll speed (milliseconds between steps)
// Smaller = faster
uint16_t SCROLL_DELAY = 80;

// Scroll direction
enum ScrollDir {
  SCROLL_LEFT,
  SCROLL_RIGHT,
  SCROLL_UP,
  SCROLL_DOWN
};

// Change this to set direction
ScrollDir DIRECTION = SCROLL_LEFT;

// Text color (set RGB here)
uint8_t COLOR_R = 255; 
uint8_t COLOR_G = 0;
uint8_t COLOR_B = 0;

// =========================
// INTERNAL STATE
// =========================
uint16_t textColor;
int16_t posX, posY;
int16_t textWidth, textHeight;
uint32_t lastStepTime = 0;

// Compute text size in pixels for default 5x7 font
void computeTextSize() {
  int16_t x1, y1;
  uint16_t w, h;
  matrix.getTextBounds((char*)MESSAGE, 0, 0, &x1, &y1, &w, &h);
  textWidth  = (int16_t)w;
  textHeight = (int16_t)h;
}

// Initialize starting position based on direction
void resetScrollPosition() {
  switch (DIRECTION) {
    case SCROLL_LEFT:
      // Start just off the right edge
      posX = matrix.width();
      posY = 0; // top row for 8x8
      break;

    case SCROLL_RIGHT:
      // Start just off the left edge
      posX = -textWidth;
      posY = 0;
      break;

    case SCROLL_UP:
      posX = 0;
      posY = matrix.height(); // start below bottom
      break;

    case SCROLL_DOWN:
      posX = 0;
      posY = -textHeight; // start above top
      break;
  }
}

// One scroll step
void stepScroll() {
  // Move position
  switch (DIRECTION) {
    case SCROLL_LEFT:
      posX--;
      if (posX < -textWidth) {
        posX = matrix.width();
      }
      break;

    case SCROLL_RIGHT:
      posX++;
      if (posX > matrix.width()) {
        posX = -textWidth;
      }
      break;

    case SCROLL_UP:
      posY--;
      if (posY < -textHeight) {
        posY = matrix.height();
      }
      break;

    case SCROLL_DOWN:
      posY++;
      if (posY > matrix.height()) {
        posY = -textHeight;
      }
      break;
  }

  // Draw frame
  matrix.fillScreen(0);
  matrix.setCursor(posX, posY);
  matrix.print(MESSAGE);
  matrix.show();
}

void setup() {
  matrix.begin();
  matrix.setBrightness(BRIGHTNESS);
  matrix.setTextWrap(false);       // No automatic wrapping
  matrix.setTextSize(1);           // Default 5x7 font
  textColor = matrix.Color(COLOR_R, COLOR_G, COLOR_B);
  matrix.setTextColor(textColor);

  computeTextSize();
  resetScrollPosition();

  matrix.fillScreen(0);
  matrix.show();
}

void loop() {
  uint32_t now = millis();
  if (now - lastStepTime >= SCROLL_DELAY) {
    lastStepTime = now;
    stepScroll();
  }
}

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

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

ফাইলসমূহ📁

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