Πριν μερικές μέρες ανέβασα στα social media ενα video που δείχνει ενα Matrix Panel που μετράει τα θύματα και τους επιβεβεωμένους ασθενείς με covid 19 σε πραγματικό χρόνο. Αρκετοί από εσάς που ειδατε το video με ρωτήσατε πόσο εύκολο είναι να διαχειριστούμε ενα led matrix panel; Έτσι αποφάσισα να ετοιμάσω ένα post για να εξηγήσω το δικό μου project. 


Επειδή το θέμα είναι σύνθετο ειπα να σπάσω το post σε 2 κείμενα. Ένα που θα περιγράφει τη λειτουργία των Matrix Panel με βάση το #arduino ώστε να μπορέσετε να ενσωματώσετε και εσείς στα project σας οθόνες led Matrix και σε κάποιο επόμενο post θα ασχοληθούμε με rest api σε arduino που σαν θέμα από μόνο του είναι πολύπλοκο και θέλει αναλυση αλλα και εξοπλισμό.


Ένα led matrix panel αποτελείται από σειρές led τα οποία όταν ανάβουν συνδυαστικά έχουν την δυνατότητα να εμφανίζουν συγκεκριμένες εικόνες. Στο δικό μας παράδειγμα αποφασίσαμε να χρησιμοποιήσουμε οθόνες led matrix 8x8 με τον οδηγό ΜΑΧ7219 ο οποίος διευκολύνει τη σύνδεση πολλαπλών led matrix panel σε σειρά καθώς χρησιμοποιώντας το πρωτόκολλο συνδεσης I2C θα χρειαστουμε μονο μονο 3 καλωδια για να συνδεθούμε στο Arduino Board και 2 επιπλεον για τη τροφοδοσια (5v) και τη γειωση(gnd). Μπορουμε να επιλεξουμε οσα led matrix panel 8x8 επιθυμουμε και να τα συνδέσουμε σε σειρα συμφωνα με το παρακατω παραδειγμα.








Και αφου το λύσαμε και αυτο ας δουμε τι θα χρειαστούμε για να φτιάξουμε το δικο μας led matrix panel.


  1. Ενα arduino Uno ή καποιο συμβατο.
  2. Οθόνες led matrix το πολύ 10.
  3. Καλωδια συνδεσης(συνηθως έρχονται μαζί με τις οθόνες).
  4. Καλώδιο usb για τη σύνδεση του arduino με το pc, έρχεται μαζι με το board.
Επιπλέον θα χρειαστεί να εχετε εγκαταστήσει το Arduino IDE(εχω την έκδοση 1.8.12) και την βιβλιοθήκη για το MAX7219 chip σε περίπτωση που δεν υπάρχει ήδη εγκατεστημένη.


Αφού είμαστε έτοιμοι με τον εξοπλισμό προχωράμε και με βάση το παρακάτω σχέδιο να συνδέσουμε το arduino με τα led matrix panel



Πιο συγκεκριμένα συνδέουμε το data  στο 12 αναφέρετε ως  DIN ή  MOSI. Το load πάει στο  11 και αναφέρεται ως  CS και το clock στο  10 αναφέρεται και ως SCK. Τέλος συνδέουμε τα 5v του board με το VCC και το gnd του board με το gnd του led matrix.



Πριν προχωρήσουμε στον κώδικα θα πρέπει να κατανοήσουμε πως λειτουργεί ένα matrix panel. Σε αντίθεση με τις lcd οθόνες  απο  που μπορούμε να στείλουμε εκτύπωση κατευθείαν το string που έχουμε επιλέξει στα led matrix θα πρέπει να έχουμε το maping των γραμμών και των στηλών που θα πρέπει να ανάψουν ώστε να εμφανιστεί ο χαρακτήρας που έχουμε επιλέξει. Ευτυχώς αυτό θα γίνει μια φορά και μπορεί να επαναχρησιμοποιηθεί σε οποιοδήποτε κώδικα χρειαστούμε να διαχειριστούμε led matrix panel ίδιας διάστασης.




Αμέσως μετά παραθέτω των κώδικα που εμφανίζει όποιο κείμενο θέλουμε στο led matrix panel που εχουμε φτιάξει.



// DSoutas maxmatrix-disp-scroll-text-7219
#include <MaxMatrix.h>
#include <avr/pgmspace.h>

#define maxDisplays 5 // Number of MAX7219's in use.
byte Buf7219[7]; // "width,height,data[5]" single character buffer.
const int data  = 12;     // DIN or MOSI
const int load  = 11;     // CS
const int clock = 10;     // SCK
 
MaxMatrix m(data, load, clock, maxDisplays);
// Data array is stored in program memory (see memcpy_P for access).
// Parameters are width, height, character data...
// There is a speed improvement for characters with height 8 bits see lib.

