ماژول نمایشگر ماتریس نقطه‌ای ۸x۸

با درایور MAX7219 (تک رنگ)

معرفی ماژول ماتریس ۸x۸ MAX7219

ماژول نمایشگر ماتریس نقطه‌ای ۸x۸ با درایور MAX7219 یک نمایشگر LED ماتریسی با کنترل آسان و امکانات پیشرفته است که امکان نمایش کاراکترها، اعداد، اشکال و انیمیشن‌های ساده را فراهم می‌کند. این ماژول با رابط SPI ساده و کتابخانه‌های گسترده، محبوب‌ترین انتخاب برای پروژه‌های نمایشی است.

مشخصات کلی

ویژگی‌های کلیدی:

  • رزولوشن: ۸x۶۴ پیکسل (۸ ماژول ۸x۸ به صورت سری)

  • رنگ LED: قرمز (آبی، سبز و دو رنگ نیز موجود است)

  • درایور: MAX7219 یا MAX7221

  • رابط: SPI 3 سیمه (DIN, CLK, CS)

  • ولتاژ تغذیه: ۵V DC

  • جریان مصرف: ۱۵۰-۵۰۰mA (بسته به روشنایی)

مشخصات فنی جامع

مشخصات نمایشگر:

  • تعداد LED: ۶۴ عدد LED در هر ماژول

  • اندازه LED: ۳mm یا ۵mm (بسته به مدل)

  • فاصله پیکسل: ۳٫۰mm یا ۳٫۷۵mm

  • ابعاد فعال: ۲۴×۲۴mm تا ۳۰×۳۰mm

  • روشنایی: ۸۰-۲۰۰ mcd بسته به رنگ

  • زاویه دید: ۱۲۰ درجه

مشخصات درایور MAX7219:

  • فرکانس کلاک: تا ۱۰MHz

  • پیکربندی: ۸ سگمنت × ۸ رقم

  • کنترل روشنایی: ۱۶ سطح دیجیتال

  • حالت‌های تست: تست تمام LEDها

  • کنترل مصرف: حالت خواب (Shutdown)

  • رمزگشایی: داخلی برای ۷ سگمنت

مشخصات الکتریکی:

  • ولتاژ تغذیه: ۵V ±۵٪

  • ولتاژ منطقی: ۳٫۳V یا ۵V (سازگار)

  • جریان هر LED: ۲۰mA (پیک ۴۰mA)

  • جریان کل: تا ۵۰۰mA در روشنایی ماکزیمم

  • توان مصرفی: ۲٫۵W در حالت کامل

مشخصات فیزیکی:

  • ابعاد PCB: ۳۲×۳۲mm تا ۵۰×۵۰mm

  • ضخامت: ۱۰-۱۵mm (با LED)

  • پین‌های اتصال: ۵ پین (VCC, GND, DIN, CLK, CS)

  • کانکتور‌ها: هدر ۲٫۵۴mm نری/ماده

  • وزن: ۱۰-۱۵ گرم

ساختار داخلی و پین‌ها

پین‌های ماژول:

    دید از پشت (سمت اتصالات):
    
    ┌─────────────────────┐
    │                     │
    │  ○   ○   ○   ○   ○  │
    │                     │
    │  VCC DIN CS  CLK GND│
    │                     │
    └─────────────────────┘
    
    یا در برخی مدل‌ها:
    
    ┌─────────────────────┐
    │                     │
    │  ○   ○   ○   ○   ○  │
    │                     │
    │  GND DIN CS  CLK VCC│
    │                     │
    └─────────────────────┘

اتصال زنجیره‌ای (Daisy Chain):

آردوینو ← [ماژول ۱] ← [ماژول ۲] ← [ماژول ۳] ← ...
           DIN→DOUT   DIN→DOUT   DIN→DOUT
           
نحوه اتصال:
آردوینو.MOSI → ماژول۱.DIN
آردوینو.SCK  → ماژول۱.CLK
آردوینو.SS   → ماژول۱.CS
ماژول۱.DOUT → ماژول۲.DIN (و ادامه...)

عملکرد MAX7219

ثبات‌های داخلی:

