LED-Matrix MAX7219

Nachdem ich für ein kleines Projekt zwei (eventuell auch mehrere) LED-Matrix-Module benötige und ich - zugegeben, nach nur kurzer Suche - keine für meine bei Ebay erworbenen 8x8 No-Name "max7219 led matrix module" (wie rechts abgebildet) passende Library gefunden habe, habe ich meine eigene Library dafür geschrieben. Diese kann in Zwischenzeit schon einige Funktionen vorweisen und erfüllt meine derzeitigen Anforderungen sehr gut.

                           

Bild: Aufbau und Anschlüsse des Moduls    

Testaufbau:

Verwendete Bauteile:

  • 1 Arudino Uno
  • 1-8 LED-Matrix-Module mit MAX7219
  •  1 Netzteil 5 V, 2 A (bei 4 Modulen)


Achtung: Zur Versorgung der LED-Module unbedingt ein eigenes Netzteil mit ausreichend hoher Strombelastbarkeit verwenden. Ein Modul benötigt bei Ansteuerung aller 64 LEDs (bei maximaler Leucht-Intensität) einen Strom von mehr als 0,5 A! Bei vier Modulen entspricht das, wenn man von einer maximalen Gleichzeitigkeit von 80% ausgeht, einen Strom von mehr als 1,6 A, bei acht Modulen beinahe 3,5 A. Der 5 V-Ausgang des Arduino Uno liefert maximal 0,5 A(!!).


Library MyLedMatrix:

Folgende Funktionen stehen derzeit zur Verfügung:


  • Vorgabe der Helligkeit der Anzeige
  • Ausgabe einer Matrix-Spalte  1)
  • Ausgabe eines selbstdefinierten Zeichens, bestehend aus 8 Zeilen und n-Spalten (n <= 8)
  • Ausgabe eines Ascii-Zeichen  2)
  • Ausgabe einer Zahl
  • Setzen/Rücksetzen einer einzelnen LED
  • Abfrage des Zustands einer einzelnen LED  3)
  • Löschen der gesamten Anzeige
  • Löschen eines einzelnen Moduls
  • Löschen eines Sektors (von Spalte bis Spalte)
  • Dunkelsetzen der gesamten Anzeige  4)
  • Abfrage, ob die Anzeige dunkel gesetzt ist
  • Shiften der gesamten Matrix um eine Spalte nach links oder rechts
  • Shiften der gesamten Matrix um eine Spalte nach oben oder unten
  • Rotieren der gesamten Matrix um eine Spalte nach links oder rechts


1)  Je nach Ausrichtung sind die Module beim Empfang von Bitfolgen über die serielle Schnittstelle entweder zeilen- oder spaltenorientiert. Sind die Module so angeordnet, dass sich der MAX7219 unterhalb (wie im obigen fritzing-Bild) oder oberhalb der LED-Matrix befindet, so werden aufgrund der internen Verschaltung der Module die übermittelten Daten spaltenweise ausgegeben. Da nur so die einzelnen Modulblöcke zu einer großen Anzeige ohne Zwischenraum aneinander reihbar sind, gibt es eben die Funktion "Ausgabe einer Matrix-Spalte". Auch fast alle anderen Funktionen der Library greifen auf diese Funktion zurück, indem sie die auszugebenden Zeichen aus einzelnen Spalten (die Daten der einzelnen Spalten werden für jedes Zeichen in einem Werte-Array übergeben) zusammensetzt.

2)  Die Arrays für die Darstellung der Ascii-Zeichen (Großbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen) sind im File "MyLedMatrixChar.h" gespeichert, welches sich in einem zu erstellenden Unterverzeichnis "char" im Pfad ".....\Sketchbook\libraries\MyLedMatrix\char" befinden muss.

3)  Es gibt meines Wissens keine Möglichkeit, die Register des MAX7219 wieder auszulesen, ob eine LED angesteuert ist oder nicht. Deshalb sind die Zustände aller LEDs in einem Daten-Buffer in der Library gespeichert (pro Modul 64 Bit -> bei maximal 8 Modulen 64 Byte).

4)  Während beim Löschen der gesamten Anzeige oder Teilen davon auch der Daten-Buffer der Library ganz oder teilweise gelöscht wird, wird beim Dunkelsetzen der Anzeige der Daten-Buffer nicht verändert und kann nach Beendigung der Dunkelsetzung wieder angezeigt werden. Bei dunkel gesetzter Anzeige kann der Anzeigeinhalt nicht verändert werden.


