MATRIX LED ist ein High-Performance Ambilight-Projekt mit dem klaren Fokus auf maximale Geschwindigkeit, minimale Latenz und vollständige Messbarkeit. Dieses Projekt ist nicht als weiteres „Ambilight für den Alltag“ entstanden, sondern aus der Frage heraus:
Wie schnell können adressierbare LEDs wirklich angesteuert werden – wenn man nichts künstlich limitiert?
MATRIX LED kombiniert zwei Welten:
- Teensy 4.x als extrem schneller, deterministischer LED-Controller
- ESP32 als Steuer-, UI- und Konfigurations-Einheit (Webserver + Display)
- Der kritische Datenpfad (PC → LEDs) ist bewusst frei von WLAN, TCP/IP oder Betriebssystem-Jitter gehalten.
- Der ESP32 übernimmt ausschließlich Komfort- und Kontrollfunktionen.
PC → USB → Teensy (DMA) → LEDs
ESP32 → UI / Web / Display (nicht zeitkritisch)
-
- Teensy 4.0: High-Speed APA102 Treiber (SPI @ 16MHz), USB Adalight Interface, OLED Status-Display.
-
- OLED Display: FPS Counter, (Reale FPS Berechnung), / Bootscreen / LED Test (automatisch (Boot) per Taster). Debug Menü / EEPROM Lesen & Schreiben.
-
- Ambilight: Unterstützt PC-Synchronisation via USB (Adalight Protokoll, funktioniert mit AmbiPro / Hyperion / HyperHDR / Prismatic und eigene Software MATRIX LED (noch nicht veröffentlicht)
[Performance HUD:] Framerate / CPU Temperature / CPU Usage / Data Rate / Free RAM / SPI Frequency
[Debug Menü:] Performance / Thermal CPU / Power / Memory / Sys Info
-
- ESP32: Webinterface, WiFi-Management, Effekt-Berechnung.
-
- Web Interface: Modernes React-basiertes UI zur Steuerung von Effekten, Farben und Helligkeit uvm.
-
- Effekte: "Für LED Test" -> Matrix LED, Rain, >_ CODE X, Fire, Plasma, Rainbow, uvm. (Canvas2D@4K) benötigt schnellen CPU.
-
- TFT Display MAtrix Regen passt sich den Farben der LEDs an (int bucketCounts[7] Teensy sortiert Farben in 7 Töpfe (R, Y, G, C, B, M, K) und nimmt den vollsten,
Da das Hintergrundbild zu groß für den internen Speicher des ESP32 ist, kann die High-Quality Version der Website hier heruntergeladen werden.
- Einfach die
.htmlDatei lokal am PC öffnen. - Die IP-Adresse des ESP32 kann in der lokalen Version konfiguriert werden.
- Download: Siehe Releases (rechts in der Sidebar).
Gehäuse-Dateien für den Controller und die Anschlüsse.
- (Dateien folgen in Kürze / Siehe Ordner
STL)
-
- Controller 1: Teensy 4.0 @ 696 MHz "Overclocked" - ich empfehle ein kleinen Kühlkörper!!
-
- LEDs: APA102C (SPI) @ 16 MHz
-
- Display: SH1106 OLED (I2C) @ 1 MHz
-
- Controller 2: ESP32 DevKit V4 @ DualCore 240 MHZ - EnergySaver deaktiviert.
-
- Display: ST7789V 240x320 (SPI) @ 26.6 MHz
- CORE ARCHITECTURE (Teensy 4.0) (Cortex-M7)
-
- High-performance NXP i.MX RT1062 crossover MCU delivers real-time operation
-
- Clock: 696 MHz (Overclocked via CCM registers)
-
- VCore: 1.200V (Dynamic Voltage Scaling via PMU_REG_CORE 0x14)
-
- FPU: Double Precision Hardware Floating Point Unit enabled
- MEMORY HIERARCHY (Tightly Coupled Memory)
-
- ITCM (Instruction TCM): 64-bit Bus, 0 Wait-States.
-
- Hält "Hot Path" Code: processLEDs(), sendOutBuffer(), readExact().
-
- Verhindert Cache-Misses und Pipeline-Stalls bei kritischen Loops.
-
- DTCM (Data TCM): 64-bit Bus, 0 Wait-States.
-
- Hält Stack, Frame-Buffer (rgbIn, outBufA/B) und globale Variablen.
-
- Ermöglicht Single-Cycle Zugriff auf LED-Daten.
STAGE 1: INGEST (USB High-Speed 480 Mbit/s)
-
- Hardware: USB PHY -> Internal 512 Byte DMA Ring Buffer.
-
- Software: readExact() (ITCM) liest Block-weise in 'rgbIn' (DTCM).
-
- Protocol: Adalight Header Check ("Ada") + Checksum/Timeout Logic.
STAGE 2: PROCESSING (SIMD-like Integer Math)
-
- Function: processLEDs() (ITCM, FASTRUN).
-
- Input: 8-Bit RGB Array (rgbIn).
-
- Op: Bit-Shifting & Masking (keine Divisionen).
-
- Scaling: Fixed-Point Helligkeitsberechnung ((val * brightness) >> 8).
-
- Feature: Color Clustering (Smart Downsampling) for ESP32 Preview.
-
- Output: 32-Bit APA102 Frames (0xFF | B | G | R) direkt in 'backBuf'.
STAGE 3: SWAP (Atomic Transition)
-
- Trigger: Sobald Frame vollständig verarbeitet ist.
-
- Action: Pointer Swap (frontBuf <-> backBuf).
-
- Cost: Nahezu 0 CPU-Zyklen (nur Zeiger-Adressen tauschen).
STAGE 4: PRIMARY EGEST (LPSPI Output @ 16 MHz)
-
- Hardware: Low Power SPI (LPSPI) Modul.
-
- Function: sendOutBuffer() (ITCM).
-
- Data: Liest von 'frontBuf' (DTCM).
-
- Timing: Asynchron zur USB-Eingabe (entkoppelt durch Buffer).
STAGE 5: SECONDARY EGEST (UART @ 4 Mbit/s)
-
- Hardware: High-Speed UART (Serial1).
-
- Target: ESP32 Web Controller (Telemetry & Preview).
-
- Data: Cluster-Downsampled RGB + Status (Binary Protocol).
-
- LPI2C (OLED): Overclocked auf 1 MHz (Fast Mode Plus) für min. Latenz.
-
- FPS Engine: Exponential Moving Average (EMA) Filter für glatte Anzeige.
-
- 3D Engine: Real-time FPU projection engine (Boot Animations).
-
- Diagnostics: Startup Benchmarking (I2C Latency Check).
-
- Thermal: Überwachung der Die-Temperatur (tempmon).
-
- Load Monitor: Messung der aktiven CPU-Zyklen vs. Idle-Time.
-
- Watchdogs: Screensaver (20s Idle) & Deep Standby (10min Idle).
- FPS-Werte beschreiben den internen Durchsatz, nicht die sichtbare Bildrate.
- Überabtastung dient Messung & Verifikation – nicht Darstellung.
- Dieses Projekt zeigt intern gemessene Performance-Werte (FPS), die sich auf den reinen Daten- und LED-Pipeline-Durchsatz beziehen.
- Die angezeigten FPS sind keine sichtbaren Bildwiederholraten.
- Sie sind unabhängig von der Monitor-Refresh-Rate (z.B. 60 Hz / 120 Hz).
- Sie stellen dar, wie schnell Daten verarbeitet, übertragen und an die LEDs ausgegeben werden können.
Beispiel:
-
- Ein Monitor mit 120 Hz kann maximal 120 unterschiedliche Frames pro Sekunde anzeigen.
-
- Die MATRIX LED Pipeline kann jedoch deutlich mehr Frames intern verarbeiten.
-
- Diese überabtastung dient der Messung von:
-
- maximalem Datendurchsatz
-
- Latenz
-
- Stabilität
-
- Reserven der Hardware
-
- Die hohen FPS-Werte sind somit:
-
- technisch korrekt
-
- reproduzierbar
-
- aber nicht direkt sichtbar
-
- Dieses Projekt ist bewusst als Performance- und Analyse-Projekt konzipiert,
-
- nicht als Vergleich sichtbarer Bildraten.
- CORE ARCHITECTURE (ESP32-D0WD) (Dual-Core Xtensa LX6)
-
- Clock: 240 MHz (Max Performance Profile via setCpuFrequencyMhz).
-
- Cores: Asymmetric Multiprocessing (AMP).
-
- Core 0: High-Speed Serial Ingest & Protocol Parsing.
-
- Core 1: UI Rendering, WiFi Stack, WebServer & State Logic.
- DISPLAY SUBSYSTEM
-
- Driver: TFT_eSPI (Hardware SPI).
-
- Mode: Direct Framebuffer Access.
STAGE 1: INGEST (Core 0 - Background Task)
-
- Source: UART2 (Serial2) @ 4 Mbit/s from Teensy 4.0.
-
- Buffer: Expanded RX Buffer (2048 Bytes) via setRxBufferSize().
-
- Function: serialDataReceiverTask() -> processTeensySerialData().
-
- Logic: Binary Header Search (0x42, 0x4D) -> State Extraction.
-
- Output: Writes to volatile global registers (teensyR/G/B).
STAGE 2: STATE MANAGEMENT (Shared Memory)
-
- Type: Volatile Global Variables.
-
- Sync: Implicit Atomic 32-bit Access (No Mutex needed for simple ints).
-
- Data: Color Data (RGB), System Mode (Matrix/Data/Off).
STAGE 3: RENDERING & LOGIC (Core 1 - Main Loop)
-
- Context: Arduino loop().
-
- Input: Reads volatile globals.
-
- Graphics: Matrix Rain Engine (Char-based) or Data Dashboard (Rect-based).
-
- Network: Async WebServer Handling (server.handleClient).
-
- Sync: Watchdog on TEENSY_TRIGGER_PIN (Auto-Reboot on Signal Loss).
-
- Stack: React 18 + TailwindCSS (Single Page Application).
-
- Storage: PROGMEM (Flash) -> Served as Raw HTML.
-
- Comms: REST API (/matrix, /data, /off, /threshold).
-
- Client: Browser-side rendering (Canvas 2D) for Preview & Controls.
| Funktion | Teensy 4.0 Pin | ESP32 Pin | Beschreibung |
|---|---|---|---|
| Serial RX | 0 (RX1) | 17 (TX2) | Daten vom ESP zum Teensy |
| Serial TX | 1 (TX1) | 16 (RX2) | Daten vom Teensy zum ESP |
| Sync/Trigger | 3 | 33 | Synchronisation & Reset |
| GND | GND | GND | WICHTIG: Gemeinsame Masse verbinden! |
- MOSI: GPIO 23 / SCLK: GPIO 18 / CS: GPIO 26 / DC: GPIO 27 / RST: GPIO 4
| Komponente | Pin | Anmerkung |
|---|---|---|
| LED Data | 11 | APA102 Data (Grün) |
| LED Clock | 13 | APA102 Clock (Gelb/Blau) |
| OLED SDA | 18 | I2C Data (SH1106) |
| OLED SCL | 19 | I2C Clock (SH1106) |
| Button | 2 | Taster gegen GND |
-
- Benötigte Software: Teensy Loader
-
- Datei:
Firmware/Teensy_Matrix.hex/ Die kompilierten Firmware-Dateien befinden sich im OrdnerFirmware.
- Datei:
-
- Verbinde den Teensy per USB, drücke den weißen Programmier-Knopf auf dem Teensy und lade die .hex Datei hoch.
-
- jetzt sollte dein Teensy Booten, du solltest jetzt den "Learning Mode" Screen sehen, weil das "Magic Byte" noch nicht vorhanden ist.
-
- Du kannst jetzt deine LEDs manuel Konfigurieren, oder nutzt einfach den "AUTOMODE start software" , indem du zb. HyperHDR öffnest und schon wird die LED Anzahl die du in der Software festgelegt hast, an den Teensy übertragen werden. Im Display siehst du kurz die Anzahl deiner LEDs.
-
- Der Teensy Boote jetzt durch, deine LEDs sollten nach dem Booten leuchten, "LED Test" steht im Display.
-
- Sollte etwas schief gegangen sein, kannst du ein "Rest" durchführen, oder konfigurierst die LEDs später im Webinterface.
-
- Reset der Konfiguration: Per externem Taster (Pin 2)
-
- Trenne den Teensy vom Strom (USB raus).
-
- Halte den externen Taster (an Pin 2) gedrückt.
-
- Stecke USB wieder ein (während du gedrückt hältst).
-
- Auf dem Display sollte kurz "RESET CONFIG..." erscheinen.
-
- Lass den Taster los -> Der Teensy startet jetzt im Learning Mode.
Bootsequenz.Teensy.720p.mp4 |
Bootsequenz.ESP32D.720p.mp4 |
-
- Benötigte Software: Esptool oder ESP Download Tool.
-
- Partitionstabelle:
Firmware/ESP32_partitions.binan Adresse0x8000
- Partitionstabelle:
-
- Firmware:
Firmware/ESP32_Matrix.binan Adresse0x10000
- Firmware:
Stelle sicher, dass ESP32 und Teensy korrekt miteinander verbunden sind (siehe Tabelle oben: RX/TX, Sync, GND).
Beim ersten Start (oder nach einem Reset) findet der ESP32 keine gespeicherten WLAN-Daten.
- Der ESP32 startet einen eigenen Access Point:
MATRIX-SETUP. - Auf dem Display erscheint: "SETUP MODE" und die IP
192.168.4.1.
Schritte:
- Verbinde dein Handy oder PC mit dem WLAN
MATRIX-SETUP. - Öffne den Browser und gehe auf
http://192.168.4.1. - Gib deine WLAN-SSID und das Passwort deines Heimnetzwerks ein.
- Klicke auf "VERBINDEN".
- Das System speichert die Daten, startet neu und verbindet sich automatisch mit deinem Heimnetzwerk.
Nach erfolgreicher Konfiguration lädt der ESP32 die Daten, verbindet sich mit dem WLAN und zeigt die IP-Adresse kurz auf dem Display an. Danach startet die Matrix-Oberfläche.
Um die WLAN-Daten zu löschen und den Setup-Modus erneut zu starten:
-
Methode A (Hardware):
- Schalte den ESP32 ein.
- Innerhalb der ersten 1.5 Sekunden (während der Boot-Text "Hold BOOT to Reset..." sichtbar ist), halte den BOOT-Button gedrückt.
- Das Display wird rot ("RESET WIFI..."), die Daten werden gelöscht und das Gerät startet im AP-Modus neu.
-
Methode B (Software): Rufe im Browser die URL
http://<DEINE-ESP-IP>/reset_wifiauf.
Für Firmware-Updates über das Webinterface (/upload):
- Benutzername:
admin - Passwort:
matrix
| Aktion | Funktion |
|---|---|
| Beim Start gedrückt halten | Reset der Konfiguration: Löscht die gespeicherte LED-Anzahl und andere Einstellungen. Der Teensy startet im "Learning Mode". |
| 1x Klick | Startet den LED-Selbsttest (Knight-Rider-Effekt). |
| 2x Klick | Schaltet die globale Helligkeit um (100% → 50% → 15% → 100%). |
| 5x Klick | Öffnet das Debug-Menü auf dem OLED-Display. |
| Lang gedrückt (>1s) | Schaltet das OLED-Display an/aus (Stealth Mode). |
| Im Debug-Menü: 1x Klick | Blättert zur nächsten Seite. |
| Im Debug-Menü: Lang gedrückt | Verlässt das Debug-Menü. |
| Aktion | Funktion |
|---|---|
| Beim Start (1.5s Fenster) | WLAN-Reset: Löscht die gespeicherten WLAN-Daten (siehe Setup). |
| 1x Klick (im Betrieb) | Ändert die Fallgeschwindigkeit des Matrix-Regens auf dem ESP32-Display. |
[WebUi]
- Teensy 4.0: https://www.pjrc.com/store/teensy40.html
- Display ST7789V 240x320 (SPI): https://de.aliexpress.com/item/1005009741238384.html
- Display SSD1306: https://de.aliexpress.com/item/1005006141235306.html
- ESP32-WROOM-32D: https://de.aliexpress.com/item/1005007820190456.html
- APA102: https://de.aliexpress.com/item/32969463242.html
- Level Shifter SN74AHCT125N: https://de.aliexpress.com/item/1005010466137824.html
- Taster Kailh 6x6x7.3mm: https://de.aliexpress.com/item/1005005497422200.html
Mich haben Computer und technische Geräte schon immer fasziniert. Das begann bereits in meiner Kindheit, als mein Vater einen Commodore Plus/4 besaß. Von dort aus entwickelte sich meine Reise weiter – über den Amiga 1200, einen 486DX2 und viele weitere Systeme bis heute.
Technik war für mich nie nur ein Werkzeug, sondern etwas, das man verstehen, erkunden und verbessern kann.
Die ersten Ambilight-Systeme, die ich selbst besessen habe, waren noch sehr einfach: drei LED-Leisten, nicht adressierbar, physisch nur wenige LEDs – weit entfernt von dem, was heute möglich ist. Doch LEDs haben mich schon immer begeistert, vor allem wegen ihrer Farben, Dynamik und der Möglichkeiten, Atmosphäre zu erzeugen.
Aus dieser Begeisterung heraus entstand dieses Projekt. Mein Ziel war es nicht nur, ein Ambilight zu bauen, das gut aussieht, sondern eines, das messbar, erklärbar und technisch nachvollziehbar ist – mit klaren Antworten auf Fragen wie: "Wie schnell ist es wirklich? Wo liegen die Grenzen? Und wie viel Performance bleibt oft ungenutzt?"
Der Name MATRIX LED entstand eher intuitiv. Ich fand ihn einfach passend – und er lässt Raum für Fantasie. Wie der Film Matrix steht er für Technik, Tiefe und die Idee, hinter die Oberfläche zu schauen.
Was als kleines Experiment begann, ist mit der Zeit gewachsen. Nicht aus dem Wunsch nach Komplexität, sondern aus Neugier – und aus dem Spaß daran, Dinge weiterzudenken, zu optimieren und neu zu gestalten. Ich hoffe euch gefällt mein Projekt!!
grüße -= d3rb =-
## Support & Kontakt Gefällt dir das Projekt? * Lass einen ⭐ **Star** auf GitHub da! * Melde Fehler unter **Issues**.
Wenn du meine Arbeit unterstützen möchtest:
Binary-only Distribution.






