DIY LED Matrix im Eigenbau

Vor zwei oder drei Jahren wurde mir das erste Mal beim Weihnachtsshopping eine LED-Matrix als Geschenkidee vorgeschlagen. Mit 160,- Euro fand ich den Spaß arg teuer. Auch die knapp 50,- Euro für die günstigere Variante von Ulanzi, der TC001 wollte ich irgendwie nicht springen lassen. Für (im besten Fall) noch ein bisschen weniger Geld und mit dem Spaß eines Bastelprojekts habe ich mich nun dran gewagt mir sowas selbst zu basteln.

Im Kern kommen vier 8x8er RGB LED Matrixen und ein ESP32-WROOM-32D zum Einsatz. Ähnliche Komponenten wie wohl auch in der TC001 verbaut. Als Software verwende ich die „Awtrix 3“-Bibliothek (vormals „Awtrix light“, im Kern aber die gleiche Software). Das ist eine aktive OpenSource-Weiterentwicklung der Awtrix-Bibliothek, einer Software für eine inzwischen wieder eingestellte LED Matrix.

Unten: Die LED-Panele befinden sich eingeklemmt hinter dem Gitter, welches für den groben Pixel-Look sorgt

Um Geld zu sparen, kommt das Gehäuse aus dem 3D-Drucker. Es wurde selbst designed und ist extrem minimalistisch gehalten. Zentraler Punkt sind die Gitter, hinter welche die kleinen LED-Panels geklemmt werden können. Die Gitter selbst können dann mit kleinen Haken an der Ober- bzw. Unterseite ineinander gehangen werden. Das Ganze fügt sich dann wieder rum in das Gehäuse ein, welches dann durch eine dünne Front verkleidet wird. (Fast) Fertig ist LED-Matrix.

Auf der Rückseite habe ich den ESP32 festgeklebt und verlötet. Strom kommt über USB und geschaltet werden kann die Anzeige über einen kleinen Schalter an der Unterseite. Apropos Strom: Die Displays sind recht energiehungrig und emittieren je nach Helligkeit einiges an Wärme. Das sollte man im Blick haben: Zum einen damit das Gehäuse sich nicht verformt. Zum Anderen sollte ein entsprechend starkes Netzteil angeschloßen und im Querschnitt nicht zu dünne Kabel verwendet werden.
Da ich bei meiner günstigen Variante keine Schalter und Sensoren verbaue, fehlt der Software beim ersten Start somit auch die Information über die Raumhelligkeit. Entsprechend hell werden die Panels also beim ersten Start angesteuert.

Erster Start: Die Matrix zeigt nur wirre Zeichen. Das lässt sich über eine Konfiguration korrigieren

Am Ende komme ich bei knapp unter 22,- Euro raus. Neben den reinen Elektrokomponenten einberechnet ist auch der Strom für den 3D-Drucker, der so ca. 17 Stunden lang gedruckt hat. Außerdem anteilig etwas für das PLA, die Kabel und den verwendeten Kleber um die beiden Hälften zu vereinen.

Am Ende bin ich echt zufrieden mit dem Ergebnis. Die Anzeige sieht schlicht aus, die Dot-Matrix-Ansicht sieht ordentlich aus. Wenn ich es mir wünschen könnte, hätte ich es gerne einen ticken schärfer an den Kanten gehabt. Aber das ist kein Problem, solange man nicht direkt mit der Nase vor der Anzeige steht.

3D-Druck & Dateien

In meinem Video seht ihr alles Wichtige zum Aufbau und der Konfiguration. Auch wie ihr die Displays ans Laufen bekommen könnt, wenn diese nach dem ersten Start nur Unfug anzeigen. Wenn ihr das Gehäuse selbst in euren 3D-Drucker packen wollt, findet ihr hier den Download. Bitte beachtet: Das ist natürlich jetzt absolut Custom-Made. Will sagen. Wenn eure LED-Panel bspw. leicht andere Dimensionen haben kann es sein, dass es schon nicht mehr passt und ihr den Druck selbst modifizieren müsst.

Zum Download stelle ich zwei Dateien. Der erste Download enthält eine STL-Dateien mit dem gesamten Modell. Im zweiten ZIP-Archiv befinden sich alle Elemente einzeln. Nutzt, womit ihr besser klar kommt.

Ansteuern der Awtrix 3

Nachdem das erste Video mit dem Zusammenbau der Matrix viele Leute interessiert hat, erkläre ich in einem zweiten Video betont anfängerfreundlich, wie die Matrix angesprochen wird. Mit dabei Infos, wie man eigene Apps gestaltet oder die eingebauten Effekte nutzt. Teil des Videos sind auch die folgenden Scripte, welche den Funktionsumfang eurer Matrix mit nützlichen Infos erweitern und vielleicht der Einstieg in eigene Erweiterungen sein könnten.

Python-Script: YouTube Abos

In diesem Zustand fungiert die Matrix rein als Display. Mit anderen Worten: Sie kann nix, abgesehen von der Uhrzeit und Datumsanzeige. Inhalte können aber ja einfach über die HTTP-API oder mittels MQTT überspielt werden. Für meinen Fall – ich möchte die Abozahlen meines YouTube-Kanals anzeigen – hilft mir dafür folgendes Python-Script:

import requests
import time

# YouTube API Informationen
youtube_api_key = "xxx"
channel_id = "xxx"

# Awtrix Light Matrix Informationen
awtrix_ip = "192.168.xxx.xxx"


def get_subscribers_count(api_key, channel_id):
    url = f"https://www.googleapis.com/youtube/v3/channels?part=statistics&id={channel_id}&key={api_key}"
    response = requests.get(url)
    data = response.json()
    subscribers = int(data["items"][0]["statistics"]["subscriberCount"])
    return subscribers

def send_app_to_awtrix(app_name, text, icon, duration):
    headers = {"Content-Type": "application/json"}
    data = {
        "text": text,
        "icon": icon,
        "duration": duration
        "lifetime": 600
    }

    awtrix_url = "http://"+ awtrix_ip + "/api/custom?name=" + app_name
    response = requests.post(awtrix_url, json=data, headers=headers)
    
    if (response.text != "OK"):
        print(response.text)

    time.sleep(duration * 4)

def host_available():
    try:
        result = subprocess.run(['ping', '-c', '1', awtrix_ip], capture_output=True, text=True, timeout=5)
        return result.returncode == 0

    except subprocess.TimeoutExpired:
        print(f"Timeout: {awtrix_ip} is not reachable")


def main():
    while True:
        try:
            if host_available:
                subscribers = get_subscribers_count(youtube_api_key, channel_id)
                send_app_to_awtrix("youtube", f"{subscribers}", 7320, 15)
            
            time.sleep(300)
        except Exception as e:
            print(f"Fehler: {e}")
            time.sleep(60)

if __name__ == "__main__":
    main()

In dem Code wird ein Icon mit der ID 7320 verwendet. Dazu sei gesagt: Über das Webinterface der Awtrix Light-Bibliothek lassen sich unter dem Punkt „Icons“ vorgefertigte Grafiken importieren. Diese stammen von developer.lametric.com, können dort ausgewählt und nutzerfreundlich eingespielt werden. Ach ja, und um die YouTube-API nutzen zu können, müsst ihr euch zunächst für die Nutzung bei Google freischalten. Kostet aber nix.

Python-Script: Wetter via OpenWeatherMap

Nicht jeder unterhält einen YouTube-Kanal, aber bei überall gibt’s Wetter! Und so möchte man vielleicht Informationen wie die aktuelle Temperatur oder ob sich Regen nähert auf der Matrix anzeigen. Als Datenquelle kann dafür super die OpenWeatherMap dienen. Wer es nicht kennt: OWM ist inzwischen ein alter Hase wenn es darum geht, über eine (für die kleine Nutzung) kostenfreie API Wetterdaten für beliebige Standorte zu liefern. Einfach kurz mit E-Mail-Adresse anmelden, API-Key kopieren und los geht’s. Folgendes Python-Script holt sich Wetterinformationen von einem bestimmten Standort mittels Geo-Koordinaten und sendet das aktuelle Wetter mit Icon und Temperatur an die Awtrix:

import requests
import time

# OpenWeatherMap API Informationen
api_key = "..."
lat = "50.93"
lon = "6.95"

# OpenWeatherMap Icon -> Awtrix Icon
condition_mapping = {
    "01d": 1630,
    "01n": 962,
    "02d": 2286,
    "02n": 54631,
    "03d": 12246,
    "03n": 12246,
    "04d": 12294,
    "04n": 12294,
    "09d": 2284,
    "09n": 2284,
    "10d": 2416,
    "10n": 2416,
    "11d": 2981,
    "11n": 2981,
    "13d": 1673,
    "13n": 1673,
    "50d": 17056,
    "50n": 17056
}