Hinweis: Die Ausgabe von Zeichen, Zahlen, Buchstaben oder Sonderzeichen erfolgt zwar in der definierten Zeichenbreite (Spaltenanzahl), aber immer 8-zeilig, auch wenn nur z.B. die obersten 2 Zeilen Information beinhalten. Sind in diesen Spalten einzelne LEDs (mit Funktion: setDot(x, y, 1)) gesetzt, werden diese durch nachfolgendes Schreiben von Zeichen, Zahlen, Buchstaben oder Sonderzeichen überschrieben, d.h. gegebenenfalls gelöscht. Umkehrt kann durch nachfolgendes Setzen oder Löschen einzelner LEDs ein geschriebenes Zeichen verändert oder erweitert werden, die restlichen LEDs des Zeichens werden nicht verändert.


Die Library kann hier heruntergeladen werden:

Sollte die Library jemand verwenden oder testen, würde ich mich über eine Rückmeldung sehr freuen!

Version 2.0

MyLedMatrix.cpp.txt

MyLedMatrix.h.txt

keywords.txt

Leider kann ich hier keine "cpp"- oder "h"-Files hochladen, daher zum Verwenden der Library das Suffix ".txt" aus diesen Dateinamen entfernen und in einem neuen Verzeichnis mit dem Namen "MyLedMatrix" im Sketchbook-Ordner im Ordner "libraries" speichern.

Zeichensatz Vers. 1.1:

MyLedMatrixChar.h.txt

Nach Entfernung des ".txt" aus dem Dateinamen, die Datei in einem zu erstellenden Unterverzeichnis "char" im Verzeichnis "MyLedMatrix" speichern. Der Pfad könnte also so aussehen: ".....\Sketchbook\libraries\MyLedMatrix\char".

Die Datei beinhaltet Arrays für die Ascii-Zeichen 32 bis 127:

       Blank ! " # $ % & ' ( ) * + , - . / 0-9 : ; < = > ? @ A-Z [ \ ] ^ _ ` a-z { | } ← →

Bei Änderungen oder Anpassungen der Zeichen-Arrays ist folgendes zu beachten:

  • Möchte man einen anderen Zeichensatz verwenden, z.B. mit einer Zeichenbreite von 6 oder 7 Spalten, so kann man entweder den vorhandenen Zeichensatz anpassen oder der vorhandene Zeichensatz wird unter einem anderen Namen abgespeichert und eine Kopie davon verändert.
  • Die folgende Zeile definiert die Spaltenbreite aller Zeichen des Zeichensatzes und muss gegebenenfalls geändert werden:

       #define charCol 5  //ändern zu: #define charCol 7

  • Die einzelnen Zeichen-Arrays sind, wie im nachfolgenden Beispiel, nach dem Ascii-Code des Zeichens benannt, also z.B. "char54" für die Zahl "6" (siehe Ascii-Code: www.asciitable.com/):

         // 6
         byte char54[8] = {B00110,
                                     B01001,
                                     B10000,
                                     B11110,
                                     B10001,
                                     B10001,
                                     B01110,
                                     B00000
                                     };

Zur Auflistung der Funktionen geht es hier: Funktionen


Tipp: Werden weniger als 8 Matrix-Module verwendet, kann zur Einsparung von SRAM-Speicher die Buffergröße der Library verringert werden. Diese ist in der Datei MyLedMatrix.h in der Zeile

#define myLedMatrix_bufferSize 64

definiert und gibt die Buffergröße in Byte an. Pro eingesetztem Matrix-Modul ist eine Buffergröße von 8 Byte erforderlich. Der Vorgabewert von 64 definiert also eine Buffergröße für 8 Module.


Programmbeispiele LED-Matrix

Programmbeispiel 1

Im Programmbeispiel 1 für 2 Matrix-Module erfolgt im Sekundentakt Schreiben, Loeschen, Dunkelsetzen, etc.:

//LED-Matrix Programmbeispiel 1
//Code fuer Arduino
//Author Retian
//Version 1.1

#include <MyLedMatrix.h>


#define anzMod 2 //Anzahl der Matrix-Module
#define data 7 //Daten-Pin
#define load 6 //Load-(CS-)Pin
#define xclock 5 //Clock-Pin