ثبات‌های آدرس‌دهی:
0x0X: رقم ۱-۸ (X=1 تا 8)
0x09: رمزگشایی
0x0A: روشنایی
0x0B: اسکن لیمیت
0x0C: حالت شات‌داون
0x0F: تست نمایشگر

کنترل روشنایی:

// ۱۶ سطح روشنایی:
// 0xX0 تا 0xXF (X=0 تا F)
// 0 = کمترین، F = بیشترین روشنایی

void setBrightness(int level) {
    level = constrain(level, 0, 15);
    writeRegister(0x0A, level);
}

کاربردهای اصلی

۱. نمایش اطلاعات ساده:

  • نمایش اعداد و حروف

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

  • نمایش دمای محیط

  • نشانگر سطح (Level Indicator)

۲. انیمیشن و گرافیک:

  • انیمیشن‌های ساده

  • نمایش ایموجی‌ها

  • بازی‌های ساده (مثل اسنیک)

  • نمایش نمودارهای ساده

۳. سیستم‌های اطلاع‌رسانی:

  • تابلوهای اعلانات

  • سیستم‌های هشدار

  • نشانگر وضعیت

  • نمایش پیام‌های متحرک

۴. پروژه‌های آموزشی:

  • آموزش برنامه‌نویسی گرافیکی

  • آموزش الگوریتم‌های نمایش

  • پروژه‌های دانشگاهی

  • کارگاه‌های الکترونیک

کتابخانه‌های پشتیبانی شده

برای آردوینو:

// ۱. کتابخانه LedControl
#include <LedControl.h>
LedControl lc = LedControl(12, 11, 10, 1);

// ۲. کتابخانه MaxMatrix
#include <MaxMatrix.h>
MaxMatrix m(12, 11, 10, 1);

// ۳. کتابخانه MD_MAX72xx (پیشرفته)
#include <MD_MAX72xx.h>
MD_MAX72xx mx = MD_MAX72xx(HARDWARE_TYPE, 12, 11, 10, 1);

برای پایتون (رزبری‌پای):

# کتابخانه luma.led_matrix
from luma.led_matrix.device import max7219
from luma.core.interface.serial import spi, noop
from luma.core.render import canvas

# کتابخانه Adafruit_CircuitPython_MAX7219
import board
import digitalio
import adafruit_max7219

برای میکروپایتون:

from max7219 import Matrix8x8
from machine import Pin, SPI

spi = SPI(1, baudrate=10000000, polarity=0, phase=0)
display = Matrix8x8(spi, Pin(15), 1)

برنامه‌نویسی پایه

راه‌اندازی اولیه:

#include <LedControl.h>

// پین‌ها: DIN, CLK, CS, تعداد ماژول‌ها
LedControl lc = LedControl(12, 11, 10, 1);

void setup() {
    // روشن کردن نمایشگر
    lc.shutdown(0, false);
    
    // تنظیم روشنایی متوسط
    lc.setIntensity(0, 8);
    
    // پاک کردن نمایشگر
    lc.clearDisplay(0);
}

نمایش یک پیکسل:

void setPixel(int x, int y, bool state) {
    // محدودیت‌های x و y بین ۰ تا ۷
    x = constrain(x, 0, 7);
    y = constrain(y, 0, 7);
    
    // ستون‌ها از ۰ تا ۷، سطرها از ۰ تا ۷
    lc.setLed(0, x, y, state);
}

نمایش یک کاراکتر:

// آرایه بیت‌مپ برای کاراکترها
byte charA[8] = {
    B00111100,
    B01100110,
    B01100110,
    B01111110,
    B01100110,
    B01100110,
    B01100110,
    B00000000
};

void displayChar(byte bitmap[8]) {
    for(int row = 0; row < 8; row++) {
        lc.setRow(0, row, bitmap[row]);
    }
}

اسکرول متن:

void scrollText(String text, int delayTime) {
    int length = text.length();
    
    for(int i = 0; i < length * 8; i++) {
        lc.clearDisplay(0);
        
        // محاسبه موقعیت نمایش
        int position = i;
        
        // نمایش بخشی از متن
        displayTextSegment(text, position);
        
        delay(delayTime);
    }
}

مثال‌های پیشرفته

۱. نمایش دماسنج:

class TemperatureDisplay {
private:
    float temperature;
    LedControl* display;
    
public:
    TemperatureDisplay(LedControl* lc) {
        display = lc;
    }
    
    void updateTemperature(float temp) {
        temperature = temp;
        displayTemperature();
    }
    
    void displayTemperature() {
        display->clearDisplay(0);
        
        // نمایش عدد
        String tempStr = String(int(temperature));
        for(int i = 0; i < tempStr.length(); i++) {
            displayChar(tempStr[i], i);
        }
        
        // نمایش درجه سانتیگراد
        displayDegreeSymbol();
        
        // نمایش گراف دمایی
        displayTemperatureGraph();
    }
    
    void displayTemperatureGraph() {
        // نمایش نوار دمایی
        int level = map(temperature, 0, 50, 0, 8);
        for(int y = 0; y < level; y++) {
            display->setLed(0, 7, y, true);
        }
    }
};

۲. ساعت دیجیتال:

class MatrixClock {
private:
    int hours;
    int minutes;
    int seconds;
    LedControl* display;
    
public:
    MatrixClock(LedControl* lc) {
        display = lc;
    }
    
    void updateTime(int h, int m, int s) {
        hours = h;
        minutes = m;
        seconds = s;
        displayTime();
    }
    
    void displayTime() {
        display->clearDisplay(0);
        
        // نمایش ساعت
        displayNumber(hours / 10, 0);
        displayNumber(hours % 10, 2);
        
        // نمایش دونقطه چشمک‌زن
        static bool colonState = false;
        if(seconds % 2 == 0) {
            displayColon(colonState);
            colonState = !colonState;
        }
        
        // نمایش دقیقه
        displayNumber(minutes / 10, 4);
        displayNumber(minutes % 10, 6);
    }
    
    void displayNumber(int num, int position) {
        byte numbers[10][8] = {
            // تعریف بیت‌مپ اعداد ۰-۹
        };
        
        for(int row = 0; row < 8; row++) {
            display->setRow(0, position, numbers[num][row]);
        }
    }
};

۳. بازی ساده اسنیک:

class SnakeGame {
private:
    struct Point {
        int x;
        int y;
    };
    
    Point snake[64];
    int length;
    Point food;
    int direction; // 0=up, 1=right, 2=down, 3=left
    
public:
    void init() {
        length = 3;
        snake[0] = {4, 4};
        snake[1] = {4, 5};
        snake[2] = {4, 6};
        direction = 0;
        generateFood();
    }
    
    void update() {
        // حرکت مار
        Point newHead = snake[0];
        
        switch(direction) {
            case 0: newHead.y--; break;
            case 1: newHead.x++; break;
            case 2: newHead.y++; break;
            case 3: newHead.x--; break;
        }
        
        // بررسی برخورد با دیوار
        if(newHead.x < 0 || newHead.x > 7 ||
           newHead.y < 0 || newHead.y > 7) {
            gameOver();
            return;
        }
        
        // بررسی برخورد با خود
        for(int i = 0; i < length; i++) {
            if(snake[i].x == newHead.x && 
               snake[i].y == newHead.y) {
                gameOver();
                return;
            }
        }
        
        // جابه‌جایی مار
        for(int i = length; i > 0; i--) {
            snake[i] = snake[i-1];
        }
        snake[0] = newHead;
        
        // بررسی غذا خوردن
        if(newHead.x == food.x && newHead.y == food.y) {
            length++;
            generateFood();
        }
    }
    
    void render(LedControl& lc) {
        lc.clearDisplay(0);
        
        // نمایش مار
        for(int i = 0; i < length; i++) {
            lc.setLed(0, snake[i].x, snake[i].y, true);
        }
        
        // نمایش غذا
        lc.setLed(0, food.x, food.y, true);
    }
};

اتصال چند ماژول به صورت سری

کنترل ۴ ماژول ۸x۸ (ماتریس ۸x۳۲):

#include <LedControl.h>

// اتصال ۴ ماژول به صورت سری
LedControl lc = LedControl(12, 11, 10, 4);

void setup() {
    for(int i = 0; i < 4; i++) {
        lc.shutdown(i, false);
        lc.setIntensity(i, 8);
        lc.clearDisplay(i);
    }
}

