W artykule omówię kilka możliwości korzystania z Matrycy LED 8×8 która jest wyposażona w moduł MAX 7219. Poniżej załączam przykład w którym został wyświetlony napis na matrycy. Będzie przeze mnie szczegółowo omówiony oraz do artykułu zostały dołączone najlepsze biblioteki do korzystania z tej tej wersji oraz innych wersji sterownika MAX LED.
Spis treści
- Krótki opis
- Specyfikacja
- Przykład na bibliotece MaxMatrix
- Przykład na bibliotece LedColor
- Pliki do pobrania
Krótki opis
Najlepszy efekt wyświetlania osiągniemy korzystając z większej ilości matryc. Pozwoli nam to na osiągnięcie znacznie większego i bardziej złożonego obrazu. Sterownik MAX 7219 jest bardzo wygodnym modułem transmisji gdyż dane przechodzą z jednej strony (IN) na drugą (OUT) co pozwala nam dołączać kolejne matryce bez większego wpływu na nasz kod.
Specyfikacja
- Napięcie zasilania: 5 V
- Matryca LED 8 x 8
- Interfejs komunikacyjny: SPI
- Kolor diody: czerwony
- Wymiary modułu 50 x 32 mm
- Wymiary matrycy: 32 x 32 mm
Przed przykładami
Poniżej znajdują się dwa przykłady odnoszące się do dwóch różnych bibliotek. Obie biblioteki można zastosować do korzystania z jednej lub wielu matryc. Oczywiście istnieją jeszcze inne biblioteki do kontroli tego sterownika jednak te dwie konkretne są najpopularniejsze i moim zdaniem najwygodniejsze do korzystania.
Elementy:
- 1x Matryca 8×8 ze sterownikiem Max 7219
- Płytka Arduino Mega lub Uno
- 5x kable stykowe (żeń-męs)
Połączenie
- Matryca – Arduino
- GND – GND
- VCC – 5V
- CLK – 8
- DIT – 10
- CK – 12
Przykład z MaxMarix
W tym przykładzie pokaże jak można wyświetlić tekst na Matrycy. Na początku musimy dodać do naszego szkicu bibliotekę MaxMatrix. (link do pobrania biblioteki znajduje się niżej). (Jeżeli nie wiesz jak dodać bibliotekę do Arduino IDE, zerknij do tego artykułu Jak zainstalować biblioteki do Arduino IDE ? – AJmaker. ) Potem musimy zdefiniować że będziemy korzystać z tej biblioteki w kodzie. (Nie przejmuj się drugą linijką ta biblioteka jest zawarta w pierwszej).
#include "MaxMatrix.h" #include "avr/pgmspace.h
Następnym krokiem jest wypisanie wszystkich znaków w postaci analogowej z jakich będziemy mogli korzystać
PROGMEM const unsigned char CH[] = { 3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space 1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // ! 3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // " 5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // # 4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $ 5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // % 5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // & 1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // ' 3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // ( 3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // ) 5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // * 5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // + 2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // , 4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // - 2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // . 4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // / 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0 3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1 4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2 4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3 4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4 4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5 4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6 4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7 4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8 4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9 2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // : 2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ; 3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // < 3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // = 3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // > 4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ? 5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @ 4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A 4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B 4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C 4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D 4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E 4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F 4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G 4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H 3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I 4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J 4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K 4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L 5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M 5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O 4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P 4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q 4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R 4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S 5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T 4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U 5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V 5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W 5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X 5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y 4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z 2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [ 4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash 2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ] 3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat 4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _ 2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // ` 4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a 4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b 4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c 4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d 4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e 3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f 4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g 4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h 3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i 4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j 4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k 3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l 5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m 4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n 4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o 4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p 4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q 4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r 4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s 3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t 4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u 5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v 5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w 5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x 4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y 3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z 3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // { 1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // | 3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // } 4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~ };
Kolejno musimy zdefiniować wszystkie piny transmitujące dane jakie podłączyliśmy do matrycy oraz jaką ilość matryc chcemy wykorzystać w przykładzie
int data = 10; // DIN pin of MAX7219 module int load = 12; // CS pin of MAX7219 module int clock = 8; // CLK pin of MAX7219 module int maxInUse = 1; //how many MAX7219 are connected
Następnym krokiem jest utworzenie obiektu klasy/biblioteki dzięki temu będziemy mogli korzystać z wszystkich funkcji w niej dostępnych. Definiujemy również obiekt buffer który jest dwu wymiarowym zbiorem danych.
MaxMatrix m(data, load, clock, maxInUse); // define Library byte buffer[10];
Teraz zajmijmy się text -em który będziemy chcieli wyświetlić. Umieszczamy go właśnie w tym miejscu pomiędzy cudzysłowami. Ja wpiszę datę publikacji tego artykułu.
char string1[] = " 05.11.2021"; // Scrolling Text
Teraz zajmiemy się funkcją void setup w której aktywujemy nasz utworzony obiekt oraz ustawiamy stopień jasności LED.
void setup(){ m.init(); // module MAX7219 m.setIntensity(5); // LED Intensity 0-15 }
Przechodzimy do funkcji void loop() i robimy 4 rzeczy. Pierwsza tworzymy zmienną która będzie odpowiadała za każdy poszczególny znak. Druga to zrobienie lekkiego opóźnienia dla poprawy wydajności programu. A dwie ostanie to wywołanie dwóch innych funkcji z których będziemy korzystać.
void loop(){ byte c; delay(100); m.shiftLeft(false, true); printStringWithShift(string1, 100); // Send scrolling Text }
Pierwsza funkcja odpowiada za wyświetlanie cyfr
void printCharWithShift(char c, int shift_speed){ if (c < 32) return; c -= 32; memcpy_P(buffer, CH + 7*c, 7); m.writeSprite(maxInUse*8, 0, buffer); m.setColumn(maxInUse*8 + buffer[0], 0); for (int i = 0; i < buffer[0]+1; i++) { delay(shift_speed); m.shiftLeft(false, false); } }
A kolejna za wyświetlanie liter
void printStringWithShift(char* s, int shift_speed){ while (*s != 0){ printCharWithShift(*s, shift_speed); s++; } }
Przykład z LedColor
Na początku również dołączamy bibliotekę LedColor (link do niej znajduje się niżej.)
#include <LedControl.h>
Potem musimy zdefiniować piny z które podłączyliśmy do matrycy
int DIN = 10; int CS = 9; int CLK = 8;
Potem tworzymy obiekt biblioteki
LedControl lc=LedControl(DIN,CLK,CS,1);
Kolejnym krokiem jest funkcja void setup w której inicjalizujemy nasz obiekt, ustawiamy stopień jasności oraz czyścimy wyświetlacz.
void setup(){ lc.shutdown(0,false); lc.setIntensity(0,15); //Adjust the brightness maximum is 15 lc.clearDisplay(0); }
Ostatnim krokiem jest funkcja void loop() w której analogowo opisane zostały wszystkie wyświetlone elementy i funkcja printByte która te elementy wyświetla.
void loop(){ //Facial Expression byte smile[8]= {0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C}; byte neutral[8]= {0x3C,0x42,0xA5,0x81,0xBD,0x81,0x42,0x3C}; byte sad[8]= {0x3C,0x42,0xA5,0x81,0x99,0xA5,0x42,0x3C}; //Arrow byte arrow_up[8]= {0x18,0x3C,0x7E,0xFF,0x18,0x18,0x18,0x18}; byte arrow_down[8]= {0x18,0x18,0x18,0x18,0xFF,0x7E,0x3C,0x18}; //Alternate Pattern byte d1[8]= {0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55}; byte d2[8]= {0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA}; //Moving car byte b1[8]= {0x00,0x00,0x00,0x00,0x18,0x3C,0x18,0x3C}; byte b2[8]= {0x00,0x00,0x00,0x18,0x3C,0x18,0x3C,0x00}; byte b3[8]= {0x00,0x00,0x18,0x3C,0x18,0x3C,0x00,0x00}; byte b4[8]= {0x00,0x18,0x3C,0x18,0x3C,0x00,0x00,0x00}; byte b5[8]= {0x18,0x3C,0x18,0x3C,0x00,0x00,0x00,0x00}; byte b6[8]= {0x3C,0x18,0x3C,0x00,0x00,0x00,0x00,0x18}; byte b7[8]= {0x18,0x3C,0x00,0x00,0x00,0x00,0x18,0x3C}; byte b8[8]= {0x3C,0x00,0x00,0x00,0x00,0x18,0x3C,0x18}; //Moving car printByte(b1); delay(50); printByte(b2); delay(50); printByte(b3); delay(50); printByte(b4); delay(50); printByte(b5); delay(50); printByte(b6); delay(50); printByte(b7); delay(50); printByte(b8); delay(50); //alternate pattern printByte(d1); delay(100); printByte(d2); delay(100); //Arrow printByte(arrow_up); delay(2000); printByte(arrow_down); delay(2000); //Facial Expression printByte(smile); delay(1000); printByte(neutral); delay(1000); printByte(sad); delay(1000); } void printByte(byte character []) { int i = 0; for(i=0;i<8;i++) { lc.setRow(0,i,character[i]); } }
Pliki do pobrania
Biblioteka MaxMatrix – github.com/riyas-org/max7219
Biblioteka LedColor – github.com/wayoda/LedControl