Schematik build

ESP32 RGB Matrix Display

Schematik

Published August 4, 2026 · Updated August 4, 2026

ESP32Intermediate60 minutes2 components4 assembly steps
Remix this project
Photo of ESP32 RGB Matrix Display

This project builds a 64x32 RGB LED matrix display driven by an ESP32 microcontroller. The display uses the HUB75 protocol, a standard interface for addressable LED panels that allows the ESP32 to control thousands of individual pixels with smooth color mixing and animation capabilities.

The guide provides a complete wiring diagram showing how to connect the HUB75 signals directly to ESP32 GPIO pins, a full parts list, and step-by-step assembly instructions. Included firmware demonstrates text rendering and pixel-level control, giving makers a foundation for building custom displays, information dashboards, or interactive art installations.

Wiring diagram

Interactive · read-only
Wiring diagram for ESP32 RGB Matrix Display

Pan and zoom to explore the wiring. Remix the project to edit it in your own workspace.

Parts list

Bill of materials
ComponentQtyNotes
64x32 RGB LED Matrix - 5mm pitch64 × 32, HUB75, 1/16 scan12048-pixel RGB LED matrix panel, 64x32 at 5 mm pitch, with dual IDC connectors for chaining. Requires 13 digital pins and a 5V supply; designed for video wall applications.
Regulated 5 V 4 A DC power supply5 V, 4 A minimum1Isolated regulated 5 V DC supply for the HUB75 panel and level shifters. Use a supply rated at least 4 A, with an appropriate terminal adapter for the panel's 5 V input.

Assembly

4 steps
  1. Identify the panel input

    With all power disconnected, place the Waveshare matrix face down and locate the HUB75 connector marked IN. Use only this connector for the single 64×32 panel; do not use OUT.

    • Tip: Keep the ribbon cable’s stripe and the panel’s pin-1/arrow marking aligned.
    • Tip: Follow the signal labels printed on the panel instead of relying on connector orientation.
    • Never connect or remove the HUB75 ribbon cable while the panel or ESP32 is powered.
  2. Wire HUB75 signals directly to the ESP32

    Connect the panel HUB75 IN signals directly to the ESP32: R1→GPIO25, G1→GPIO26, B1→GPIO27, R2→GPIO14, G2→GPIO13, B2→GPIO32, A→GPIO33, B→GPIO4, C→GPIO16, D→GPIO17, CLK→GPIO18, LAT→GPIO23, and OE→GPIO19. Connect every HUB75 GND pin to ESP32 GND.

    • Tip: Keep the signal wiring short and label each wire.
    • Tip: The 64×32 1/16-scan panel does not use HUB75 row-address E.
    • This direct connection relies on the specific panel accepting 3.3 V ESP32 logic. If the display is unstable, dim, shows wrong colors, or does not respond, reinstall a proper 5 V-tolerant level buffer.
  3. Connect the dedicated panel power

    Connect the regulated supply’s +5 V and GND directly to the matrix panel’s dedicated power input using adequately sized wire. Connect the supply GND to ESP32 GND so the direct signal connections have a shared reference.

    • Tip: Use a regulated 5 V supply rated for at least 4 A.
    • Tip: Verify polarity with a multimeter before connecting the panel.
    • Do not power the matrix through the ESP32 USB cable, ESP32 5 V/VIN pin, or breadboard power rails.
    • Do not connect the panel’s 5 V rail to any ESP32 GPIO or 3.3 V pin.
  4. Inspect before power-up

    Confirm the ribbon cable is on the panel’s IN connector, all grounds are common, +5 V and GND are not reversed, and each direct GPIO connection matches the listed HUB75 label. Power the ESP32 by USB and the panel from its dedicated 5 V supply.

    • Tip: The first display should read “WAVESHARE HUB75” and “ESP32 READY” with a colored line at the bottom.
    • Tip: Use Schematik’s Deploy button to flash the included firmware.
    • If the panel remains dark or erratic, turn off both supplies before changing wiring.

Pin assignments

Board wiring reference
PinConnectionType
EXTpanel_supply AC_INCertified mains outlet using the supply's provided AC leadpower
GNDpanel_supply GNDground
GNDmatrix_64x32 GNDground
5Vpanel_supply +5Vpower
5Vmatrix_64x32 VCCpower
GPIO 25matrix_64x32 R1digital
GPIO 26matrix_64x32 G1digital
GPIO 27matrix_64x32 B1digital
GPIO 14matrix_64x32 R2digital
GPIO 13matrix_64x32 G2digital
GPIO 32matrix_64x32 B2digital
GPIO 33matrix_64x32 Adigital
GPIO 4matrix_64x32 Bdigital
GPIO 16matrix_64x32 Cdigital
GPIO 17matrix_64x32 Ddigital
GPIO 18matrix_64x32 CLKdigital
GPIO 23matrix_64x32 LATdigital
GPIO 19matrix_64x32 OEdigital

Firmware

ESP32
main.cppDeploy to device
#include <Arduino.h>
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>


// Forward declarations
void drawStartupScreen();

constexpr int PANEL_RES_X = 64;
constexpr int PANEL_RES_Y = 32;
constexpr int PANEL_CHAIN = 1;

// Direct ESP32-to-HUB75 connections.
constexpr int R1_PIN = 25;
constexpr int G1_PIN = 26;
constexpr int B1_PIN = 27;
constexpr int R2_PIN = 14;
constexpr int G2_PIN = 13;
constexpr int B2_PIN = 32;
constexpr int A_PIN = 33;
constexpr int B_PIN = 4;
constexpr int C_PIN = 16;
constexpr int D_PIN = 17;
constexpr int CLK_PIN = 18;
constexpr int LAT_PIN = 23;
constexpr int OE_PIN = 19;

HUB75_I2S_CFG::i2s_pins panelPins = {
  R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN,
  A_PIN, B_PIN, C_PIN, D_PIN, -1,
  LAT_PIN, OE_PIN, CLK_PIN
};

HUB75_I2S_CFG matrixConfig(PANEL_RES_X, PANEL_RES_Y, PANEL_CHAIN, panelPins);
MatrixPanel_I2S_DMA *matrix = nullptr;

void drawStartupScreen() {
  matrix->fillScreen(matrix->color565(0, 0, 0));
  matrix->setTextWrap(false);
  matrix->setTextSize(1);
  matrix->setTextColor(matrix->color565(255, 60, 20));
  matrix->setCursor(1, 2);
  matrix->print("WAVESHARE HUB75");
  matrix->setTextColor(matrix->color565(30, 190, 255));
  matrix->setCursor(8, 13);
  matrix->print("ESP32 READY");

  for (int x = 0; x < PANEL_RES_X; ++x) {
    const uint16_t color = matrix->color565((x * 4) % 256, 255 - (x * 4), 120);
    matrix->drawPixelRGB565(x, 28, color);
    matrix->drawPixelRGB565(x, 29, color);
  }
}

void setup() {
  matrixConfig.clkphase = false;
  matrix = new MatrixPanel_I2S_DMA(matrixConfig);
  matrix->begin();
  matrix->setBrightness8(64);
  drawStartupScreen();
}

void loop() {
  // DMA maintains the display refresh; no redraw is necessary for this static screen.
  delay(1000);
}

“Deploy to device” opens this project in Schematik, where you can flash it to your board over USB.

Project files

Shared by the author

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik