DIY LED Matrix im Eigenbau

Der Zusammenbau

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.

Total
0
Shares
9 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

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