MyLedMatrix MyMatrix(data, load, xclock, anzMod);


//Array fuer Pfeil nach Oben
byte fig1[8] = {B0001000,
                       B0011100,
                       B0111110,
                       B1111111,
                       B0011100,
                       B0011100,
                       B0011100,
                       B0000000,
                       };


//Array fuer Pfeil nach Links
byte fig2[8] = {B000100,
                       B001100,
                       B011111,
                       B111111,
                       B011111,
                       B001100,
                       B000100,
                       B000000
                       };


void setup() {
  MyMatrix.clearAll(); //Loeschen der gesamten Matrix
  MyMatrix.setIndensity(0); //Leuchtintensität auf kleinste Stufe
  delay(1000);
  //Schreibe abwechseln 1 und 0 in Spalte 0
  MyMatrix.writeCol(0, B10101010);
  delay(1000);
  MyMatrix.clearAll();
  //Schreibe Figur 1 ab Spalte 3
  MyMatrix.writeFig(0, fig1, 7);
  delay(1000);
  //Schreibe Figur 2 ab Spalte 8
  MyMatrix.writeFig(8, fig2, 6);
  delay(1000);
  //Loesche von Spalte 8 bis Spalte 10
  MyMatrix.clearSector(8, 14);
  delay(1000);
  MyMatrix.setBlankOn(); //Dunkelsetzen der Anzeige
  delay(1000);
  MyMatrix.setBlankOff(); //Dunkelsetzen ausschalten
  delay(1000);
  MyMatrix.clearAll();
  //Schreibe die Zahl "5" ab Spalte 1
  MyMatrix.writeNumber(1, '5'); //oder MyMatrix.writeNumber(1, 5);
  //Schreibe den Großbuchstaben "A" ab Spalte 9
  MyMatrix.writeChar(9, 'A');
}


void loop() {
}


Programmbeispiel 2

Das folgende Programmbeispiel für 2 Matrix-Module setzt und löscht zufallsbedingt einzelne LEDs der Matrix:

//LED-Matrix Programmbeispiel 2
//Code fuer Arduino
//Author Retian
//Version 1.1


#include <MyLedMatrix.h>


#define anzMod 2 //Anzahl der Matrix-Module
#define data 7 //Daten-Pin
#define load 6 //Load-(CS-)Pin
#define xclock 5 //Clock-Pin


MyLedMatrix MyMatrix(data, load, xclock, anzMod);


byte anzSpalten = anzMod * 8;

//Zufallszahlen
byte spalte;
byte zeile;
byte zustand;


void setup() {
  MyMatrix.clearAll(); //Loeschen der gesamten Matrix 
  MyMatrix.setIndensity(0); //Leuchtintensität auf kleinste Stufe
  delay(1000);
  randomSeed(analogRead(0));
}


void loop() {
  spalte = random(0, anzSpalten); //Zufallszahl 0 bis (Anzahl Spalten - 1)
  zeile = random(0, 8); //Zufallszahl 0 bis 7 Reihen
  zustand = random(0, 2); //Zufallszahl 0 oder 1
  MyMatrix.setDot(spalte, zeile, zustand);
  delay(20);
}


Programmbeispiel 3

Im folgenden Programmbeispiel für 4 Matrix-Module läuft ein Pfeil kontinuierlich von rechts nach links:

//LED-Matrix Programmbeispiel 3
//Code fuer Arduino
//Author Retian
//Version 1.1


#include <MyLedMatrix.h>


#define anzMod 4 //Anzahl der Matrix-Module
#define data 7 //Daten-Pin
#define load 6 //Load-(CS-)Pin
#define xclock 5 //Clock-Pin


int8_t colPfeil = (anzMod * 8) - 1; //aktuelle Spalte f. Pfeilposition


byte pfeil[8] = {B00010000,
                        B00110000,
                        B01111110,
                        B11111110,
                        B01111110,
                        B00110000,
                        B00010000,
                        B00000000
                       };


MyLedMatrix MyMatrix(data, load, xclock, anzMod);


void setup() {
  MyMatrix.clearAll();
  MyMatrix.setIndensity(1);
}


void loop() {
  MyMatrix.writeFig(colPfeil, pfeil, 8);
  colPfeil--;
  if (colPfeil == -8)
  {
    colPfeil = (anzMod * 8) - 1;
  }
  delay(20);
}