Heute möchte ich gerne das Max7219 8×8 LED Shield präsentieren.
Dieses Shield kann für wenig Geld über Amazon.de bezogen werden, ca 3-5 €.
Wenn dieses Shield geliefert wird ist es komplett zerlegt d.h. man muss es selbst zusammenlöten. Aber dieses ist auch mit geringen Kentnissen lösbar.
Wenn dieses zusammen gesetzt ist welches in ca. 30min lösbar sein sollte, sieht dieses Shield folgendermaßen aus.
Der Schaltplan
Zum Schaltplan braucht es nicht viel Erwähnung, die PINs VSS, GND, DIN, CS, CLK werden wie folgt mit dem Sainsmart Mega2560 R3 verbunden.
VCC – 5V
GND – GND
DIN – digitaler PIN 8
CS – digitaler PIN 9
CLK – digitaler PIN 10
Die oben genannten Einstellungen können auch beliebig angepasst werden, jedoch muss dann auch das Beispiel angepasst werden. Ich habe diese Einstellungen so belassen da ich “nur” das Shield an dem Mikrocontroller habe.
Der Quellcode
Für dieses Shield benötigt man die MaxLib welche aus dem GitHub von Arduinobymyself geladen werden kann. Hier sollte man sich nicht an der Bezeichnung “16×8” beirren lassen. Das mitgelieferte Beispiel war in meinem Falle nicht sofort lauffähig und bedarf einiger kleiner Änderungen, welche ich später erläutere.
Einbinden der MaxLib
Wenn man die ZIP Datei heruntergeladen hat dann kopiert man diese in ein beliebiges Verzeichnis. Jetzt muss diese Bibliothek in die Arduino IDE eingebunden werden. Wie dieses erfolgt habe ich im Tutorial “Arduino IDE, Einbinden einer Bibliothek” beschrieben.
Verwenden der MAXLIB
Nachdem wir die Arduino IDE geöffnet UND die benötigte Bibliothek eingebunden haben können wir die einfach mit:
#include <MaxMatrix.h>
einbinden.
Das Beispiel
Wie schon angesprochen werden die Bibliotheken in den meisten Fällen mit Beispielen zu den Shields ausgeliefert, wie auch in diesem Falle. Da ich mich erstmal mit dem Shield vertraut machen wollte und später in meinem großen Projekt einbinden wollte habe ich mir das Beispiel genommen und kleinere Änderungen vorgenommen.
Als erstes habe ich diese riesen Array Deklaration welche benötigt wird um die Zeichen auf dem Shield auszugeben in eine separate Datei ausgelagert.
#include "statics.h"
Die Datei statics.h
Die nachfolgenden Zeichen können alle auf dem Shield dargestellt werden, möchte man nun eigene oder zusätzliche Zeichen haben, so muss man das Array “einfach” erweitern. In der MaxMatrix liegt eine Microsoft Excel Arbeitsmappe womit dieses relativ einfach zu erledigen ist.
const unsigned char CH[] PROGMEM = { 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, B0101000, B0000000, // c 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, // ~ };
Einstellungen zu den PIN’s und dem Shield
Wie zuvor angesprochen kann das Shield an beliebige PINs angeschlossen werden (Außer natürlich VCC & GND.)
Diese Einstellungen hier sind aus dem Beispiel übernommen.
int data = 8; // DIN Pin vom MAX7219 Shield int load = 9; // CS Pin vom MAX7219 Shield int clock = 10; // CLK Pin vom MAX7219 Shield int maxInUse = 1; //Dieser Wert bestimmt wieviele MaxMatrix Shields hintereinander (kaskadiert) verwendet werden.
Mit der Zeile
MaxMatrix m(data, load, clock, maxInUse); // Definiert nun ein Objekt der Klasse MaxMatrix.
Erstellen wir ein Objekt der Klasse MaxMatrix, nun können wir über die Variable “m” auf die öffentlichen Routinen der MaxMatrix Bibliothek zugreifen.
Als Member Variable setzen wir unsere darzustellende Message als char Array.
char msg[] = "Hallo Welt! 123#";
Die Setup Methode für den Sketch enthält die Initialisierung der MaxMatrix sowie die Einstellung für die Übertragungsgeschwindigkeit.
Optional kann hier auch die Leucht Intensität der LEDs eingestellt werden.
(Werte von 0-15 sind hier wählbar.)
void setup(){ m.init(); // Das Max7219 initialisieren. m.setIntensity(1); // LED Leucht intensität, Werte von 0-15 sind hier erlaubt. Serial.begin(9600); // Übertragungsgeschwindigeit der seriellen Verbindung }
In der Loop Methode wird nun unsere Message auf die MaxMatrix geschrieben
(In einer Endlosschleife.).
void loop(){ printStringWithShift(msg, 75); //Schreibt die Message auf die Max LED Matrix, mit einer wiederholungsgeschwindigkeit von 75ms. }
Nun noch unsere Hilfsmethoden welche die Message (ist ein Char Array) zerlegen und aus dem vorher definierten Char Array (prog_uchar CH[], in der Datei statics.h) die entsprechenden Adressen für die LEDs raussucht.
void printCharWithShift(char c, int shift_speed){ if (c < 32) return; c -= 32; memcpy_P(buffer, CH + 7*c, 7); m.writeSprite(32, 0, buffer); m.setColumn(32 + buffer[0], 0); for (int i=0; i<buffer[0]+1; i++) { delay(shift_speed); m.shiftLeft(false, false); } } void printStringWithShift(char* s, int shift_speed){ while (*s != 0){ printCharWithShift(*s, shift_speed); s++; } }
Das Video
Hier nun wie gewohnt der Quellcode zum Download:
Danke das war für mich sehr wertvoll und verständlich,
suche noch verzweifelt nach einen max7219 Uhren sketch, kann mir geholfen werden
Hi,
eine gute Idee, jedoch mit dem Rastermaß von 8×8 LEDs etwas klein aber man kann ja 8 Shields nehmen und diese zu einem 16×16 LED Matrix Panel zusammenschließen.
Gruß,
Stefan
Hallo,
das ist wirklich ein richtig gutes Projekt. Lief bei mir auch perfekt lies sich sehr gut ein meine Bedienungen anpassen,
bis zum heutigen Tag. Beim Kompilieren kommt folgende Meldung:
lektion8_max7219_8x8:33: error: ‘CH’ was not declared in this scope
memcpy_P(buffer, CH + 7*c, 7);
^
exit status 1
‘CH’ was not declared in this scope
Ich habe keine Ahnung warum das von mit nichts dir nichts so ist. Vlt kann jemand helfen???
Hi,
“CH” ist unser Array mit dem Zeichensatz welcher auf der Matrix angezeigt werden kann / soll.
Prüfe doch bitte einmal deinen Code ob vielleicht diese Variable nicht unbenannt wurde.
Gruß,
Stefan Draeger
Moin,
die URL zum Einbinden einer Bibliothek führt leider noch zu einer alten Domain.
Die jetzt passende URL zum Beitrag findet man hier:
https://draeger-it.blog/arduino-ide-einbinden-einer-bibliothek/
Hi,
danke, da ist mir die Adresse wohl beim Wechsel der Domain durchgerutscht.
Gruß,
Stefan Draeger
Hallo,
ich bin noch unerfahren mit der Arduino IDE.
Ich bekomme irgendwie die MaxLib von Arduinobymyself nicht eingebunden.
Habe die IDE 1.8.7 und 1.8.9 probiert.
Ich habe die ZIP Datei heruntergeladen (mehrfach und sie ist in Ordnung).
Wenn ich .ZIP Bibliothek hinzufügen wähle, kommt immer
“Angegebener Ordner/ZIP-Datei enthält keine gültige Bibliothek”
egal, ob ich das ZIP File wähle, oder den ausgepackten Ordner.
Könnt ihr mir einenen Tipp geben?
Danke
Hi,
manchmal sind die Ordner in den Zip Dateien nocheinmal verschachtelt d.h. “Ordner in Ordner” die Arduino IDE benötigt jedoch eine bestimmte Struktur.
Du musst somit die RAR Datei “Matrix16x8-master.zip\Matrix16x8-master\MaxMatrix.rar” entpacken und separat als Zip Datei packen und einbinden.
Ich habe dieses einmal für dich erledigt und du kannst dir die Zip Datei unter https://draeger-it.blog/download/maxlib-von-arduinobymyself/ herunterladen.
Gruß,
Stefan Draeger
Hallo,
mir gefällt das Projekt sehr gut. Ich möchte mir eine Laufschrift mit 8 Modulen erstellen. Dank dir funktioniert das auch schon gut, aber die Schrift läuft immer quer. So sieht es bei deinem Beispiel auch aus. Hast du Ahnung, wie ich die Schrift um 90 Grad drehen kann?
Im Voraus Viuelen Dank
Hallo.
In der statics.h muss in den neuen Versionen folgendes geändert werden, damit diese Fehlermeldung nicht mehr auftritt: “prog_uchar’ does not name a type”
alt: PROGMEM prog_uchar CH[] = { …
neu: const unsigned char CH[] PROGMEM ={
Vielen Dank für die tolle Anleitung 🙂
Hallo Stefan ! Das Beispiel bringt mir immer folgende Meldung.. ‘pror_uchar’ does not name a type, did you mean ‘getchar’? kannst Du mich da weiter helfen ?
Hi,
ja da hat sich in der Zeit einiges geändert. Du musst nun prog_uchar durch const unsigned char ersetzen. Dann sollte es klappen.
Gruß,
Stefan
Hallo.
Danke für die gute Erklärung und für die Arbeit die du dir gemacht hast.
Ich möchte gerne 8 Max7219 shields verwenden.
Mit 4 Stück ging alles gut. Die Schrift beginnt ganz rechts aussen um dann nach links zu laufen.
Ab dem 5. shield folgendes Bild: die Schrift beginnt auf dem 1. shield rechts. Jedoch nicht ganz am rechten Rand, sondern in der Mitte.
Ab dem 6. shield folgendes Bild: die Schrift beginnt auf dem 2. shield rechts in der Mitte.
Ab dem 7. shield folgendes Bild: die Schrift beginnt auf dem 3. shield rechts in der Mitte. Bei Shield 1und 2 leuchten die waagrechten Reihen 2 bis 6 (von Oben) nun dauernd. Shield 3 leuchten die rechte Hälfte der waagrechten Reihen 2 bis 6 dauernd, und die linke Hälfte füllt die Reihen 2 bis 6 dem Buchstaben folgend auf.
Ab dem 8. shield ist das gleiche wie bei shield 7, mit Verschiebung auf das 4. shield.
Wie kann das Problem behoben werden, sodass die Schrift, ganz rechts startet?
Freundliche Grüsse
Urs
Hi,
im Sketch muss man ggf. anpassen wieviele Shields man kaskadierend angeschlossen hat.
Kannst du mir deinen Code bitte einmal per E-Mail senden?
Gruß,
Stefan
Hi
habe es mit 8 shields gepackt.
Zeile 34 m.writeSprite(64, 0, buffer);
Zeile 35 m.setColumn(64 + buffer[0], 0);
Urs
Hallo,
nachdem ich nun die 8 shields zum laufen gebracht habe, möchte ich nun noch ä, ö, ü in der statics.h einbinden. das gelingt mir nur indem ich bei //& die Codierung für ä einsetze:
4, 8, B0100000, B1010101, B1010101, B1111000, B0000000, // &
Bei der Texteingabe im Code muss ich dann H&lfte anstatt Hälfte eingeben.
Das müsste doch irgendwie anders gehen. Mit dem dem reinen anfügen von ä, ö, ü in Zeile 97, 98, 99 der statics.h bin ich gescheitert. es wird kein ä ausgegeben sondern Hlfte.
Kannst du mir weiterhelfen.
Freundliche Grüsse
Urs
Hallo,
ich versuche mich gerade an dem Projekt und bekomme beim Kompilieren die Meldung:
‘buffer’ was not declared in this scope
Viele Grüße
Hi,
kannst du mir bitte deinen Sketch per Mail an info@draeger-it.blog senden?
Ich habe den Sketch jedoch einmal angepasst da noch ein Feature verwendet wird welches es nicht mehr gibt.
Gruß,
Stefan Draeger