Only Half of RGB LED Panel Working

Hello,

I recently bought a 32x32 RGB LED DISPLAY PANEL (32x32 RGB LED Matrix Panel - 4mm Pitch | Adafruit ADA607 | Core Electronics Australia), to control with my esp32 (ESP32-S3-Pico Microcontroller | Waveshare WS-23803 | Core Electronics Australia).

The esp32 is being powered with 3.3V and the Display Panels are being powered by 5V.

The issue is that for every 8 rows in my display, only 4 rows light up (https://www.youtube.com/watch?v=iG-lsFzY7E8&ab_channel=Seliwhat). It does seem that the 4 rows are doing their job well.

I have double checked all my connections with a multimeter. I would like to note that when I disconnect PIN C (1 of the 16 pins on the display panel), nothing happens.

I know that the panels have ’ 5V data logic level input’, but I do think that this is fine as other people have used it. When I change the voltage of the panels to the same voltage as the esp32 (3.3V), some LEDs which weren’t lighting up before do light up (https://www.youtube.com/watch?v=-8sWGDaFegg&ab_channel=Seliwhat).

The code I am using is from the ‘GitHub - mrfaptastic/ESP32-HUB75-MatrixPanel-DMA: An Adafruit GFX Compatible Library for the ESP32, ESP32-S2, ESP32-S3 to drive HUB75 LED matrix panels using DMA for high refresh rates. Supports panel chaining.’ repository, where I am using the HueValueSpectrum example.

Here are my connections:

  • 4, //R1_PIN, 
    
  • 5, //G1_PIN, 
    
  • 6, //B1_PIN, 
    
  • 7, //R2_PIN, 
    
  • 15, //G2_PIN, 
    
  • 16, //B2_PIN, 
    
  • 18, //A_PIN, 
    
  • 8, //B_PIN, 
    
  • 33, //C_PIN, 
    
  • 42, //D_PIN, 
    
  • -1, //E_PIN,
    
  • 4, //R1_PIN,
  • 5, //G1_PIN, 
    
  • 6, //B1_PIN, 
    
  • 7, //R2_PIN, 
    
  • 15, //G2_PIN, 
    
  • 16, //B2_PIN, 
    
  • 18, //A_PIN, 
    
  • 8, //B_PIN, 
    
  • 33, //C_PIN, 
    
  • 42, //D_PIN, 
    
  • -1, //E_PIN,
    
  • 40, //LAT_PIN, 
    
  • 2, //OE_PIN, 
    
  • 41, //CLK_PIN
    
  • 40, //LAT_PIN, 
    
  • 2, //OE_PIN, 
    
  • 41, //CLK_PIN
    

Please let me know if there is something I can do to diagnose this problem.

Thanks.

Hey Selimon,
Welcome to the forums!

It seems like you are on the right track and everything should be on its way to working. Could you share with us the full code you are using? This may help us get a full idea of what is going on here.

Cheers,
Blayden

Have you tested the panel separately? Without the ESP32?

Hello Blayden,

Thanks for the quick reply.

I wanted to note that I changed the ‘C’ pin from 33 → 39.

This is the code I am running:
#define PANEL_RES_X 32 // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module.
#define PANEL_CHAIN 1 // Total number of panels chained one to another

#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>

MatrixPanel_I2S_DMA *dma_display = nullptr;

void setup() {

Serial.begin(112500);

HUB75_I2S_CFG::i2s_pins _pins = {
4, //R1_PIN,
5, //G1_PIN,
6, //B1_PIN,
7, //R2_PIN,
15, //G2_PIN,
16, //B2_PIN,
18, //A_PIN,
8, //B_PIN,
39, //C_PIN,
42, //D_PIN,
-1, //E_PIN,
40, //LAT_PIN,
2, //OE_PIN,
41, //CLK_PIN
};

HUB75_I2S_CFG mxconfig(
PANEL_RES_X, // Module width
PANEL_RES_Y, // Module height
PANEL_CHAIN //, // chain length
//_pins // pin mapping – uncomment if providing own custom pin mapping as per above.
);
//mxconfig.clkphase = false;
//mxconfig.driver = HUB75_I2S_CFG::FM6126A;

// Display Setup
dma_display = new MatrixPanel_I2S_DMA(mxconfig);
dma_display->begin();
dma_display->clearScreen();
}

void loop() {
// Canvas loop
float t = (float)((millis() % 4000) / 4000.f);
float tt = (float)((millis() % 16000) / 16000.f);

for (int x = 0; x < (PANEL_RES_X * PANEL_CHAIN); x++) {
// calculate the overal shade
float f = (((sin(tt - (float)x / PANEL_RES_Y / 32.) * 2.f * PI) + 1) / 2) * 255;
// calculate hue spectrum into rgb
float r = max(min(cosf(2.f * PI * (t + ((float)x / PANEL_RES_Y + 0.f) / 3.f)) + 0.5f, 1.f), 0.f);
float g = max(min(cosf(2.f * PI * (t + ((float)x / PANEL_RES_Y + 1.f) / 3.f)) + 0.5f, 1.f), 0.f);
float b = max(min(cosf(2.f * PI * (t + ((float)x / PANEL_RES_Y + 2.f) / 3.f)) + 0.5f, 1.f), 0.f);

// iterate pixels for every row
for (int y = 0; y < PANEL_RES_Y; y++) {
  if (y * 2 < PANEL_RES_Y) {
    // top-middle part of screen, transition of value
    float t = (2.f * y + 1) / PANEL_RES_Y;
    dma_display->drawPixelRGB888(x, y,
                                 (r * t) * f,
                                 (g * t) * f,
                                 (b * t) * f);
  } else {
    // middle to bottom of screen, transition of saturation
    float t = (2.f * (PANEL_RES_Y - y) - 1) / PANEL_RES_Y;
    dma_display->drawPixelRGB888(x, y,
                                 (r * t + 1 - t) * f,
                                 (g * t + 1 - t) * f,
                                 (b * t + 1 - t) * f);
  }
}

}
}

The library can be found here:
ESP32_HUB75_LED_MATRIX_PANEL_DMA_Display.zip (3.3 MB)

Hello Rooppoor212784,

Thanks for the reply.

How would I test the panel separately. Do you mean with another microcontroller?

When I connect the panel to 5V, around 0.088 Amps is drawn, and nothing appears on the screen.

Have you confirmed that the panel is compatible with that library? A quick look at the documentation suggests it is designed for panels that are 64 pixels wide.

An easy test would be to write to the display as if it were 64x32 and see if the first 32 pixels of each set of 16 rows appears.

#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module.
#define PANEL_CHAIN 1 // Total number of panels chained one to another
1 Like

Hello Jeff105671,

thanks for the reply.

I think you are right, I thought that was just the default, and I assumed that there was a 32x32 option as there was a 64x64 option.

I used the Promatter Library by Adafruit, and works quite well.

Thanks for all the help!

2 Likes