Someone help me pls about P10 Using PxMatrix on esp8266

I'm using a P10 display with the model P10-1921-8S-32x16-B, but I can't seem to control the LEDs to display anything properly using the PxMatrix library along with Adafruit_GFX and Ticker. The output is always the same: rows 1–4 are off, 5–8 are on, 9–12 are off, and 13–16 are on.

Here is the wiring configuration I'm using (ESP8266 to P10 panel):
P_A 5 // D1
P_B 4 // D2
R_1 0// D3
R_2 2// D4
P_CLK 14 // D5
P_LAT 12 // D6
P_OE 13 // D7
P_C 15 // D8
I'm currently testing only the red color.

The problem is: I can't control the LEDs correctly. Sometimes, only certain rows light up, and other times the display turns white—even though I'm only trying to show red. What could be causing this issue?

here is my code : please ignore the html first


#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Adafruit_GFX.h>
#include <PxMatrix.h>
#include <Ticker.h>


const char* ssid = "bla";
const char* password = "blablalba";

ESP8266WebServer server(80);


#define P_CLK 14  // D5
#define P_LAT 12  // D6
#define P_OE 13   // D7
#define P_A   5   // D1
#define P_B   4   // D2
#define P_C 15  // D8





#define DISPLAY_WIDTH 32
#define DISPLAY_HEIGHT 16

PxMATRIX display(DISPLAY_WIDTH, DISPLAY_HEIGHT, P_CLK, P_LAT, P_OE, P_A, P_B, P_C);
Ticker display_ticker;


String incomingText = "selamat";
int scrollPosition = DISPLAY_WIDTH;
int brightness = 0;
int scrollSpeed = 100;


void display_updater() {
  display.display(70);
}

void handleRoot() {
  String html = R"rawliteral(
<!DOCTYPE html>
<html>
<head><title>P10 Display Control</title></head>
<body style="font-family:sans-serif; text-align:center;">
  <h2>ESP8266 P10 LED Display</h2>
  <form action="/send" method="POST">
    <input type="text" name="msg" placeholder="Enter text to display" style="width:300px; padding:10px;" />
    <br><br>
    <input type="submit" value="Send to LED Display" style="padding:10px; font-size:16px;" />
  </form>
  
  <br><br>
  <form action="/brightness" method="POST">
    <label for="brightness">Brightness:</label><br>
    <input type="range" name="level" min="0" max="255" value=")rawliteral" + String(brightness) + R"rawliteral(" oninput="brightnessValue.innerText = this.value">
    <span id="brightnessValue">)rawliteral" + String(brightness) + R"rawliteral(</span><br><br>
    <input type="submit" value="Set Brightness" style="padding:10px; font-size:16px;" />
  </form>

  <br><br>
  <a href="/info" style="font-size:16px;">Lihat Info Komunikasi</a>
</body>
</html>
)rawliteral";


  server.send(200, "text/html", html);
}



void handleSend() {
  if (server.hasArg("msg")) {
    incomingText = server.arg("msg");
    scrollPosition = DISPLAY_WIDTH;
  }
  server.sendHeader("Location", "/");
  server.send(303);
}

void handleBrightness() {
  if (server.hasArg("level")) {
    brightness = server.arg("level").toInt();
    display.setBrightness(brightness);
  }
  server.sendHeader("Location", "/");
  server.send(303);
}

void handleInfo() {
  String infoHtml = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <title>Info Komunikasi</title>
  <style>
    @keyframes scrollText {
      0% { left: 100%; }
      100% { left: -100%; }
    }
    .scroll-container {
      border: 2px solid #000;
      width: 320px;
      height: 32px;
      margin: auto;
      background: black;
      overflow: hidden;
      position: relative;
    }
    .scroll-text {
      color: red;
      white-space: nowrap;
      font-size: 24px;
      position: absolute;
      left: 100%;
      animation: scrollText 10s linear infinite;
    }
  </style>
</head>
<body style='font-family:sans-serif; text-align:center;'>
  <h2>Informasi Komunikasi</h2>
  <p><strong>WiFi SSID:</strong> )rawliteral" + String(ssid) + R"rawliteral(</p>
  <p><strong>IP Address:</strong> )rawliteral" + WiFi.localIP().toString() + R"rawliteral(</p>
  <p><strong>Brightness:</strong> )rawliteral" + String(brightness) + R"rawliteral(</p>
  <p><strong>Teks Berjalan:</strong> )rawliteral" + incomingText + R"rawliteral(</p>

  <h3>Simulasi LED Display</h3>
  <div class="scroll-container">
    <div class="scroll-text" id="previewText">)rawliteral" + incomingText + R"rawliteral(</div>
  </div>

  <br><br><a href='/'>Kembali ke Halaman Utama</a>
</body>
</html>
)rawliteral";

  server.send(200, "text/html", infoHtml);
}


void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);


  display.begin(8);
  display.setFastUpdate(true);
  display.setTextWrap(false);
  display.setBrightness(brightness);

  display.clearDisplay(); 

  display_ticker.attach_ms(1, display_updater); 

  server.on("/", handleRoot);
  server.on("/send", HTTP_POST, handleSend);
  server.on("/brightness", HTTP_POST, handleBrightness);
  server.on("/info", HTTP_GET, handleInfo);
  server.begin();
  
  //SPEED SCROLL
  server.on("/speed", HTTP_POST, []() {
  if (server.hasArg("val")) {
    scrollSpeed = server.arg("val").toInt();
  }
  server.sendHeader("Location", "/");
  server.send(303);
});

}

void loop() {
  server.handleClient();

  display.fillScreen(0); // clear

  int cursorX = scrollPosition;
  int charWidth = 6; // default lebar karakter (5 px + 1 px spasi)
  display.setTextColor(display.color565(255, 0, 0)); // warna merah

  for (int i = 0; i < incomingText.length(); i++) {
    if (cursorX > -charWidth && cursorX < DISPLAY_WIDTH) {
      display.drawChar(cursorX, 0, incomingText[i], display.color565(255, 0, 0), 0, 1);
    }
    cursorX += charWidth;
  }

  scrollPosition--;
  if (scrollPosition < -((int)incomingText.length() * charWidth)) {
    scrollPosition = DISPLAY_WIDTH;
  }

  delay(scrollSpeed);
}

As I see. you forget to attach your display_updater() routine to Ticker.
See the library examples.

Aren't we supposed to call this just once inside void setup()? Because when I checked the example, they only include it once:

 display_ticker.attach_ms(1, display_updater); 

but the text still no result

To order the matrix work, the updater must be called about 1000 times in a second.

According to your issue (1st and 9nd lines are brighter) - the matrix refreshing is not performing correctly.

Try to run one of the examples as it is, without adding your own code.

#include <PxMatrix.h>


#ifdef ESP32

#define P_LAT 22
#define P_A 19
#define P_B 23
#define P_C 18
#define P_D 5
#define P_E 15
#define P_OE 16
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

#endif

#ifdef ESP8266

#include <Ticker.h>
Ticker display_ticker;
#define P_LAT 12
#define P_A 5
#define P_B 4
#define P_C 15

#define P_OE 13

#endif
// Pins for LED MATRIX

PxMATRIX display(32,16,P_LAT, P_OE,P_A,P_B,P_C);
//PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D);
//PxMATRIX display(64,64,P_LAT, P_OE,P_A,P_B,P_C,P_D,P_E);

#ifdef ESP8266
// ISR for display refresh
void display_updater()
{
  display.displayTestPattern(70);
  // display.displayTestPixel(70);
  //display.display(70);
}
#endif

#ifdef ESP32
void IRAM_ATTR display_updater(){
  // Increment the counter and set the time of ISR
  portENTER_CRITICAL_ISR(&timerMux);
  //isplay.display(70);
  display.displayTestPattern(70);
  portEXIT_CRITICAL_ISR(&timerMux);
}
#endif


uint16_t myCYAN = display.color565(0, 255, 255);
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
  display.begin(4);
  display.flushDisplay();
  display.setTextColor(myCYAN);
  display.setCursor(2,0);
  display.print("Pixel");
  Serial.println("hello");

  #ifdef ESP8266
    display_ticker.attach(0.004, display_updater);
  #endif

  #ifdef ESP32
    timer = timerBegin(0, 80, true);
    timerAttachInterrupt(timer, &display_updater, true);
    timerAlarmWrite(timer, 4000, true);
    timerAlarmEnable(timer);
  #endif

  delay(1000);
}


void loop() {

 delay(100);

}

so this is the example and the result is that only row 5 and row 13 light up — I've already wired them with the RGB colors.

Please read and write to the forum an ID of the every types of the chips on the panel. It should be a three types there.

To be honest, I also don't know what type of chip model is used in this module, because there are no markings at all on the chips.
There is only the display model and the manufacturing date.

any solution?

This does not happen. There are always inscriptions on the chips, but sometimes they are difficult to see. Use a strong magnifying glass with backlight or a mini-microscope.

Also, please show a clear photo of the panel rear side.



Could you show a CLEAR image of the paper label near the center of the panel?

the paper is just like the pabrication number maybe:
it is 1921 DHT202.8135.240911
Model : P10-1921-8S-32X16-B

and some information about the ribbon cable/hub75 (Left-side perspective of the full photo) :
DR1 DG1
DB1 GND
DR2 DG2
DB2 GND
A B
C GND
CLK STB
OE GND

any idea?

This sounds to me like one of the display's row select pins is not connected.

Should there not be a P_D also?

#ifdef ESP32

#define P_LAT 22
#define P_A 19
#define P_B 23
#define P_C 18
#define P_D 5
#define P_E 15
#define P_OE 16
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

#endif

#ifdef ESP8266

#include <Ticker.h>
Ticker display_ticker;
#define P_LAT 12
#define P_A 5
#define P_B 4
#define P_C 15

#define P_OE 13

#endif

In that example code, P_D (and P_E) are defined if an ESP32 board is used, but not defined if an ESP8266 board is used.

Depending on the model of display, it might need only P_A, P_B and P_C. But other models of display might need P_D and maybe P_E also.

Maybe P_D and P_E are not defined in the example code for ESP8266 boards because they knew ESP8266 boards would not have sufficient pins to drive models of display that need them?

If that's true, maybe your model of display can't be driven by an ESP8266 board, at least not using that library.

The number of ABCDE pins depends on matrix scan. It defined as number of bits that required to present a scan number , i.e AB - 4S, ABC - 8S, ABCD - 16s, ABCDE - 32s.
OP has a matrix with 8 scans, so it needs the three address pins - A B C to control.

Sorry, no ideas. Without chip types I unable to say anything helpful.

Have you ever come across a P10 display module like the one I have? If so, do you still remember the type of chip it uses?

So the "8S" in the part name indicates 1-in-8 multiplex scan? Ok then, P_D would not be required.

Yes, but that P10 display cannot be controlled. The only thing I was able to control successfully was the brightness of the LED display.

I have many types of such displays, I work with it some years. The bad news is there are a lot of combinations of the display sizes, scans and chip types.
Unfortunately, there is nothing special in this display model:

Nothing that could be useful to know a chip type.

In your photo I can see that the chips definitely has markings on it, covered by transparent varnish. We could make some progress on the solution if you tried to read them.