Управление матрицей HUB75 контроллером ESP32 для отображения номеров атомобилей.

armen13

✩✩✩✩✩✩✩
24 Фев 2026
2
0
Доброго дня!

Имею рабочую систему на ESP32, которая получает на http сервер пакет от камеры (которая распознаёт номер автомобиля) и если номер есть в базе, то замыкает реле и открывает шлагбаум.
Заметил, что камера не всегда правильно распознаёт или вообще не распознаёт номер, но жители посёлка знают, что камера вроде как работает и ждут распознавания, а оно уже случилось, но без положительного результата.
Задумал выводить информацию о распознанном номере (или номер не распознан) на экран.

Немного (моя ошибка) почитав про матрицы на шине HUB75, решил приобрести одну такую для экспериментов.
С ходу она не запустилась библиотекой https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA (работает только половина экрана и то что вывожу только отдалённо напоминает то, что хотелось бы и, если не знать что должно быть, то и не догадаться, а вот полную заливку делает, но тоже раз через раз половина экрана другим цветом горит) и так же библиотекой https://github.com/LAutour/ESP32-HUB75-MatrixPanel-DMA-ICN2053 (выводит вообще полную ерунду, даже если попросить залить полностью экран одним цветом) и как выяснилось это и не мудрено т.к. у меня вот такая матрица:
High Brightness Outdoor Smd 320x160mm RGB HUB75 5mm Pixel Pitch P5 LED Panel Led Display Screen Module.
На самой матрице есть 4 чипа с маркировкой SM5166PF AQCAVJAA29, куча CHIP NE ICN2037BP D15769NB и два чипа DP245D 4K3001.

Есть бирка SW0240 5166/2037
Есть маркирововка P5-1921-64*32-8S-S2

P5 Outdoor LED Module 320×160mm
Unit Module Specifications

Model:
P5 mm Outdoor Full Color LED Module
Pixel Pitch: 5 mm
Pixel Configuration: 3in1 (1R1P1G1B)
Module Size: 320mm × 160mm
Module Resolution: 64 × 32 dot
LED chip: SMD 2525 / 1921
Pixel Density: 40000 dots / m²
Driving Method: Constant Current Driving
Scan Method: 1/8 scan
Interface Way: HUB75
Brightness: ≥ 5500 cd / sqm
Certificate: FCC, CCC, ROHS, TUV, CE, ISO9001

Прошу помочь подобрать связку матрица-библиотека, которую можно сейчас приобрести и это запустится на ESP32 WROOM.
А если вы знаете как запустить матрицу, которая есть у меня, то вообще будет здорово.

Спасибо!
 

bort707

★★★★★★✩
21 Сен 2020
3,430
986
Прошу помочь подобрать связку матрица-библиотека,
Ваша панель вполне будет работать на библиотеке ESP32-HUB75-MatrixPanel-DMA, если настроить.

если вы знаете как запустить матрицу, которая есть у меня, то вообще будет здорово.
знаю
См https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA/discussions/622
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,350
1,328
Москва
К чему такие сложности ? На мой взгляд достаточно простой цветовой дифференциации штанов распознания. Машина подъехала, распознана успешно - зажгли зеленым светом, не распознали - красным. Подержали, потушили.
 
  • Лойс +1
Реакции: bort707

bort707

★★★★★★✩
21 Сен 2020
3,430
986
@armen13, короче, если сами не справитесь - пишите сюда или на гитхаб в репо библиотеки Esp32Hub75MatrixpanelDMA
 

armen13

✩✩✩✩✩✩✩
24 Фев 2026
2
0
@Старик Похабыч, думаю для того чтобы водитель видел какой номер распознался и если распознался не его (ошибка распознавания больше чем два символа или просто unknown), то "перезаехать" или позвонить охране или тому куда едет, а не просто "Красный" без объяснения причин.
В задумке потом выводить на этот же дисплей в режиме ожидания время, температуру и влажность скажем.
Для гостей, т.е. не постоянных жителей, выводить информацию на каком повороте им следует повернуть и куда.
Для гонщиков, тех кто гонял в прошлый раз, выводить сколько секунд осталось до открытия (скажем 30 сек + сколько-то в зависимости от превышения), чтоб они чувствовали себя увереннее на старте :)
Да много чего можно выводить.

@bort707, спасибо за наводку. Долго мучался с подбором работающих параметров, но пока есть два относительно стабильных результата:
1. Работает только правая половина матрицы, но всё равно есть какие-то подсветки и артефакты.
C++:
#include <Arduino.h>
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
#include "ESP32-VirtualMatrixPanel-I2S-DMA.h"

// -------- HUB75 pins --------
#define R1_PIN 25
#define G1_PIN 26
#define B1_PIN 27
#define R2_PIN 14
#define G2_PIN 32     // было 12
#define B2_PIN 13

#define A_PIN  23
#define B_PIN  19
#define C_PIN  5
#define D_PIN  17
#define E_PIN  -1

#define LAT_PIN 18    // было 4
#define OE_PIN  33    // было 15
#define CLK_PIN 16

#define PANEL_RES_X 64
#define PANEL_RES_Y 32

#define NUM_ROWS 1
#define NUM_COLS 1
#define SERPENT true
#define TOPDOWN false
#define VIRTUAL_MATRIX_CHAIN_TYPE CHAIN_BOTTOM_RIGHT_UP

MatrixPanel_I2S_DMA *dma_display = nullptr;

class CustomPxBasePanel : public VirtualMatrixPanel {
public:
  using VirtualMatrixPanel::VirtualMatrixPanel;

protected:
  VirtualCoords getCoords(int16_t x, int16_t y);
};

inline VirtualCoords CustomPxBasePanel::getCoords(int16_t x, int16_t y) {
  coords = VirtualMatrixPanel::getCoords(x, y);
  if (coords.x == -1 || coords.y == -1) return coords;

  uint8_t pxbase = panelResX;

  if (panelResY == 32) {
    if ((coords.y & 8) == 0) {
      coords.x += ((coords.x / pxbase) + 1) * pxbase;
    } else {
      coords.x += (coords.x / pxbase) * pxbase;
    }
    coords.y = (coords.y >> 4) * 8 + (coords.y & 0b00000111);
  }

  return coords;
}

CustomPxBasePanel *panel = nullptr;

void setup() {
  Serial.begin(115200);
  delay(200);

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

  HUB75_I2S_CFG mxconfig(
    PANEL_RES_X * 2,
    PANEL_RES_Y / 2,
    NUM_ROWS * NUM_COLS,
    pins
  );

  mxconfig.clkphase = false;

  dma_display = new MatrixPanel_I2S_DMA(mxconfig);
  dma_display->setBrightness8(80);
  if (!dma_display->begin()) {
    Serial.println("I2S memory allocation failed");
    while (true) delay(1000);
  }
  dma_display->clearScreen();

  panel = new CustomPxBasePanel((*dma_display), NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, VIRTUAL_MATRIX_CHAIN_TYPE);
}
int z=0;
int v=0;
void loop() {
  dma_display->clearScreen();

  // Заполнение: сверху вниз, слева направо, построчно
  for (int y = 0; y < panel->height(); y++) {
    for (int x = 0; x < panel->width(); x++) {
      panel->drawPixel(x, y, panel->color565(255, v, z));
      delay(20);
    }
  }
  delay(1000);
  z=z+10;
  v=v+10;
}
2. Если попробовать прогнать тест по изменению цветов в четвертях матрицы, то при нажатии на кнопку reset на ESP32 появляются нужные цвета в нужных четвертях, но не всегда правильно в левой половине, и никогда левая половина не обновляется.

C++:
#include <Arduino.h>
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
#include "ESP32-VirtualMatrixPanel-I2S-DMA.h"