PROGMEM const unsigned char CH[] = {
3, 8, B0000000, B0000000, B0000000, B0000000, B0000000, // space
1, 8, B1011111, B0000000, B0000000, B0000000, B0000000, // !
3, 8, B0000011, B0000000, B0000011, B0000000, B0000000, // "
5, 8, B0010100, B0111110, B0010100, B0111110, B0010100, // #
4, 8, B0100100, B1101010, B0101011, B0010010, B0000000, // $
5, 8, B1100011, B0010011, B0001000, B1100100, B1100011, // %
5, 8, B0110110, B1001001, B1010110, B0100000, B1010000, // &
1, 8, B0000011, B0000000, B0000000, B0000000, B0000000, // '
3, 8, B0011100, B0100010, B1000001, B0000000, B0000000, // (
3, 8, B1000001, B0100010, B0011100, B0000000, B0000000, // )
5, 8, B0101000, B0011000, B0001110, B0011000, B0101000, // *
5, 8, B0001000, B0001000, B0111110, B0001000, B0001000, // +
2, 8, B10110000, B1110000, B0000000, B0000000, B0000000, // ,
4, 8, B0001000, B0001000, B0001000, B0001000, B0000000, // -
2, 8, B1100000, B1100000, B0000000, B0000000, B0000000, // .
4, 8, B1100000, B0011000, B0000110, B0000001, B0000000, // /
4, 8, B0111110, B1000001, B1000001, B0111110, B0000000, // 0
3, 8, B1000010, B1111111, B1000000, B0000000, B0000000, // 1
4, 8, B1100010, B1010001, B1001001, B1000110, B0000000, // 2
4, 8, B0100010, B1000001, B1001001, B0110110, B0000000, // 3
4, 8, B0011000, B0010100, B0010010, B1111111, B0000000, // 4
4, 8, B0100111, B1000101, B1000101, B0111001, B0000000, // 5
4, 8, B0111110, B1001001, B1001001, B0110000, B0000000, // 6
4, 8, B1100001, B0010001, B0001001, B0000111, B0000000, // 7
4, 8, B0110110, B1001001, B1001001, B0110110, B0000000, // 8
4, 8, B0000110, B1001001, B1001001, B0111110, B0000000, // 9
2, 8, B01010000, B0000000, B0000000, B0000000, B0000000, // :
2, 8, B10000000, B01010000, B0000000, B0000000, B0000000, // ;
3, 8, B0010000, B0101000, B1000100, B0000000, B0000000, // <
3, 8, B0010100, B0010100, B0010100, B0000000, B0000000, // =
3, 8, B1000100, B0101000, B0010000, B0000000, B0000000, // >
4, 8, B0000010, B1011001, B0001001, B0000110, B0000000, // ?
5, 8, B0111110, B1001001, B1010101, B1011101, B0001110, // @
4, 8, B1111110, B0010001, B0010001, B1111110, B0000000, // A
4, 8, B1111111, B1001001, B1001001, B0110110, B0000000, // B
4, 8, B0111110, B1000001, B1000001, B0100010, B0000000, // C
4, 8, B1111111, B1000001, B1000001, B0111110, B0000000, // D
4, 8, B1111111, B1001001, B1001001, B1000001, B0000000, // E
4, 8, B1111111, B0001001, B0001001, B0000001, B0000000, // F
4, 8, B0111110, B1000001, B1001001, B1111010, B0000000, // G
4, 8, B1111111, B0001000, B0001000, B1111111, B0000000, // H
3, 8, B1000001, B1111111, B1000001, B0000000, B0000000, // I
4, 8, B0110000, B1000000, B1000001, B0111111, B0000000, // J
4, 8, B1111111, B0001000, B0010100, B1100011, B0000000, // K
4, 8, B1111111, B1000000, B1000000, B1000000, B0000000, // L
5, 8, B1111111, B0000010, B0001100, B0000010, B1111111, // M
5, 8, B1111111, B0000100, B0001000, B0010000, B1111111, // N
4, 8, B0111110, B1000001, B1000001, B0111110, B0000000, // O
4, 8, B1111111, B0001001, B0001001, B0000110, B0000000, // P
4, 8, B0111110, B1000001, B1000001, B10111110, B0000000, // Q
4, 8, B1111111, B0001001, B0001001, B1110110, B0000000, // R
4, 8, B1000110, B1001001, B1001001, B0110010, B0000000, // S
5, 8, B0000001, B0000001, B1111111, B0000001, B0000001, // T
4, 8, B0111111, B1000000, B1000000, B0111111, B0000000, // U
5, 8, B0001111, B0110000, B1000000, B0110000, B0001111, // V
5, 8, B0111111, B1000000, B0111000, B1000000, B0111111, // W
5, 8, B1100011, B0010100, B0001000, B0010100, B1100011, // X
5, 8, B0000111, B0001000, B1110000, B0001000, B0000111, // Y
4, 8, B1100001, B1010001, B1001001, B1000111, B0000000, // Z
2, 8, B1111111, B1000001, B0000000, B0000000, B0000000, // [
4, 8, B0000001, B0000110, B0011000, B1100000, B0000000, // backslash
2, 8, B1000001, B1111111, B0000000, B0000000, B0000000, // ]
3, 8, B0000010, B0000001, B0000010, B0000000, B0000000, // hat
4, 8, B1000000, B1000000, B1000000, B1000000, B0000000, // _
2, 8, B0000001, B0000010, B0000000, B0000000, B0000000, // `
4, 8, B0100000, B1010100, B1010100, B1111000, B0000000, // a
4, 8, B1111111, B1000100, B1000100, B0111000, B0000000, // b
4, 8, B0111000, B1000100, B1000100, B0000000, B0000000, // c // JFM MOD.
4, 8, B0111000, B1000100, B1000100, B1111111, B0000000, // d
4, 8, B0111000, B1010100, B1010100, B0011000, B0000000, // e
3, 8, B0000100, B1111110, B0000101, B0000000, B0000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B0000000, // g
4, 8, B1111111, B0000100, B0000100, B1111000, B0000000, // h
3, 8, B1000100, B1111101, B1000000, B0000000, B0000000, // i
4, 8, B1000000, B10000000, B10000100, B1111101, B0000000, // j
4, 8, B1111111, B0010000, B0101000, B1000100, B0000000, // k
3, 8, B1000001, B1111111, B1000000, B0000000, B0000000, // l
5, 8, B1111100, B0000100, B1111100, B0000100, B1111000, // m
4, 8, B1111100, B0000100, B0000100, B1111000, B0000000, // n
4, 8, B0111000, B1000100, B1000100, B0111000, B0000000, // o
4, 8, B11111100, B0100100, B0100100, B0011000, B0000000, // p
4, 8, B0011000, B0100100, B0100100, B11111100, B0000000, // q
4, 8, B1111100, B0001000, B0000100, B0000100, B0000000, // r
4, 8, B1001000, B1010100, B1010100, B0100100, B0000000, // s
3, 8, B0000100, B0111111, B1000100, B0000000, B0000000, // t
4, 8, B0111100, B1000000, B1000000, B1111100, B0000000, // u
5, 8, B0011100, B0100000, B1000000, B0100000, B0011100, // v
5, 8, B0111100, B1000000, B0111100, B1000000, B0111100, // w
5, 8, B1000100, B0101000, B0010000, B0101000, B1000100, // x
4, 8, B10011100, B10100000, B10100000, B1111100, B0000000, // y
3, 8, B1100100, B1010100, B1001100, B0000000, B0000000, // z
3, 8, B0001000, B0110110, B1000001, B0000000, B0000000, // {
1, 8, B1111111, B0000000, B0000000, B0000000, B0000000, // |
3, 8, B1000001, B0110110, B0001000, B0000000, B0000000, // }
4, 8, B0001000, B0000100, B0001000, B0000100, B0000000, // ~
};