# Awtrix Light Matrix Informationen
awtrix_ip = "192.168.xxx.xxx"


def get_weather(api_key, lat, lon):
    url = f"http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={api_key}&units=metric"
    response = requests.get(url)
    data = response.json()

    if response.status_code == 200:
        icon = data["weather"][0]["icon"]
        temperature = data["main"]["temp"]
        return temperature, icon
    else:
        return None, None

def send_app_to_awtrix(app_name, text, icon, duration):
    headers = {"Content-Type": "application/json"}
    data = {
        "text": text,
        "icon": icon,
        "duration": duration
    }

    awtrix_url = "http://"+ awtrix_ip + "/api/custom?name=" + app_name
    response = requests.post(awtrix_url, json=data, headers=headers)
    
    if (response.text != "OK"):
        print(response.text)

    time.sleep(duration * 4)

def host_available():
    try:
        result = subprocess.run(['ping', '-c', '1', awtrix_ip], capture_output=True, text=True, timeout=5)
        return result.returncode == 0

    except subprocess.TimeoutExpired:
        print(f"Timeout: {awtrix_ip} is not reachable")


def main():
    while True:
        try:
            if host_available:
                temperature, icon = get_weather(api_key, lat, lon)

                if temperature is not None and icon is not None:
                    send_app_to_awtrix("owm", "{:.1f}°C".format(temperature), condition_mapping.get(icon), 15)
                else:
                    print("Failed to retrieve weather information.")

            time.sleep(300)

        except Exception as e:
            print(f"Fehler: {e}")
            time.sleep(60)

if __name__ == "__main__":
    main()

Teileliste

Die Anzahl der verwendeten Komponenten ist bei diesem Projekt recht überschaubar:

  • 1x ESP32-Wroom-32D Entwicklerboard*
  • 4x 8×8-RGB-LED-Panel, 5V, WS2812B, ca. 71 x 71 mm** (wie z.B. bei AliExpress)
  • 1x Wippschalter I/O, 11×15 mm
  • 1x Micro-USB-Board (wie z.B. bei Amazon)
  • 1x USB-Netzteil, USB-Anschlusskabel und etwas Litze zur Verkabelung der Matrixen, des Boards, Schalters und des Micro-USB-Boards***
  • „ecoPLA Weiß“ von 3DJake für das Gehäuse, Noname schwarzes PLA für das Pixel-Gitter im inneren
  • Noname 2-Komponent-Kleber um die Gehäuse-Hälften miteinander zu verbinden

*) Mit großer Wahrscheinlichkeit funktionieren auch ESP-Boards ohne den Zusatz „D“. Ich habe die D-Variante im Video erwähnt, da diese zum einen meines Wissens in der TC001 verbaut ist und somit wohl die größte Kompatibilität gewährleistet ist. Außerdem benötigt euer ESP-Board GPIO-Pins bis 35, zumindest wenn ihr auch Licht- und Temperatursensoren verbauen wollt. Sonst immerhin bis GPIO-Pin 32, denn dort wird die Matrix angeschlossen. Wenn ihr ein Board ohne „D“-Zusatz habt welches aber die benötigten GPIO-Pins mitbringt, könnt ihr im Zweifel einfach „blind“ die Awtrix-Bibliothek flashen. Gelingt die Installation und könnt ihr danach auf das Webinterface zugreifen, so ist die Wahrscheinlichkeit relativ hoch, dass auch der Rest funktionieren sollte.

**) Ich habe genau dieses Modell bestellt, allerdings befürchte ich, dass die Module nicht immer die exakt 100% gleiche Größe haben werden und daher besser oder schlechter in die von mir designte Fassung passen. Es kann sein, dass hier Nacharbeiten eurerseits nötig werden. So fiel mir z.B. bereits auf, das die versprochenen 71 x 71 mm bei meinen Modulen nicht eingehalten werden. Am Ende zählt hier aber jeder Millimeter, da ich keine Abstände zwischen den einzelnen Matrixen haben und das Gehäuse so kompakt wie möglich halten wollte.

