Laufschrift mit 4fach 8x8 LED Matrix mit Maxim 7219 Chips
Eine einzelne 8x8 LED Matrix

In meinem Artikel MAX7219 Treiber zur Ansteuerung von 8x8 LED-Matrix und 8fach-7Segment-Display verwenden hatte ich schon einmal die 8x8 LED Matrix mit einem Max 7219 LED-Treiber vorgestellt, so wie sie rechts im Bild zu sehen ist.
Dort stelle ich die Hardware genauer vor und gehe auch auf den Maxim 7219-Chip näher ein, der die 64 Einzel-LEDs steuert. Ich habe damals in dem Artikel ein Programm für den Arduino entwickelt (Source-Code siehe obigen Artikel), um ein Einzel-8x8-Modul anzusteuern.
Der Max 7219 ist ein gutes Helferlein, dass einem viel Arbeit abnimmt und es gibt dafür auch Libraries für Arduino, ESP8266, ESP32, Raspberry Pi und Co, die eine schnelle Einbindung und Softwareentwicklung ermöglichen, denn der 7219 ist sehr bekannt und geläufig.
Natürlich braucht es nicht unbedingt einen 7219er, man kann den Weg auch auf andere Weise gehen, wie ich im Artikel Mit zwei 74HC595 Schieberegistern über nur drei Leitungen eine 8x8-LED-Matrix ansteuern auf dem Raspberry Pi zeige.
Dort verwende ich zwei 74HC595 Schieberegister, um die 16 Anschlüsse der 8x8-LED-Matrix anzusteuern. Und die LED-Matrix 1088BS selbst ist schon optimiert, damit man nur 16 Leitungen für 64 LEDs braucht.
Ganz ohne Optimierung hätte man eine Ground-Leitung und 64 Datenleitungen für eine 8x8-LED-Matrix mit 64 LEDs. Das 1088BS-Modul nutzt eine Technik, Spalte und Zeile anzusprechen, um die nötigen Leitungen zu optimieren.
Mit den beiden 74HC595 Schieberegistern braucht man dann nur noch 3 Daten-Leitungen. Wer sich fragt, wie die 74HC595er das schaffen, der sollte in meinem Artikel Mit dem 74HC595 Steuerleitungen einsparen nachlesen, in dem ich den 74HC595 ausführlich erkläre.
Der Max 7219-Chip optimiert das ganze nochmal ein bisschen, denn hier braucht man nur einen Chip, eben den 7219 und keine zwei 74HC595er. Außerdem ist er von den Anschlüssen zur Ansteuerung von 8x8 LED-Matrizen und 7-Segment-Anzeigen optimiert. Auch der 7219 braucht nur drei Datenleitungen.
Mehrere 8x8 LED Matrizen nebeneinander

Genau wie das 74HC595 Schieberegister kann man auch mehrere 7219er-Chips hintereinander schalten, sie leiten die Signale dann entsprechend weiter. So kann man auch mehrere mit 7219ern bestückte 8x8 LED-Matrizen hintereinanderschalten und ansteuern.

Wenn man die flache und kompakte SMD-Version des 7219er benutzt, dann lassen sich die Chips unter der 8x8 LED-Matrix anbringen und die Matrizen liegen schön nahtlos nebeneinander. Im Bild rechts seht ihr eine gebräuchliche 4fach 8x8 LED Matrix. Hier hat man auf die Abstände geachtet und so sieht das 4fach-Modul aus, als wäre die 32x8 (immerhin 256 Einzel-LEDs) aus einem Guss.

