ESP8266 Max7219 MQTT Matrixdisplay für ioBroker
In diesem Artikel zeige ich Dir, wie Du dir ein LED-Matrix Display für Dein Smart-Home bauen kannst.
Inhaltsverzeichnis
1. Einführung
In diesem Artikel wollen wir ein ESP8266 LED Matrixdisplay aufbauen und programmieren, welches wir über ioBroker steuern können. Als Display verwende ich mehrere Max7219 Displays mit 8×8 Punkten. Um eine Zeichenkette übersichtlich und damit gut lesbar darzustellen, sollen mindestens 12 Display-Module hintereinander geschalten werden. Am Display soll der Text, die Helligkeit und die Geschwindigkeit des Lauftextes per MQTT-Nachricht gesteuert werden können. Im nächsten Kapitel liste ich zunächst die verwendeten Materialen auf.
2. Verwendete Materialen
Für die Entwicklung des Displays habe ich folgende Materialen verwendet:
3. Aufbau der Schaltung
Der Aufbau der Schaltung ist relativ einfach. Für die Stromversorgung werden die 5V des ESP8266 an das Display angeschlossen.
Die restlichen Pins werden wie folgt angeschlossen:
Matrix | ESP8266 |
VCC | 5V (VIN) |
GND | GND |
DIN | D7 |
CS | D3 |
CLK | D5 |
Den Grundaufbau habe ich auf einem Breadboard aufgebaut. In einem späteren Schritt (im Artikel nicht enthalten), wird für das Display noch ein passendes Gehäuse gebaut. Die einzelnen Displays lassen sich relativ einfach in Reihe schalten. Wichtig ist dabei drauf zu achten dass immer Out -> in geschalten wird.
4. Programmierung
Für die Programmierung des Matrix-Displays müssen wir im ersten Schritt die benötigten Bibliotheken für GFX, das Max7219-Display sowie für die MQTT-Anbindung installieren.
Bibliotheken im Bibliotheksverwalter:
- Adafruit_GFX
- PubSubClient
Hinweise zur Installation von Bibliotheken
Installation von Bibliotheken über den Bibliotheksverwalter
Bibliotheken über Github
Hinweise zur Installation von Bibliotheken
Manuelle Installation von Bibliotheken ohne den Bibliothekenverwalter
Im nächsten Schritt erstellen wir uns in Arduino einen neuen Sketch und kopieren den folgenden Code in den Sketch:
Im folgenden Diagramm wird der Ablauf grob erklärt:
Das Script beginnt mit den Include-Anweisungen für die eingesetzten Bibliotheken. Nach den Include-Anweisungen folgt der Konfigurationsblock, mit dem die Pin- und Displaykonfiguration gesetzt wird. In meinem Beispiel werden 12 Module nebeneinander (horizontal) eingesetzt. Zudem werden hier die WiFi-Einstellungen sowie die IP-Adresse des MQTT-Brokers (IP von ioBroker) definiert. Abschließend werden noch Standardwerte für die Geschwindigkeit, Helligkeit und Schriftgröße des Displays gesetzt.
Mit der Methode „setup_wifi“ wird eine WiFi-Verbindung aufgebaut. Der Fortschritt des Verbindungsaufbaus wird über die serielle Schnittstelle ausgegeben. Bei einem erfolgreichen Verbindungsaufbau wird zudem die IP-Adresse des Displays über die serielle Schnittstelle ausgegeben.
Die Methode „setup“ initialisiert das Display mit den Standardwerten und richtet die Displays entsprechend aus. Dazu die Methode setRotation des matrix-Objekts aufgerufen. Nach der Initialisiertung des Displays wird die WiFi-Verbindung hergestellt und die Verbindung zum MQTT-Broker aufgebaut. Zudem wird die Callback-Methode gesetzt.
Mit der Methode „MQTTCallback“ wird auf eine Veränderung der abonnierten MQTT-Datenpunkte reagiert. Dazu wird der Topic sowie der Inhalt der Nachricht analysiert und entsprechend die Konfiguration des Displays verändert. Folgende Datenpunkte werden vom Broker abonniert:
- MatrixDisplay2/text
- MatrixDisplay2/intensity
- MatrixDisplay2/scrollwait
Die Methode „printMatrix“ erstellt die Laufschrift mit der hinterlegten Konfiguration.
Mit der „reconnect“ Methode wird in der loop-Methode überprüft ob eine WiFi-Verbindung vorhanden ist. Zudem wird die Verbindung zum MQTT-Broker hergestellt.
5. Integration in ioBroker
Die Integration in ioBroker ist wie immer extrem einfach. Im Bereich Objekte unter dem Ordner mqtt.0 habe ich einen weiteren Ordner „MatrixDisplay2“ angelegt, in dem nun die einzelnen Datenpunkte zur Steuerung des Displays gespeichert werden. Ich habe die Datenpunkte mit dem Tool „MQTTBox“ vorab publiziert und angelegt.
Nun lässt sich die Matrix über die oben gezeigten Datenpunkte steuern und konfigurieren.
Ich hoffe Dir gefällt der Artikel ? Ich freue mich über Deinen Kommentar!
Hallo Matthias,
für mein MQTT auf dem IoBroker habe ich Username und Password vergeben. Von daher bekomme ich immer im IoBroker eine Fehlermeldung im Log.
Wie kann ich im Source Code Username und Password integrieren?
Danke und Grüße,
Claus
Moin Claus,
für die Verwendung von Username und Passwort musst Du in Zeile 88 die Angaben an die connect() Methode übergeben:
if (client.connect(clientId.c_str(),"MyUsername","MyPassword")) {
Hallo,
ein tolles Projekt. Ich möchte das gerne nachbauen und überlege gerade, wie ich am besten die Displays miteinander verbinde.
Hast du dafür die eigentlichen LED Panels vom Controller gelöst, u- förmige Haken eingesetzt und dann von der Rückseite gelötet?
Hast du davon vielleicht noch ein Foto.
Schönen Gruß
Paul
Hallo Paul,
ich kann Dir folgendes Display empfehlen:
https://amzn.to/2Kke8ok
Damit kannst Du die Displays durch „Umbiegen“ der Pins wunderbar verbinden.
Viele Grüße,
Matthias
Hi! Klasse Anleitung, danke dafür. Mein Lauftext ist sehr verschwommen.
Was muss ich im Script ändern um einen statischen Text abzubilden?
Danke.
Gruß
Martin
Hallo Martin,
der Code ist speziell für die Laufschrift ausgelegt. Schau Dir mal die Schleife an, hier müßtest Du nun statisch eingreifen und den Text an die entsprechende X-Position zeichnen.
Viele Grüße,
Matthias
Hallo, wie funktioniert die Schaltung, wenn man 2x 12 Module schalten möchten. Das Heißt 12 Module horizontal und 2 Module Vertikal. Habe schon probiert die untere Reihe einfach hinter die obere zu hängen, dabei werden jedoch nur die oberen Module bespielt?
Hallo Fabian,
die Module müssen hintereinander und dann die Variable „numberOfVerticalDisplays “ auf 2 gesetzt werden. So würde ich es mal probieren.
Viele Grüße,
Matthias
Hallo Matthias,
ich habe das Display jetzt endlich fertig gebaut und in ioBroker integriert.
Habe bei Thingiverse ein schönes Case drucken lassen.
Ich habe zusätzlich noch das MQTT Topic Modus eingebaut.
Modus 0 ist der normale Scrolltext wie bei dir und Modus 1 ist statisch.
So lasse ich normalerweise im Modus 1 die Uhrzeit anzeigen und alle 3 Minuten kommt der Scrolltext mit den aktuellen Raumtemperaturen oder Benachrichtigungen.
Ich werde mal gucken das als Fork bei GitHub hochzuladen. Vielleicht ist sowas ja auch für andere Interessant.
Jedenfalls vielen Dank für diese tolle Anleitung.
für mich wäre es interessant und ich würde mich darüber freuen 🙂
Hi, ich würd mich auch für die Variante mit statischem Modus interessieren – gibt es da schon einen Fork?
mich würde auch die Variante mit statischem Modus interessieren – gibt es da schon einen Fork?
mich würde auch die Variante mit statischem Modus interessieren – ist es schon auf GitHub hochgeladen?
Was ist mit dem Port für MQTT ?
Kann der ignoriert werden im Sketch ?
Der steht im Sketch drinne. Unter void setup()
„client.setServer(mqtt_server, 1883);“
BeidE
Ganz ganz herzlichen Dank für diese tolle Anleitung !!!
Ich werde sie als „Jumbo – LED-Uhr“ einsetzen.
Hierfür habe ich auch zwei Zeilen Module benötigt.
Hierbei ist mir dann aufgefallen, dass die zweite Zeile nur „Müll“ anzeigt.
Der „Fehler“ (der keiner ist) war schnell gefunden.
Zeile 109 müsste noch folgender Maßen geändert werden:
IST: for (int matrixIndex=0 ; matrixIndex < numberOfHorizontalDisplays ; matrixIndex++ )
MÜSSTE: for (int matrixIndex=0 ; matrixIndex < ((numberOfHorizontalDisplays)*(numberOfVerticalDisplays)) ; matrixIndex++ )
Damit auch die LED Matrix der zweiten (dritten…) Zeile gedreht wird.
Liebe Grüße
Kann man dem Display (dem ESP-Chip) auch eine statische IP Adresse zuweisen?
(bzw. in welcher „.H Datei“ muss ich es eintragen?)
Grüße
BeidE
Hallo Matthias,
habe die Matrix nachgebaut. MQTT funktioniert und die Daten werden im seriellen Monitor auch angezeigt aber die Matrix zeigt nichts an. Gibts einen Befehl zum ein/ausschalten der Matrix? Verkabelung ist hab ich 3x kontrolliert, die ist richtig…
Was könnte das Problem sein?
MfG
Moin Mathias,
ich kämpfe als Newbie gerade mit deinen Programmzeilen.
Ich war in der Lage die Bibliotheken einzubinden, das Programm zu kompelieren und in den Wemos D1 mini zu übertragen.
Nach der Nennung von SSID und PW taucht der Wemos auch eine IP-Adresse in meinem Netzwerk zugewiesen.
Allerdings war es das dann auch fast schon. Es liefen Punkte durch, doch sah es doch ein wenig seltsam aus. Daraufhin habe ich deinen Quellcode wie folgt abgeändert:
Zeile 32 geändert von String MatrixText = „…“; nach String MatrixText = „Hallo“;
Es sieht so aus als wenn der Text in jedem LED-Matrix-Baustein startet und durchläuft, immer mehrere gleichzeitig und dann durchläuft. Schwierig zu erklären, sieht auf jeden Fall nicht richtig aus.
Die Hardware habe ich inzwischen getauscht bzw. verprobt. Den Wemos als auch den 8er Matrixstreifen getauscht bzw. mit einer anderen Software laufen lassen.
Zur Zeit habe ich keine Ahnung wo ich mit der Fehlersuche starten soll / muss und bitte um Unterstützung.
Mit freundlichen Grüßen
Ulf
Hallo,
ist es auch möglich das Programm auf einem Raspberry Pi zu betreiben also nicht auf einem Wemos?
MFG
Nein
Leider gehen mit dem Sketch auch keine Umlaute 🙁
Ich antworte mir einfach mal selber….
Nach unendlichen Versuchen habe ich die Stelle gefunden die bei mir für „Verdrehung“ gesorgt hat.
Folgende Befehlszeile
matrix.setRotation(matrixIndex, 1); //Erste DOT Matrix Drehen
habe ich durch
matrix.setRotation(0, 3); //Erste DOT Matrix Drehen
matrix.setRotation(1, 3); //Zweite DOT Matrix Drehen
matrix.setRotation(2, 3); //Dritte DOT Matrix Drehen
matrix.setRotation(3, 3); //Vierte DOT Matrix Drehen
matrix.setRotation(4, 3); //Fünfte DOT Matrix Drehen
matrix.setRotation(5, 3); //Sechste DOT Matrix Drehen
matrix.setRotation(6, 3); //Siebte DOT Matrix Drehen
matrix.setRotation(7, 3); //Achte DOT Matrix Drehen
ersetzt. (Bei mir sind es acht DOT Matrix in einer Zeile).
Vielleicht hilft es ggf. noch dem einen oder anderen.
Gruß Ulf
Hello Matthias,
Great project, sketch working perfectly, I managed to make it to correctly login with user/pass on my MQTT Home assistant broker.
Current status:
-on the Arduino serial monitor it shows me „subscribe objects“
-on the matrix display three dots scrolls in a loop.
-on the MQTT broker log it shows „New client connected from x.x.x.x as Matrix-xxxx“
Now, is there any way to used it with homeassistant? any suggestion about how to write status messages on it and/or what to add in the configuration.yaml ?
Thank you very much for your help!
Hi Anthony,
thank you for your comment. The matrix use mqtt broker to get the data. So you can use homeassistant, too. Make sure your mqtt broker works / is configurated in homeassistant.
Please give me more information when it works, so other user can benefit.
Best regards,
Matthias
Dear Matthias,
The MQTT broker on home assistant works flawlessy, it already receive messages from several NodeMCU+DHT22 acting as temperature probes around the house, and other NodeMCU with Tasmota firmware acting as multiple remote relays.
The MQTT broker is configured inside the configuration.yaml file.
What I’m trying to do is to make an entry inside configuration.yaml to make HA recognise the entity „display“ (or whatever name, so that it could be possible to send messages to the nodemcu+max7219 thru a new automation).
Any suggestion of the code portion to insert ?
Thank you anyway for your very fast answer.
Anthony