***) Ich habe hier ein altes 5W-USB-Netzteil verwendet, was in meinem Fall völlig ausreichend ist. Am Ende sind Stärke der verwendeten Litze sowie des Netzteils von der Frage abhängig, mit welcher Helligkeit ihr die Matrix betreiben möchtet. Je heller, desto mehr Strom muss das Netzteil liefern und die Kabel aushalten können. Ich betreibe das Display mit einer Helligkeit von 20 (Bereich: 0-255), was in meinem Fall völlig ausreicht. Dabei bleibe ich unter den genannten 5 Watt. Wird die Grenze überschritten fangen die LEDs an zuflackern und wahrscheinlich hängt sich das ESP-Board irgendwann auf.

Wichtige Hinweise

Bitte bedenke: Es handelt sich um ein privates Bastelprojekt eines Hobbyschraubers. Will sagen: So wie gezeigt funktioniert das Ganze gut, aber es bestehen auch Gefahren: Bspw. kann von zu dünnen Kabeln bei hoher Stromaufnahme der LEDs eine Brandgefahr ausgehen oder durch Abwärme das PLA verformen. Bei Fehlanschluss des ESP-Boards kann selbiges Schaden nehmen. Heißt: Baut meine Sachen gerne nach, aber ihr handelt eigenverantwortlich. Ich will jeden ermutigen sich auch Themen anzunehmen, in denen er oder sie bisher kein Expertise besitzt, aber seid clever: Informiert euch abseits meines Blogs, lasst eure Errungenschaften nicht unbeaufsichtigt laufen usw. Lernen, machen, clever sein!

