Search Code

የESP32-S3 RGB LED ማትሪክስ ፕሮጀክት 2 - የሚንቀሳቀስ ጽሑፍ

የESP32-S3 RGB LED ማትሪክስ ፕሮጀክት 2 - የሚንቀሳቀስ ጽሑፍ

ፕሮጀክት 2 – በESP32-S3 RGB LED ማትሪክስ ላይ የጽሑፍ ማንሸራተት

በዚህ ፕሮጀክት ውስጥ የESP32-S3 RGB LED ማትሪክስን ወደ ትንሽ የጽሑፍ ባነር እንለውጣለን። አጭር መልእክት (ለምሳሌ Robojax) በ8×8 RGB ማሳያ ላይ ይንሸራተታል፣ እና ጽሑፉን፣ ቀለሙን፣ ብሩህነቱን እና የማንሸራተት ፍጥነቱን በቀላሉ በኮዱ ውስጥ መቀየር ይችላሉ። ይህ ለቀላል ማሳወቂያዎች፣ የስም መለያዎች ወይም ትናንሽ የሁኔታ መልዕክቶች በጣም ጠቃሚ ነው።

በዚህ ተከታታይ ውስጥ ያሉት ስድስቱም ፕሮጀክቶች በአንድ የYouTube ቪዲዮ ውስጥ ተብራርተዋል። ተመሳሳዩ ቪዲዮ በዚህ ገጽ ላይ ተካቷል፣ ስለዚህ የጽሑፍ ማንሸራተት በእውነተኛ ጊዜ እንዴት እንደሚመስል እና እያንዳንዱ ቅንብር በእነማው ላይ እንዴት ተጽዕኖ እንደሚያሳድር በትክክል ማየት ይችላሉ። ለዚህ ፕሮጀክት የተሟላ ኮድ ከጽሑፉ በታች በራስ-ሰር ተጭኗል፣ እና የESP32-S3 RGB LED ማትሪክስ ሞጁሉን ከኮዱ ክፍል ስር ከተዘረዘሩት የተባባሪ መደብሮች መግዛት ይችላሉ።

ይህ ፕሮጀክት በፕሮጀክት 1 (የሚንቀሳቀስ ነጥብ እና የቀለም መቆጣጠሪያ) መሠረቶች ላይ ይገነባል እና የNeoMatrix ቤተ-መጽሐፍትን በመጠቀም የጽሑፍ አቀራረብ እና ማንሸራተት ይጨምራል።

የESP32-S3 RGB LED ማትሪክስ ሞጁል አጠቃላይ እይታ

ሃርድዌሩ በስድስቱም ፕሮጀክቶች ውስጥ ተመሳሳይ ነው፡- ከWi-Fi እና ብሉቱዝ ጋር የESP32-S3 ማይክሮ መቆጣጠሪያ፣ 8×8 RGB LED ማትሪክስ (64 አድራሻ ሊደረግባቸው የሚችሉ RGB LEDs)፣ QMI8658C አክስሌሮሜትር፣ USB ወደብ እና ተደራሽ የIO ፒኖች።

  • ESP32-S3 – ለላቁ ፕሮጀክቶች ከWi-Fi/BLE ጋር ዋና ሲፒዩ።
  • 8×8 RGB ማትሪክስ – ለአዶዎች፣ ጽሑፍ እና እነማዎች 64 RGB LEDs።
  • QMI8658C አክስሌሮሜትር – በኋለኞቹ ፕሮጀክቶች ለማዘንበል እና አቅጣጫ ለመወሰን ይጠቅማል።
  • USB ወደብ – በArduino IDE በኩል ለኃይል እና ለፕሮግራም አወጣጥ ይጠቅማል።
  • የተጋለጡ ፒኖች – ለሌላ IO ቦርዱን እንደ መደበኛ ESP32 እንዲጠቀሙ ያስችሉዎታል።
  • Boot / Reset አዝራሮች – ለፈርምዌር ሰቀላ እና ስኬቾችን እንደገና ለማስጀመር።

በፕሮጀክት 2 ውስጥ በዋናነት በማትሪክስ እና በNeoMatrix የጽሑፍ ተግባራት ላይ እናተኩራለን። አክስሌሮሜትሩ ገና ጥቅም ላይ አልዋለም፣ ነገር ግን ተመሳሳዩ ቦርድ ሁሉንም የኋላ መስተጋብር እና የጨዋታ ፕሮጀክቶችን ይይዛል።

በቪዲዮው ውስጥ የተካተቱ ፕሮጀክቶች (የጊዜ ማህተሞች)

ከዚህ ጽሑፍ ጋር የሚሄደው ቪዲዮ ስድስቱንም ፕሮጀክቶች ይሸፍናል። ግምታዊ የጊዜ ማህተሞች፡-

  • 00:00 – መግቢያ
  • 02:01 – የESP32 ቦርዶችን መጫን
  • 03:32 – ቤተ-መጻሕፍትን መጫን
  • 05:32 – ፕሮጀክት 1፡ የሚንቀሳቀስ ነጥብ
  • 11:11 – ፕሮጀክት 2፡ የጽሑፍ ማንሸራተት
  • 12:59 – ፕሮጀክት 3፡ HTTP ጽሑፍ
  • 16:41 – ፕሮጀክት 4፡ የማዘንበል ነጥብ
  • 18:55 – ፕሮጀክት 5፡ ወደ ላይ ቀስት
  • 20:02 – ፕሮጀክት 6፡ ዒላማ ጨዋታ

