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
  2. Verwendete Materialen
  3. Aufbau der Schaltung
  4. Programmierung
  5. Integration in ioBroker

 

 

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!

Matthias Korte

Hauptberuflich Software-Entwickler und seit einigen Jahren Smart-Home Fan. Angefangen hat alles mit einem RaspberryMatic und einer schaltbaren Steckdose. Mittlerweile habe ich einige Steckdosen, Sensoren, und Thermostate sowie ioBroker zur Visualisierung im Einsatz.

36 Gedanken zu „ESP8266 Max7219 MQTT Matrixdisplay für ioBroker

  • 21. März 2019 um 17:34
    Permalink

    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

    Antwort
    • 22. März 2019 um 6:18
      Permalink

      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")) {

      Antwort
  • 5. April 2019 um 12:03
    Permalink

    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

    Antwort
    • 8. April 2019 um 20:34
      Permalink

      Hallo Paul,

      ich kann Dir folgendes Display empfehlen:

      Damit kannst Du die Displays durch „Umbiegen“ der Pins wunderbar verbinden.

      Viele Grüße,
      Matthias

      Antwort
  • 15. April 2019 um 16:53
    Permalink

    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

    Antwort
    • 16. April 2019 um 20:02
      Permalink

      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

      Antwort
  • 27. Mai 2019 um 10:47
    Permalink

    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?

    Antwort
    • 29. Mai 2019 um 14:44
      Permalink

      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

      Antwort
  • 25. Juni 2019 um 11:51
    Permalink

    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.

    Antwort
    • 25. Juli 2019 um 8:48
      Permalink

      für mich wäre es interessant und ich würde mich darüber freuen 🙂

      Antwort
      • 5. August 2019 um 11:45
        Permalink

        Hi, ich würd mich auch für die Variante mit statischem Modus interessieren – gibt es da schon einen Fork?

        Antwort
    • 20. September 2019 um 20:06
      Permalink

      mich würde auch die Variante mit statischem Modus interessieren – gibt es da schon einen Fork?

      Antwort
    • 21. September 2019 um 16:51
      Permalink

      mich würde auch die Variante mit statischem Modus interessieren – ist es schon auf GitHub hochgeladen?

      Antwort
    • 20. März 2020 um 22:16
      Permalink

      Hallo Paul,

      wie hast Du denn den MQTT Topic Modus eingebaut und wie kann ich im Sketch verschiedene Modi implementieren. Ich würde mich freuen, wenn Du mich hierbei unterstützen kannst.

      Vielen Dank schon einmal,
      matze

      Antwort
  • 20. Juli 2019 um 19:21
    Permalink

    Was ist mit dem Port für MQTT ?
    Kann der ignoriert werden im Sketch ?

    Antwort
    • 6. August 2019 um 16:16
      Permalink

      Der steht im Sketch drinne. Unter void setup()
      „client.setServer(mqtt_server, 1883);“

      BeidE

      Antwort
  • 6. August 2019 um 8:01
    Permalink

    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

    Antwort
  • 6. August 2019 um 10:39
    Permalink

    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

    Antwort
  • 14. August 2019 um 13:53
    Permalink

    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

    Antwort
  • 4. September 2019 um 8:12
    Permalink

    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

    Antwort
  • 4. September 2019 um 8:47
    Permalink

    Hallo,

    ist es auch möglich das Programm auf einem Raspberry Pi zu betreiben also nicht auf einem Wemos?

    MFG

    Antwort
  • 24. September 2019 um 9:59
    Permalink

    Leider gehen mit dem Sketch auch keine Umlaute 🙁

    Antwort
  • 25. September 2019 um 20:57
    Permalink

    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

    Antwort
    • 10. Januar 2020 um 15:57
      Permalink

      Hallo Ulf,

      danke für den Hinweis, hatte das gleiche Problem. Etwas kürzer und die praktische Schleife mit der Anzahl der Matrizen kann bleiben:
      matrix.setRotation(matrixIndex, 3);

      Grüße

      Antwort
  • 28. Oktober 2019 um 5:43
    Permalink

    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!

    Antwort
    • 29. Oktober 2019 um 6:20
      Permalink

      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

      Antwort
      • 29. Oktober 2019 um 18:21
        Permalink

        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

        Antwort
  • 12. Dezember 2019 um 18:44
    Permalink

    Hat auf Anhieb funktioniert, obwohl ich vorher mich damit noch nicht beschäftigt habe. Vorallem Arduino ide kannte ich gar nicht.
    Top Anleitung
    Ein wirklich sehr schönes Projekt.
    Mit einen ganz kleinen Shript im Iobroker hab ich zb mir die Temp von meinen HM Thermostaten anzeigen gelassen.

    Danke für deine Mühe

    Antwort
    • 12. Dezember 2019 um 19:31
      Permalink

      Danke für das Lob 🙂

      Antwort
  • 18. Dezember 2019 um 16:22
    Permalink

    Gibt es eine Chance auch Umlaute darzustellen ?
    Die Anzeige funktioniert soweit gut und geänderte Zustande werden schön über MQTT gepusht.
    Mir fehlt eigentlich nur zur Temperatur und Feuchtigkeit die Sonderzeichen.

    Danke für die Anleitung hier.

    Antwort
  • 29. Dezember 2019 um 23:25
    Permalink

    Hi,

    erstmal danke für die Beschreibung.
    Klappt bis zu einem Punkt alles super.
    Es startet alles und er subscribed auch zu meinen Broker auf dem Home Assistant.
    Nur wen ich dann eine Nachricht schicke, passiert rein gar nichts, also ich kann sehen das MatrixDisplay2/text payload „test“ im Broker ankommt, weil wenn ich da reinschaue sehe ich den payload test.
    Aber im Display passiert nicht, eine Idee was es sein könnten ?

    Antwort
  • 18. März 2020 um 22:22
    Permalink

    Hallo Matthias Korte,

    Danke für die Beschreibung. Gern möchte ich verschiedene Scroll-Effekte aus der MD_Parola Bibliothek in das Skript einbinden. Ich stelle mir vor, über einen Datenpunkt im ioBroker den Scoll-Modus festzulegen (Nummer) und dann ebenfalls per mqtt zu übertragen.

    Mir fehlt derzeit jedoch der Ansatz, wie ich die verschiedenen Scroll Effekte aus der MD_Parola in Dein Skript einbinden kann.

    Für einen Denkanstoß / ein Beispiel bin ich Dankbar.

    Viele Grüße,
    matze

    Antwort
  • 22. März 2020 um 18:05
    Permalink

    Hallo und Danke erstmal für die Tolle Arbeit!
    Die Laufschrift läuft bei mir soweit auf einem Einzeiligem Display mit 8 Modulen.

    Nun wollte ich gleich mal mehrzeilige Displays probieren und habe auf 2 x Vertikal und 8 x Horizontal upgegradet.

    Die Schrift läuft auch so weit schön Zentriert nur halt mit der gleiche Schriftgröße.
    Nu habe ich den Wert Schriftgröße mal geändert, aber das einzige was sich ändert ist der Abstand der einzelnen Buchstaben.
    Wie schaffe ich es das die Schrift wirklich größer wird ?
    Habe mich auch schon mit dem Wert bei matrix.height gespielt aber da verschiebe ich nur die Vertikale position.

    Hätte jemand eine Tipp für mich?
    Vielen Dank

    Antwort
  • 22. März 2020 um 19:18
    Permalink

    Hallo und erstmal danke für das tolle Projekt!
    Habs auch gleich mal umgesetzt und funktioniert soweit.

    Wollte jetzt mal etwas probieren und habe mal 2×8 Displays zusammengeschlossen.
    Das läuft soweit auch ganz gut.
    Das einzige was ich nicht schaffe das ich eine Größere Schrift bekomme.
    Wenn ich die im Sketch ändere wird nur immer der Abstand zwischen den einzelnen Buchstaben größer aber nicht der Buchstabe selbst. Der ist immer 7 Pixel groß.
    Wie könnte ich die Schrift selbst größer machen?

    Vielen Dank
    Roli

    Antwort
  • 1. April 2020 um 9:13
    Permalink

    Vielen Dank für die Anleitung.
    Wäre auch sehr daran interessiert wie man zwischenzeitlich eine statische Anzeige realisieren kann, also zB die Uhrzeit für ein paar Minuten. Bin noch recht neu auf dem Gebiet.

    Beste Grüße
    Christian

    Antwort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.