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.

26 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. 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
  • 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

Schreibe einen Kommentar

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

Ich akzeptiere