void setup()
{
  m.init();
  m.setIntensity(6); //change brightness
}
 

// Scrolling Text
char string[] = " type something here "; //edit text message
char string2[] = " and see how I scroll the screen ";

void loop()        //Send text
{     
  delay(1000);//delay between messages
  m.shiftLeft(false, true);
  printStringWithShift(string,40);   //number is message speed
  delay(1000);
  m.shiftLeft(false, true);
  printStringWithShift(string2,40);
}


// Put text on Display
void printCharWithShift(char c, int shift_speed)
{
  if (c < 32) return;
  c -= 32;
  memcpy_P(Buf7219, CH + 7*c, 7);
  m.writeSprite(maxDisplays*8, 0, Buf7219);
  m.setColumn(maxDisplays*8 + Buf7219[0], 0);


  for (int i=0; i<=Buf7219[0]; i++)
  {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

void printStringWithShift(char* s, int shift_speed)
{
  while (*s != 0)
  {
    printCharWithShift(*s, shift_speed);
    s++;
  }
}



Με κόκκινο χρώμα είναι τα σημεία που πρέπει να δώσετε προσοχή στον κώδικα.

Οι απαιτούμενη βιβλιοθήκη μπορεί να κατέβει απο εδω .

Μπορείτε να κατεβάσετε το έτοιμο αρχείο ino εδω.

Για να ολοκληρωθεί η διαδικασία πατάμε το upload αφού πρώτα έχουμε συνδέσει το uno με το pc και εχουμε επιλέξει το σωστό board απο τις ρυθμισεις tools>board του Arduino IDE.



Αυτο ηταν, μετα την επανεκκίνηση το board εμφανίζει το μήνυμα που έχουμε βάλει στον κώδικα μας. Δοκιμαστε το και περιμένω τα σχόλια η τους προβληματισμούς σας για να τα δούμε και  μαζι.