#define R1_PIN 25
#define G1_PIN 26
#define B1_PIN 27
#define R2_PIN 14
#define G2_PIN 32     // было 12
#define B2_PIN 13

#define A_PIN  23
#define B_PIN  19
#define C_PIN  5
#define D_PIN  17
#define E_PIN  -1

#define LAT_PIN 18    // было 4
#define OE_PIN  33    // было 15
#define CLK_PIN 16

#define PANEL_RES_X 64
#define PANEL_RES_Y 32

MatrixPanel_I2S_DMA *dma_display = nullptr;

class Px64x32_1_8 : public VirtualMatrixPanel {
public:
  using VirtualMatrixPanel::VirtualMatrixPanel;

protected:
  VirtualCoords getCoords(int16_t x, int16_t y) override {
    coords = VirtualMatrixPanel::getCoords(x, y);
    if (coords.x < 0 || coords.y < 0) return coords;

    const int pxbase = panelResX;
    if (panelResY == 32) {
      if ((coords.y & 8) == 0)
        coords.x += ((coords.x / pxbase) + 1) * pxbase;
      else
        coords.x += (coords.x / pxbase) * pxbase;

      coords.y = (coords.y >> 4) * 8 + (coords.y & 0x07);
    }
    return coords;
  }
};

Px64x32_1_8 *panel = nullptr;

uint8_t x = 0, y = 0, z = 0;

void setup() {
  Serial.begin(115200);
  delay(200);

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

  HUB75_I2S_CFG mxconfig(PANEL_RES_X * 2, PANEL_RES_Y / 2, 1, pins);

  mxconfig.double_buff = true;
  mxconfig.clkphase    = false;

  dma_display = new MatrixPanel_I2S_DMA(mxconfig);
  if (!dma_display->begin()) {
    Serial.println("❌ begin() failed");
    while (true) delay(1000);
  }

  dma_display->setBrightness8(200);

  panel = new Px64x32_1_8((*dma_display), 1, 1, PANEL_RES_X, PANEL_RES_Y, CHAIN_BOTTOM_RIGHT_UP);

  // Первичный кадр
  panel->clearScreen();
  panel->fillRect(0, 0, 32, 16, panel->color565(255, 0, 0));
  panel->fillRect(32, 0, 32, 16, panel->color565(0, 255, 0));
  panel->fillRect(0, 16, 32, 16, panel->color565(0, 0, 255));
  panel->fillRect(32, 16, 32, 16, panel->color565(255, 255, 0));

  dma_display->flipDMABuffer();
}

void loop() {
  panel->clearScreen();

  panel->fillRect(0, 0, 32, 16, panel->color565(255, x, 0));
  panel->fillRect(32, 0, 32, 16, panel->color565(0, 255, y));
  panel->fillRect(0, 16, 32, 16, panel->color565(0, z, 255));
  panel->fillRect(32, 16, 32, 16, panel->color565(255, 255, x));

  dma_display->flipDMABuffer();

  delay(100);
  x += 10;
  y += 10;
  z += 10;
}
В какой-то момент руки опускаются и хочется попросить ссылку на рабочую матрицу с этой или другой библиотекой.
Уже хочется обкатывать сборку по существу, а тут приходится мучаться с запуском одной панели, а когда их будет 4 или 9?
Никто же не даёт гарантии, что там других проблем не будет.
Это я так, от усталости.

 

bort707

★★★★★★✩
21 Сен 2020
3,430
986
Вы не поняли моего сообщения. Там ничего не надо пробовать. Все настраивается аналитически. Я же написал - пишите, я вам подберу.
приходится мучаться с запуском одной панели, а когда их будет 4 или 9?
Если вы хотите использовать 4 или 9 панелей в одном экране, они строго должны быть из одной партии, т.е их надо покупать разом а не сегодня одну, завтра еще и тд