void displayAcrossModules(String text) {
    // نمایش متن در عرض ۴ ماژول
    int charWidth = 6; // عرض هر کاراکتر
    
    for(int pos = 0; pos < text.length() * charWidth; pos++) {
        for(int module = 0; module < 4; module++) {
            int moduleOffset = module * 8;
            displayTextSegment(text, pos - moduleOffset, module);
        }
        delay(100);
    }
}

ماتریس ۱۶x۱۶ (۴ ماژول):

class Matrix16x16 {
private:
    LedControl* lc;
    
public:
    Matrix16x16(LedControl* display) {
        lc = display;
    }
    
    void setPixel16(int x, int y, bool state) {
        // تعیین ماژول و موقعیت نسبی
        int moduleX = x / 8;
        int moduleY = y / 8;
        int moduleIndex = moduleY * 2 + moduleX;
        
        int localX = x % 8;
        int localY = y % 8;
        
        lc->setLed(moduleIndex, localX, localY, state);
    }
    
    void displayImage16x16(uint16_t image[16]) {
        for(int y = 0; y < 16; y++) {
            for(int x = 0; x < 16; x++) {
                bool pixel = (image[y] >> (15 - x)) & 1;
                setPixel16(x, y, pixel);
            }
        }
    }
};

بهینه‌سازی عملکرد

۱. استفاده از بافر گرافیکی:

class GraphicsBuffer {
private:
    byte buffer[8];
    LedControl* display;
    
public:
    GraphicsBuffer(LedControl* lc) {
        display = lc;
        clear();
    }
    
    void clear() {
        memset(buffer, 0, sizeof(buffer));
    }
    
    void setPixel(int x, int y, bool state) {
        if(x >= 0 && x < 8 && y >= 0 && y < 8) {
            if(state) {
                buffer[y] |= (1 << (7 - x));
            } else {
                buffer[y] &= ~(1 << (7 - x));
            }
        }
    }
    
    void render() {
        for(int row = 0; row < 8; row++) {
            display->setRow(0, row, buffer[row]);
        }
    }
    
    void scrollLeft() {
        for(int row = 0; row < 8; row++) {
            buffer[row] <<= 1;
        }
    }
};

۲. انیمیشن با تایمر:

class AnimationTimer {
private:
    unsigned long lastUpdate;
    unsigned long interval;
    int frame;
    int totalFrames;
    
public:
    AnimationTimer(unsigned long updateInterval) {
        interval = updateInterval;
        lastUpdate = millis();
        frame = 0;
    }
    
    bool shouldUpdate() {
        unsigned long current = millis();
        if(current - lastUpdate >= interval) {
            lastUpdate = current;
            return true;
        }
        return false;
    }
    
    int getFrame() {
        if(shouldUpdate()) {
            frame = (frame + 1) % totalFrames;
        }
        return frame;
    }
    
    void setTotalFrames(int frames) {
        totalFrames = frames;
    }
};

۳. کنترل مصرف انرژی:

class PowerManager {
private:
    LedControl* display;
    bool isSleeping;
    
public:
    PowerManager(LedControl* lc) {
        display = lc;
        isSleeping = false;
    }
    
    void sleep() {
        if(!isSleeping) {
            display->shutdown(0, true);
            isSleeping = true;
        }
    }
    
    void wake() {
        if(isSleeping) {
            display->shutdown(0, false);
            isSleeping = false;
        }
    }
    
    void autoSleep(unsigned long timeout) {
        static unsigned long lastActivity = millis();
        
        if(millis() - lastActivity > timeout) {
            sleep();
        }
    }
    
    void updateActivity() {
        lastActivity = millis();
        if(isSleeping) {
            wake();
        }
    }
};

راهنمای عیب‌یابی

مشکلات رایج و راه‌حل‌ها:

مشکل: نمایشگر روشن نمی‌شود
۱. بررسی اتصال VCC و GND
۲. بررسی پین‌های DIN, CLK, CS
۳. تست با تابع displayTest()
۴. بررسی جهت اتصال ماژول

مشکل: فقط برخی LEDها روشن می‌شوند
۱. بررسی تنظیمات اسکن لیمیت
۲. تست سخت‌افزار با تابع setLed()
۳. بررسی اتصال‌های لحیم‌کاری

