Build a WiFi RGB LED Matrix Display with ESP32
A HUB75 RGB LED matrix panel — the same style of panel used in basketball scoreboards and outdoor advertising displays — makes for one of the most eye-catching ESP32 builds available, but it also trips up more beginners than almost any other display project because the panel's power and data requirements don't behave like a typical addressable LED strip. This project covers wiring an ESP32 to a HUB75 panel correctly, sizing power for it realistically, and building a driver + software stack that can run scrolling text, clocks, and simple animations reliably.
What You're Building
A WiFi-connected display built from one or more chained 64x32 (or 32x64) HUB75 RGB LED matrix panels, driven by an ESP32's I2S peripheral in DMA mode for flicker-free refresh, running scrolling text, a clock, or simple pixel-art animations, with brightness and content controllable over WiFi.
Why the ESP32 (and Why I2S DMA Matters)
HUB75 panels don't have onboard pixel memory or a simple serial protocol like WS2812B strips — the host controller has to continuously re-scan and refresh the entire panel dozens of times per second, driving row-select lines and shift-register clock/data lines directly. Doing this with simple GPIO bit-banging pins a CPU core almost entirely to the refresh loop and produces visible flicker or tearing on anything but the smallest panels. The ESP32's I2S peripheral can be repurposed (via the well-established ESP32-HUB75-MatrixPanel-I2S-DMA library) to drive this refresh in hardware via DMA, freeing the CPU to run your actual application code — WiFi, animations, clock logic — while the display refresh happens essentially for free in the background. This is the same category of trick as the Pico's PIO peripheral, just implemented differently on the ESP32.
Full hardware details — including the panel, power supply, and level shifter — are covered in the parts list below.
Power Budget — Read This Before You Buy a Power Supply
This is the step beginners skip and regret. A 64x32 HUB75 panel has 2,048 individually addressable RGB LEDs. At full white, full brightness, across every pixel simultaneously, a panel like this can draw 4-5A at 5V — a small USB power bank or a phone charger will brown out instantly. In practice, typical content (text, clocks, moderate animations) draws well under that worst case, but you should size your power supply for the worst case, not typical use, because a bright full-white frame will happen eventually and an undersized supply will brown out the panel or reset the ESP32 when it does. An 8A supply gives comfortable headroom for a single 64x32 panel; scale up proportionally if you're chaining multiple panels.
Wiring Overview
Panel signalFunctionNotes R1, G1, B1, R2, G2, B2Color data for upper/lower half of panelRoute through the level shifter — the panel expects 5V logic, ESP32 GPIO outputs 3.3V A, B, C, D (row select)Selects which row pair is currently being driven4 lines for a 32-row panel (up to E for 64-row panels) CLK, LAT, OEShift register clock, latch, and output enableOE is toggled rapidly for brightness control (PWM) — this is the most timing-sensitive signal 5V / GND (panel power)Drives the LEDs directlyWire with adequately thick gauge directly from the power supply, not through the ESP32 or a breadboard's thin tracesKeep the LED panel's power wiring completely separate from the ESP32's logic-level wiring — run heavy-gauge wire straight from the power supply to the panel's power input terminals, and only share a common ground reference with the ESP32 rather than routing panel current through the same thin jumper wires carrying data signals.
Software Setup
- Install the ESP32-HUB75-MatrixPanel-I2S-DMA library in the Arduino IDE or PlatformIO — this handles the low-level DMA refresh so your code just writes pixels.
- Configure the pin mapping in the library to match your specific wiring, since GPIO assignments vary by board and by how you wired the level shifter.
- Start with the library's example sketches to confirm the panel displays correctly before writing custom content — this isolates wiring problems from software problems.
- Add WiFi connectivity with a simple web server or MQTT client so you can push new text or switch display modes without reflashing the ESP32 each time.
- Build or adapt a clock/animation library. Popular open-source ESP32 matrix clock projects handle NTP time sync, scrolling text rendering, and simple sprite animation — a good starting point rather than writing pixel-pushing code from scratch.
- Add brightness limiting in software as a second safety layer on top of your power supply sizing — capping maximum brightness in code prevents worst-case current draw even if content changes later.
Building the Enclosure
A simple frame keeps the panel rigid and diffuses the raw LED points into a cleaner-looking display. This pairs naturally with either of this site's other fabrication tools: laser-cut a plywood or acrylic frame sized to the panel's exact mounting holes on something like the Ray5 20W, or 3D print a frame with an integrated acrylic diffuser channel on a printer like the Kobra 3. Either approach lets you dial in the exact bezel width and mounting method (wall-hang, desk stand, or shadow-box) rather than relying on the bare panel's edge-mounting holes alone.
Safety Notes
Size the power supply's fuse or use an inline fuse holder rated appropriately below the supply's max output, and never leave a bare, unfused 5V/8A supply wired directly to a project that will run unattended — a short in the panel wiring at that current level can generate real heat quickly. Keep the power supply's mains-voltage side fully enclosed and away from the low-voltage wiring, and confirm polarity on every connection before powering on for the first time, since reversed 5V/GND on a HUB75 panel can damage the panel's shift registers instantly.
Closing Thoughts
The gap between "flickering, underpowered mess" and "smooth, bright, reliable display" on a HUB75 build comes down almost entirely to two things: driving the panel through I2S DMA instead of bit-banged GPIO, and sizing power for worst-case full-brightness draw instead of typical content. Get those two details right and the rest of the build — wiring, enclosure, and software — is genuinely approachable even for a first ESP32 display project.
Related Guides
- How to Program Addressable LED Strips: WS2812B Patterns, Effects, and Power Design
- I2C vs SPI vs UART: How to Choose and Use Serial Communication Protocols
- How to Use Sensors with Arduino and ESP32: Temperature, Distance, Load, Current, and Hall Effect
- How to Control Motors with Arduino and ESP32: Stepper, DC, and Servo Drivers
- How to Hack Wi-Fi and Bluetooth with the Flipper Zero and Wi-Fi Marauder
- ESP32: Setting Up for Arduino IDE
- Laser Engraving Acrylic Edge-Lit Panels on the Ray5 20W
- Setting Up Marauder on the ESP32 Wi-Fi Dev Board for Flipper