ይህን ጽሑፍ እያነበቡ ቪዲዮውን እንዲመለከቱ ይበረታታሉ። ጽሑፉ በLED ማትሪክስ ላይ በቀጥታ ሲንሸራተት ያሳያል እና በArduino IDE ውስጥ ያሉትን ሁሉንም ደረጃዎች ይመራል።

በArduino IDE ውስጥ የESP32 ቦርዶችን መጫን

የጽሑፍ ማንሸራተት ኮድን ከማስኬድዎ በፊት የESP32 ድጋፍ በArduino IDE ውስጥ መጫኑን ያረጋግጡ፡-

  1. File > Preferences ን ይክፈቱ እና የESP32 ቦርዶችን URL ወደ “Additional Boards Manager URLs” ያክሉ።
  2. ወደ Tools > Board > Boards Manager… ይሂዱ፣ ESP32 ን ይፈልጉ እና ኦፊሴላዊውን የESP32 ፓኬጅ ይጫኑ።
  3. የESP32-S3 RGB ማትሪክስ ቦርድዎን ከTools > Board ይምረጡ።
  4. ሞጁሉን በUSB ያገናኙ እና በTools > Port ስር ትክክለኛውን የCOM/ሰሪያል ወደብ ይምረጡ።

የቦርድ አይነት ወይም ወደብ ትክክል ካልሆነ፣ ስኬቹ አይሰቀልም።

NeoMatrix እና አስፈላጊ ቤተ-መጻሕፍትን መጫን

የጽሑፍ ማንሸራተት የሚተገበረው Adafruit NeoMatrix እና ጥገኞቹን በመጠቀም ነው። በቪዲዮው ውስጥ በቤተ-መጻሕፍት አስተዳዳሪ በኩል ተጭነዋል።

የሚከተሉትን ያስፈልግዎታል፡-

  • 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 ስር የምሳሌ ስኬቾችን ማየት ይኖርዎታል።

ፕሮጀክት 2 – የኮድ ቅንብሮች (የጽሑፍ ማንሸራተት)

ሙሉው የጽሑፍ ማንሸራተት ስኬች በድረ-ገጹ ላይ ከዚህ ጽሑፍ በታች በራስ-ሰር ተጭኗል። እዚህ ላይ የሚያርትዑትን የውቅር እሴቶች ላይ ብቻ እናተኩራለን፡- ፒን፣ የማትሪክስ መጠን፣ ብሩህነት፣ የጽሑፍ ሕብረቁምፊ፣ ቀለም፣ የማንሸራተት ፍጥነት እና አማራጭ አቅጣጫ።

ከዚህ በታች ያሉት ሁሉም ቁርጥራጮች ዋናውን አመክንዮ ሳይነኩ ባህሪውን በፍጥነት ማስተካከል እንዲችሉ ከስኬቹ አናት ላይ ካለው የውቅር ክፍል የተወሰዱ ናቸው።

የማትሪክስ ፒን እና መጠን

ልክ እንደ ፕሮጀክት 1፣ የRGB ማትሪክስ ከGPIO 14 ጋር የተገናኘ እና 64 LEDs (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; // ምቹ የቤት ውስጥ ብሩህነት // በ 
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; // ነባሪ፡ ወደ ግራ ማሽከርከር 

ዋናው loop ከዚያ scrollDirectionን ይፈትሻል እና ጽሑፉን በተመረጠው አቅጣጫ ያንቀሳቅሳል። ለፕሮጀክት 2 በ0 (ግራ) መተው ይችላሉ፣ ነገር ግን በኋላ ስኬቹን ካራዘሙት እንደዚህ ያሉ ሁኔታዎችን ማከል ይችላሉ፦


 if (scrollDirection == 0) { 
// ጽሑፍን ወደ ግራ አንቀሳቅስ 
} else if (scrollDirection == 1) { 
// ጽሑፍን ወደ ቀኝ አንቀሳቅስ 
} else if (scrollDirection == 2) { 
// ጽሑፍን ወደ ላይ አንቀሳቅስ
 } else if (scrollDirection == 3) { 
// ጽሑፍን ወደ ታች አንቀሳቅስ 
}
 

ለዚህ ጽሑፍ ቅንብሩን ብቻ እንመዘግባለን። ሙሉ አተገባበሩ ከጽሑፉ በታች በተጫነው ኮድ ውስጥ አካል ነው።

ማጠቃለያ

ፕሮጀክት 2 የእርስዎን ESP32-S3 RGB LED ማትሪክስ ወደ ቀላል ግን ዓይንን የሚስብ የጽሑፍ ማሳያ ይለውጠዋል። በኮዱ መጀመሪያ ላይ ጥቂት ተለዋዋጮችን በማርትዕ ብቻ በፍጥነት መቀየር ይችላሉ፦

  • የትኛው መልእክት እንደሚታይ (scrollText)።
  • የጽሑፉ ቀለም (textRedtextGreentextBlue)።
  • የማትሪክሱ ብሩህነት (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();
  }
}

እንደሚያስፈልግዎት ይችላል

ምንጮች እና ምንጮች

ፋይሎች📁

ፍሪትዚንግ ፋይል