مشکل: نمایشگر چشمک می‌زند
۱. افزایش تاخیر در به‌روزرسانی
۲. استفاده از خازن ۱۰μF روی VCC
۳. بررسی نویز منبع تغذیه

مشکل: ماتریس داغ می‌شود
۱. کاهش روشنایی با setIntensity()
۲. بررسی جریان مصرفی
۳. استفاده از منبع تغذیه با جریان کافی

برنامه تست سخت‌افزار:

void hardwareTest() {
    Serial.println("Starting hardware test...");
    
    // تست تمام LEDها
    lc.clearDisplay(0);
    lc.shutdown(0, false);
    lc.setIntensity(0, 15);
    
    // تست تک تک LEDها
    for(int y = 0; y < 8; y++) {
        for(int x = 0; x < 8; x++) {
            lc.setLed(0, x, y, true);
            delay(50);
            lc.setLed(0, x, y, false);
        }
    }
    
    // تست حالت تست نمایشگر
    lc.shutdown(0, true);
    delay(1000);
    lc.shutdown(0, false);
    
    Serial.println("Hardware test complete!");
}

پروژه‌های پیشنهادی

پروژه‌های مبتدی:

  1. نمایشگر دماسنج: نمایش دمای محیط

  2. ساعت دیجیتال: نمایش ساعت و دقیقه

  3. دایس رول: تولید عدد تصادفی

  4. نشانگر سطح: نمایش سطح سیال

پروژه‌های متوسط:

  1. تابلو روان: نمایش متن متحرک

  2. گیم اسنیک: بازی مار کلاسیک

  3. نمایشگر ECG: شبیه‌سازی سیگنال قلب

  4. اسکوپ ساده: نمایش شکل موج

پروژه‌های پیشرفته:

  1. نمایشگر سه‌بعدی: استفاده از ۸ ماژول

  2. سیستم آگهی: کنترل از طریق وب

  3. ویژوالایزر صوتی: واکنش به صدا

  4. نمایشگر باینری: نمایش داده‌های دیجیتال

 

بسته‌بندی و محتویات

بسته استاندارد شامل:

  • ۱ عدد ماژول ماتریس ۸x۸ با MAX7219

  • ۴ عدد پایه هدر نری (قابل لحیم)

  • ۱ عدد کابل ۵ سیمه ۲۰cm

  • راهنمای نصب سریع فارسی

بسته توسعه‌دهنده شامل:

  • ۴ عدد ماژول ماتریس

  • ۱ عدد برد اتصال سریع

  • ۱ عدد آداپتور ۵V 2A

  • کتابچه پروژه‌های عملی

  • کدهای نمونه کامل

بسته حرفه‌ای شامل:

  • ۸ عدد ماژول ماتریس

  • فریم آلومینیومی برای مونتاژ

  • منبع تغذیه صنعتی ۵V 10A

  • کتابخانه‌های سفارشی

  • پشتیبانی فنی VIP

تست‌های کیفیت:

۱. تست LEDها: بررسی تمام ۶۴ LED
۲. تست درایور: بررسی عملکرد MAX7219
۳. تست اتصال: بررسی پین‌های اتصال
۴. تست حرارتی: کارکرد در دمای ۵۰°C

پشتیبانی فنی:

  • راهنمای فارسی جامع

  • مثال‌های برنامه‌نویسی

  • کتابخانه‌های به‌روز

  • گروه تلگرام پشتیبانی

  • ویدئوهای آموزشی


جمع‌بندی

ماژول ماتریس نقطه‌ای ۸x۸ با درایور MAX7219 یک نمایشگر همه‌کاره، قابل کنترل و مقرون‌به‌صرفه برای پروژه‌های الکترونیکی است. با رابط SPI ساده، کتابخانه‌های گسترده و قابلیت اتصال سری، این ماژول امکان ایجاد نمایشگرهای بزرگ و پیچیده را با کمترین پیچیدگی فراهم می‌کند.

از پروژه‌های ساده نمایش متن تا سیستم‌های نمایش پیچیده، این ماژول ابزاری ایده‌آل برای طراحان و سازندگان است.