Total
0
Shares
19 comments
  1. Hey, cooles Projekt – kannte bisher nur PixelIt!.

    Kannst du die STL Dateien der einzelnen Teile eventuell auch bereitstellen? (Also nicht als Gesamtpaket)

    Weiter so!

    1. Hallo Sven, danke für deinen Kommentar. Über PixelIt war ich auch gestolpert. Im Nachgang denke ich, dass ich mich damit vielleicht etwas mehr hätte auseinandersetzen sollen, denn zumindest das Demo-Webinterface sieht deutlich wertiger als das der Awtrix Light aus. Egal. Was nicht ist, kann ja noch werden.

      Die STL-Dateien für die einzelnen Teile kann ich gerne bereitstellen. Ich bereite das vor und lade die Sachen in der nächsten Stunde hoch.

  2. Hallo Sven,
    sehr schönes Projekt, ich versuche die Ulanzi Pixelclock einzubinden. Mir hilft Dein Beitrag sehr weiter. Aber das Basteln macht ja auch Spass, deshalb steht die Umsetzung jetzt auch auf der Liste ;-).
    Vielen Dank!

  3. Hallo Sven,
    finde das Projekt super und will es auch nachbauen.
    Dazu hätte ich eine Frage, kannst du für die zwei großen Teile (Deckel und Gehäuse) auch als zusammengefügte STL bereitstellen, ohne Teilung. Denn auf meinem Drucker könnte ich es in einem Drucken und hätte dann nicht die Trennline.

    mfg edi.fre

  4. Sehr geil ! Super erklärt ! Sofort nachgebaut 😉 Aber WO findet man denn Basic-Einstellungen ? Bei Git gibts Effekte und Hidden features… Ich will eine EINFACHE Uhr, keine Apps, keine Hydro oder Temp.-Anzeige, keinen Akkustatus. Muss sich doch abschalten lassen…und der ständige Wechsel macht mich nervös 😵. Nen LDR habe ich auch nicht. Feste Helligkeit…hmmmm. Danke für Tipps !! 😃

    1. Hallo Karsten,

      wenn Du die Awtrix rein als Uhr nutzen möchtest, müsst du die über die HTTP API oder MQTT konfigurieren, schau mal im ersten Video bei ca. 15:25. Der API-Endpunkt ist /api/settings, mit „BRI“ lässt sich die Helligkeit festsetzen, mit „TEMP“: false lässt ich bspw. die Temperatur-Anzeige deaktivieren. Schau doch nochmal ins Video bzw. direkt in die Dokumentation der Awtrix 3 unter „MQTT/HTTP“ und dann am Ende „Change Settings“.

      1. Oki 😉 Letzte Frage erstmal: Wie ist denn die Syntax um das Zeitformat zu ändern? Etwa so?: „TFORMAT“: %H:%M:%S ?? DAS will mir noch nicht gelingen, die Sekunden darzustellen. Der Rest ist easy -wenn man es weiß – und lesen kann LOL. Grüße

  5. Super Projekt, leider verstehe ich nicht, wie das mit dem Punkt Python-Script: Wetter via OpenWeatherMap funktioniert. Habe meinen Standort eingetragen und die awtrix_ip eingetragen Kannst du hier mehr Infos geben? Habe Visual Studio Code installiert aber weiss nicht wie ich diese Datei ausführen kann. Hast du dazu zufällig ein Video?
    Bekomme eine Fehlermeldung, dass die beiden ersten Zeilen zum Beispiel nicht ausgeführt werden können.
    import requests
    import time

    1. Hey Torsten,

      du benötigst Python auf deinem System. Die Skripte die du hier findest, sind in der Sprache Python geschrieben. Auf deinem System muss der Python-Interpreter entsprechend installiert sein. Es kann z.B. hier heruntergeladen werden: https://www.python.org/downloads/

      In der Konsole mit „./python script.py“ (und unter Windows glaube ich auch einfach mit Doppelklick) kann man dann die Skripte ausführen. Es kann gut sein, dass dann noch immer Fehler auftreten: Das Paket „requests“ da direkt in den ersten Zeilen steht, ist kein Standardpaket. Es muss mittels pip oder pip3 (je nach Python-Version) nachinstalliert werden.

      Ich habe die Installation von Python leider bisher in keinem Video behandelt. Schau vielleicht mal hier: https://www.youtube.com/watch?v=EEkAsszvFp0&list=PLjuHXsDGkbTQZ_TfRfpfJgmkNTcvu8TYQ
      Das habe ich jetzt auf die Schnelle gefunden, sieht aber nach etwas aus, was dir vielleicht helfen könnte. In Kapitel 5 wird auch das Thema „pip“ kurz angeschnitten.

      Vielleicht kann das helfen!

  6. Moin,
    bin zufällig auf dein Projekt gestoßen und es gefiel mir auf Anhieb.
    Ich wollte gerade mal mit dem Drucken des Gehäuses starten aber, beim Slicen der Abdeckung werden die kleinen Quadrate nicht berücksichtigt – ich bekomme nur eine flache Platte von 0,44 mm Höhe, obwohl es ja 2,4 mm sein müssten. Hoffe, das ist verständlich ausgedrückt 😉
    Ich benutze Bambu Studio und drucke auf dem Bambu P1S.
    Gibt’s dazu einen Tipp? Ist evtl. mit der Datei etwas nicht i. O.?
    Vielen Dank!
    Gruß,
    Olli

    1. Hi Olli,
      ich habe exakt das gleiche Problem mit meinem Bambu Studio und X1C.
      Ich habe die Datei mal im Prusa Slicer für einen Ender 3 V2 geöffnet und das Ergebnis war fehlerfrei.
      Das Problem scheint also irgendwie am Slicer von Bambu zu liegen.
      Viele Grüße
      Manfred

      1. Hallo ihr beiden,
        das gleiche Problem hatte ich in Bambu Studio und Orca Slicer auch.
        Durch ein bisschen googlen bin ich auf die Lösung gestoßen.
        Unter Qualität – Wandgenerator muss auf Arachne umgestellt werden, dann wird es richtig gesliced.

        Grüße Flo

        1. Hallo Flo,
          vielen Dank für Deine interessante Hilfestellung.
          Ich habe mir etwas komplizierter geholfen und mir ein X1C-Profil in den Prusa-Slicer geladen und dort gesliced.
          Nach Export auf eine SD-Karte und Druck von derselben, war dann auch das Druckergebnis einwandfrei. Dein Ansatz ist aber zweifelsfrei eleganter. 😉

          Danke Dir dafür und danke Datort für das tolle Projekt!

          Viele Grüße
          Manfred

    2. Danke euch allen a) für die Frage und b) für die geleistete Hilfe. Finde es interessant, dass es da offenbar zu Problemen kommt. Ich weiss noch nicht so ganz, was ich beim nächsten Projekt anders machen kann. Aber ich bin froh, dass ihr eine Lösung gefunden habt. Danke fürs Teilen!

  7. hi,
    ich verstehe noch nicht wie ich die Awtrix in Insomnia einbinde(?) / öffne(?)
    Kannst du da einen kleinen Tipp geben?

    Danke
    Bernd

Schreibe einen Kommentar

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

Mit der Nutzung dieses Formulars erklärst Du Dich mit der Speicherung und Verarbeitung Deiner Daten durch datort.de einverstanden. Weitere Informationen findest Du in der Datenschutzerklärung.

Previous Article

Zweites Leben für den FeTAp 0111

Next Article

16x16er Pixelart und LED-Effekte mit WLED im Eigenbau