Zur Ansteuerung der 256 Einzel-LEDs reichen hardwaretechnisch immer noch 3 Steuerleitungen, weil ein 7219er die Daten an den nächsten weitergiben kann. Man könnte auch noch breitere Panels bauen, mit fünf, acht oder noch mehr Einzel-8x8-LED-Modulen.
Wenn die Module so schön nebeneinander liegen, dann ist das natürlich super geeignet, um eine Laufschrift damit zu machen.
Und genau das ist das Ziel des heutigen Makes: Eine Laufschrift daraus zu basteln.
Das Ziel: Eine WLAN-Laufschrift
Um die Sache ein bisschen spannender zu machen, benutze ich diesmal einen WLAN-fähigen Microcontroller. Der ESP8266 sollte dafür vollkommen ausreichend sein und ein paar der günstig eingekaufte D1-mini-Boards habe ich auch noch auf Lager.Wer noch keine Ahnung vom ESP8266 hat, dem empfehle ich die Lektüre meiner Artikel ESP8266 - Ersteinrichtung und Vorstellung des ESP8266-Boards D1 mini. Darin steht alles drin, was ihr wissen an Grundlagen müsst, um dieses Projekt nachzubauen.
Durch die WLAN-Fähigkeit können wir später beliebige Texte über einen URL-Aufruf aus dem Web-Browser von Computer, Tablet oder Smartphone im gleichen WLAN zur Laufschrift schicken, die diese dann prompt anzeigen wird. Wer will, kann noch eine Authentifizierungs-Schicht einbauen und das ganze im Internet freigeben und dann auch von unterwegs den Text ändern. Etwa, um der geliebten Ehefrau mitzuteilen, dass man jetzt heimkommt oder die Kinder zu ermahmen, die Hausaufgaben zu machen oder den Werbetext im Schaufenster zu aktualisieren.
Wie man eine einzelne 4fach 8x8 LED Matrix ansteuert, um beliebige Grafiken, habe ich in meinem Artikel MAX7219 Treiber zur Ansteuerung von 8x8 LED-Matrix und 8fach-7Segment-Display verwenden ja schon am Beispiel eines Herzchens vorgeführt.
Für eine Laufschrift könnte ich den Code so erweitern, dass ich für jeden Buchstaben eine (meinetwegen auch unterschiedlich breite) 8-Pixel hohe Grafik definiere, dann die Buchstaben-Grafiken für den Scroll-Text aneinanderfüge und dann spaltenweise von rechts nach links auf das Display schiebe, bis die erste Spalte "links herausfällt" und ich eine neue Spalte rechts "nachschiebe".
Vom Prinzip also einfach, bis auf die Fleißarbeit, die gut 200 Zeichen eines ASCII-Zeichensatzes zu definieren. Vielleicht ginge auch ein Auslesen eines Fonts per selbstgeschriebenem Programm.
Dazu noch ein Web-Interface zur Entgegennahme einer Laufschrift, das sollte auch nicht allzu schwer sein...
Testen der Matrix mit der LedControl-Library
Zuerst will ich aber nur etwas ganz einfaches schreiben, um die Matrix zu testen, ob sie denn überhaupt wie gedacht funktioniert. Dazu greife ich auf die LedControl Library von Eberhard Fahle zurück, die ich schon mal im Einsatz hatte und mit der ich gute Erfahrungen gemacht hatte.Der folgende Source-Code geht einfach nacheinander alle 64 LEDs auf den vier 7219-Devices durch und schaltet die betreffene LED kurz an und aus, um dann zur nächsten zu springen:
4x8x8-LED-7219-Test.ino (klicken, um diesen Abschnitt aufzuklappen)
////////////////////////////////////////////////////////
// (C) 2023 by Oliver Kuhlemann //
// Bei Verwendung freue ich mich über Namensnennung, //
// Quellenangabe und Verlinkung //
// Quelle: https://cool-web.de/esp8266-esp32/ //
////////////////////////////////////////////////////////
#include "LedControl.h" // Lib für 8fach-7Segment-Anzeige mit MAX7219
#define PIN_CLK D8
#define PIN_CS D7
#define PIN_DIN D6
#define ANZ_8x8 4
LedControl lc=LedControl(PIN_DIN, PIN_CLK, PIN_CS, ANZ_8x8); // Anzeige initialisieren // DIN, CLK, CS/LOAD, Anzahl Max7291
void setup() {
for(int i=0; i < ANZ_8x8; i++) {
lc.shutdown(i, false); // MAX7219 aufwecken (schläft zu Beginn)
lc.setIntensity(i, 8); // Helligkeit setzen (0 bis 15)
lc.clearDisplay(i); // Display leeren
}
}
void loop() {
int delaytime = 5;
for(int row=0; row < 8; row++) {
for(int col=0; col < 8; col++) {
for(int i=0; i < ANZ_8x8; i++) {
delay(delaytime);
lc.setLed(i, row, col, true);
delay(delaytime);
lc.setLed(i, row, col, false);
}
}
}
} //end loop()
Wie folgendes Video zeigt, funktioniert die 4fach-Matrix so wie sie soll:
Eine passende Vorlage im Internet finden
Trotzdem frage ich mich, ob nicht jemand anderes schon das selbe vor mir getan hat - schließlich ist die 4fach-8x8-LED-Matrix schon gebräuchlich und Hauptanwendungszweck dafür wird eben eine Laufschrift sein.Also mache ich mich erst einmal auf die Suche nach einem Projekt mit Source-Code, auf dem ich aufsetzen kann...
Mit den passenden Suchbegriffen "8x8 LED Matrix 7219 Laufschrift Scroll Scroller Scrolling Text" bzw. eine Kombination davon mache ich mich also zusammen mit Tante Google auf in die Tiefen des Internets nach einem passenden Beispiel-Projekt...
Marquee Scroller von Qrome
Als erstes stolpere ich über ein Youtube-Video, in dem jemand der Marquee Scroller von Qrome umgesetzt hat. Also gleich einmal dort auf das GitHub-Verzeichnis geschaut und ein bisschen in die gute (aber englischsprachige) Anleitung eingelesen. Der Scroller wird als "Marquee Scroller for Clock, Weather, News and More" angepriesen. Soll also Uhrzeit, Wetter, Nachrichten und mehr anzeigen.Also heruntergeladen und versucht zu kompilieren und gesehen, dass mir eine ganze Reihe an Bibliotheken fehlt. Diese zuerst mit dem Library-Manager aus der Arduino-IDE gesucht und teilweise installiert, dann aber gesehen, dass es Libraries mit dem gleichen Namen gibt, aber von unterschiedlichen Autoren. Wenn man da die falsche erwischt, hagelt es natürlich Fehler.
Ich kann also jedem empfehlen, der Interesse an dem Projekt hat, die Libraries direkt über die Links, die auf der GitHub-Seite des Marquee-Scrollers unter "Loading Supporting Library Files in Arduino" aufgeführt sind, herunterzuladen und händisch über "Sketch / Include Library / Add .Zip Library" in der Arduino IDE zu installieren.
Selbst dann hatte ich noch einen Kompilierungsfehler, der wohl auf einen Versionskonflikt mit den Libraries zurückzuführen war und zwar in dem Modul PiHoleClient.cpp und zwar in den Code-Abschnitten, die in etwa wie folgt aussehen:
Serial.println("Getting Pi-Hole Graph Data");
Serial.println(apiGetData);
http.begin(/*wifiClient,*/ apiGetData);
int httpCode = http.GET();
Wer sich jetzt fragt, was PiHole hier zu suchen hat: Der Marquee-Scroller scheint ein Tausendsassa zu sein. Außer Wetter, News und Uhr anzeigen kann er noch PiHole und den Status des 3D-Drucks (Octoprint für 3D-Drucker) anzeigen.
Das ist aber auch gleichzeitig ein Nachteil, zumindest für mich. Die Verwendung der Wetteranzeige und der Uhrzeit hat der Autor obligatorisch gemacht und verwendet dafür spezielle Dienste, für die man sich anmelden und API-Keys generieren muss. Das ist zwar kostenlos möglich, nervt aber trotzdem. Einfach auf die Wetter-Anzeige verzichten geht nicht, dann kommt nur ein Scroller, dass man sich doch bitte einen API-Key besorgen möchte.
Die Freischaltung meiner API-Keys bei openweathermap.org und timezonedb.com hat etwas gedauert, aber dann endlich verschwand der Fehlertext im Scroller und die Uhrzeit und Temperatur erschienen auf der 4fach-Matrix.
Die Anzeige des Wetters lässt sich auch nur auf die Temperatur begrenzen. Die wird immer angezeigt. Genau wie die Uhr. Und die mindestens eine Minute lang, bevor zum Scrolltext gewechselt wird. Und der kann nur mickrige 60 Zeichen. Das Teil kann so ziemlich alles, was ich nicht brauche, aber das, was ich brauche, nicht gescheit. Außerdem ist es absoluter Overkill.
Wäre ja eigentlich egal, aber das heißt auch massenhaft Code, in dem man suchen muss, um etwas anzupassen, nur um dann eine über das Internet setzbare Laufschrift zu haben. Übrigens scheint die Marquee nur Großbuchstaben zu können, was auch schade ist.
Das folgende Video zeigt, wie ich die Marquee-Software installiere und teste:
MD_Parola von MajicDesigns
Mein nächster Fund war dann die Bibliothek MD_Parola von MajicDesigns, die außerdem die Bibliothek MD_MAX72XX vom selben Autor voraussetzt, beides auf GitHub verfügbar. Beide Libraries waren schnell downgeloaded und über die Zip-Funktion in der IDE installiert.Als erstes habe ich dann mal das Beispiel MD_Parola/examples/Parola_Scrolling_ESP8266/ ausprobiert. Das war nicht sonderlich lang und sollte doch vom Name her das richtige für meine Bedürfnisse sein.
Das Ergebnis war dann allerdings nicht sehr befriedigend und sah eher wie eine Alien-Schrift aus, die irgendwie von links nach rechts und spiegelverkehrt scrollte.
Als ich dann über das übersichtliche Web-Interface einfach nur "Hallo" als Scrolltext eingebe, lässt sich die Sache besser analysieren. Es sieht so aus, als ob jedes der vier 8x8-Panels für sich in Spiegelschrift von links nach rechts scrollt (siehe Video unten).
Im Grunde macht er ja schon mal was und gibt den richtigen Text aus, nur halt auf die falsche Art und Weise.
Da hilft alles nichts, da mus sich mich tiefer in den Sourcde-Code fuchsen... Und siehe da, relativ weit oben treffe ich auch schon auf einen vielversprechenden Abschnitt:
// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers are for ESO8266 hardware SPI and will probably not
// work with your hardware and may need to be adapted
//#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
//#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN D5 // or SCK
#define DATA_PIN D7 // or MOSI
#define CS_PIN D6 // or SS
// HARDWARE SPI
//MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// SOFTWARE SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
Ich schaue ins Header-File und finde als mögliche Definition noch GENERIC_HW. Hey! Das hört sich doch nach "normal" an. Also flugs den Wert ausgetauscht und was passiert? Siehe Video: nun scrollt es Displayweise von oben nach unten und zwar um 90° gedreht. Das scheint mir auch nicht das richtige zu sein.
Erfolg habe ich dann mit der Hardware-Definition FC16_HW. Damit scrollt er endlich wie gewünscht von rechts nach links - eben ganz normal.
Jetzt wird auch klar, was der "Alien-Text" am Anfang heißen sollte: "192:168:000:033" war die vom DHCP-Server zugewiesener IP-Adresse des Scrollers, unter dem er im WLAN im Browser zu erreichen ist. Ist durchaus sinnvoll, das anzuzeigen. Auch wenn die Schreibweise ein wenig ungewöhnlich ist.
Damit ist dieser Scroller schon mal eine sehr gute Grundlage und braucht nicht mehr allzuviele Anpassungen, um ihn so zu machen, wie ich es denn gerne hätte. Kleinbuchstaben kann er schonmal von Haus aus - sehr schön.
Auch hier gibt es wieder ein Video davon, wie ich den Sketch installiere und ausprobiere:
Löten, Drucken, Basteln
Nachdem die Hardware funktioniert und eine zufriedenstellende Software-Grundlage gefunden ist, darf die (doch recht einfache) Schaltung den Prototyping-Status verlassen und ein wenig aufgehübscht werden.ESP8266 und 4fach-8x8-LED-Matrix sollen miteinander fest verlötet werden und ein Gehäuse bekommen.
Das Gehäuse soll aus dem 3D-Drucker kommen, so wie ich das immer mache und zumindest die Front vorne soll halbdurchsichtig rot sein. Zum Glück habe ich noch etwas von dem passenden Filament.
Normalerweise designe ich meine Gehäuse ja selbst, aber bei dem Marquee-Projekt bin ich über einen Link zu einem Thingiverse-Projekt gestoßen. Qrome, der Autor der Weather-Marquee-Firmware hat auch ein passendes Gehäuse entworfen und auf Thingiverse bereitgestellt. Das sieht auf den Fotos auch ganz ansehnlich aus und trifft meinen Geschmack. Wozu also noch selbst etwas entwerfen, wenn es schon was fertiges gibt.
Während ich also noch an der Softwareanpassung feile und die Hardware zusammen löte, läuft schon fleißig der 3D-Drucker und fabriziert das Gehäuse. Stolze 3 1/2 Stunden soll die Basis it 10% Infill dauern. Gut, wenn man dann damit frühzeitig anfängt. Kleiner Warnung: weiterlesen, bevor ihr jetzt den Druck startet. Es kommt noch etwas!
Als Basis und Backplate fertig gedruckt sind, halte ich Microcontroller und Panel schon mal so grob dran, damit ich weiß, wo was im Gehäuse hingehört und wie lang die Kabel sein müssen.
Dabei merke ich schon mal, das die Maße nicht ganz perfekt zu sein scheinen. Zumindest der D1 mini wackelt ein bisschen in dem dafür vorgesehenen Fach. Doch besser zu weit als zu eng. Das kann man mit ein bisschen Klebeknete schnell und einfach ausgleichen.
Dann geht es an den Löttisch und der neue Lötkolben darf zeigen, was er kann. Ja, geht gleich viel flotter mit 75 statt 25 Watt und die neue Lötspitze taugt auch. Macht Spaß, der neue Lötkolben. Für die Verbindung habe ich ein 6-adriges Kabel genommen, ein Kabelrest aus einer alten Netzwerkleitung. Da ich nur 5 Adern brauchen, habe ich schwarz und gelb zusammengelötet, damit Ground mehr Saft übertragen könnte, nicht dass das unbedingt nötig wäre - schadet aber auch nicht.
Beim Einbau merke ich dann später, dass das Kabel doch ein wenig steif ist, aber irgendwie geht es dann schon.
Und als ich die Schutzfolien von den vier Matrizen abgezogen habe und sie ins Gehäuse einsetzen will, bemerke ich, dass sie einfach nicht reinpassen. Unten ist es einfach zu eng. Jedesmal verbiegt sich ein Panel, wenn ich es versuche. Was für eine Schande.
Da die Front nur zwei Layer dick ist (0.4 mm) kann ich da nicht mit dem Teppichmesser, Bastelmesser oder Skalpell herummachen. Ich würde höchstwahrscheinlich durch die Front stechen, was doof aussehen würde.
Aber irgendwie muss ich unten im Gehäuse, da wo man gaaanz schlecht hinkommt, mehr Platz schaffen. Da ich ansonsten eh neu drucken müsste, versuche ich die fehlenden 2 Millimeter, mehr sind es wohl nicht dadurch zu gewinnen, dass ich mit meiner Heißluftpistole auf 130 °C das Plastik an der betreffenden Seite ein paar Sekunden lang erhitze und dann mit dem Pinzettenende flach drücke. Da das Infill nur 10% hat, wird das damit gestaucht und es gibt ein wenig mehr Platz. Dabei wir natürlich auch die "Haut", also die Zwei-Layer-Front gezogen, was ganz leichte Welle gibt, mit denen ich noch leben könnte.
Ich gebe mir allergrößte Mühe, das zu richten, damit ich nicht noch einmal 3 1/2 Stunden auf den Druck warten muss.
Irgendwann verliere ich dann allerdings doch die Geduld und ärger mich über den Designer des Teils, dass er es zu eng (und für den ESP8266 zu weit) gemacht hat. Das Gehäuse kann in den Müll und ich stoße einen neuen Druck an, diesmal mache ich das Gehäuse um 3 mm breiter, Höhe und Tiefe bleiben. Nochmal 3 1/2 Stunden warten, danke! Hätte ich es mal gleich selbst designt.
Nachdem ich 3 1/2 Stunden Zeit hatte, mich wieder zu beruhigen, versuche ich das breitere Gehäuse und diesmal passt alles - naja, bis auf den Deckel, der ist jetzt natürlich 3 mm zu schmal. Aber da der eh mit zwei Schrauben befestigt ist, ist der kleine Luftspalt auf der Rückseite, den keiner sieht, nicht weiter schlimm. Das lasse ich einfach so. Genug Filament verschwendet.
Über meine Bastelei gibt es auch ein Video:
Das Ergebnis

Der Scroller ist fertig und ich kann ihn im Prinzip überall aufstellen, wo ich will. So ein richtiger Verwendungszweck ist mir noch nicht eingefallen.
Vielleicht nehme ich ihn für meine Youtube-Videos her, um das Thema des Tages einzublenden, dann bräuchte er allerdings noch ein paar Keile drunter, damit er schräger steht.
Vielleicht stelle ich ihn mir auch nur irgendwo hin und zeige mir Motivationsnachrichten an. Aber ein Scroller für einen selbst ist irgendwie wie ein Selbstgespräch: ziemlich überflüssig. So eine Laufschrift macht doch mehr Sinn, wenn sie andere sehen.
Momentan habe ich keine wirkliche Verwendung, aber es kommt bestimmt bald der Tag, wo ich das Teil brauchen kann und dann froh bin, eins zu haben - wie bei so vielen von meinen Projekten.