ESP32 驱动 HUB75 LED 矩阵屏双屏级联显示(WiFi 配网 + TCP 推流 + NTP 时钟)

前言

HUB75 接口的 LED 矩阵屏亮度高、刷新快,是做信息屏、时钟、动态画面的常见选择。但 HUB75 的扫描时序如果自己用 GPIO 模拟,很难做到不闪烁,好在有现成的 I2S-DMA 驱动库。本文记录我用 ESP32 + 两块 64×64 HUB75 屏级联,实现「WiFi 按需配网 + TCP 推流显示 + 默认 NTP 时钟」的完整过程,并给出双屏级联的快速验证方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码地址

完整工程已开源在 Gitee,欢迎 Star / 交流:

  • 仓库地址:https://gitee.com/chen-changyiEAsycc/two-esp32hub75eoled
  • SSH 克隆:git clone git@gitee.com:chen-changyiEAsycc/two-esp32hub75eoled.git

一、硬件准备

名称 说明
ESP32 开发板 普通ESP32即可,带 PSRAM 更稳
HUB75 LED 矩阵屏 64×64,1/32 扫描(带 E 脚)×2
排线 / 杜邦线 屏之间级联用排线,屏到 ESP32 用杜邦线
独立 5V 电源 屏功耗大,不能只靠 ES

⚠️ 64×64 屏是 1/32 扫描,比 32×32(1/16)多一根 E 地址线,接线时务必接上,否则花屏或不亮。

二、接线表

HUB75 ESP32 GPIO
R1 25
G1 26
B1 27
R2 14
G2 12
B2 13
A 23
B 19
C 5
D 17
E 18
LAT 4
OE 15
CLK 16

两块屏之间:第一块屏的输出排线接第二块屏的输入排线即可,ESP32 这边引脚不变(级联由库内部处理)。

三、依赖库

在 Arduino IDE「库管理器」安装:

  • ESP32-HUB75-MatrixPanel-I2S-DMA(作者 mrfaptastic)—— 核心 DMA 驱动
  • WiFiManager —— 按需配网(AP 配置门户)

四、级联原理(重点)

这个库的级联是纯参数配置,不需要改任何接线:

HUB75_I2S_CFG mxconfig(
    PANEL_WIDTH,   // 单屏宽 64
    PANEL_HEIGHT,  // 单屏高 64
    PANEL_CHAIN    // 链长:2 表示两块横向级联
);

第三个参数 chain_length 设为 2 后,库会把整个显示当作一个 128×64 的虚拟屏来寻址:左半区 x=0~63 对应第 1 块屏,右半区 x=64~127 对应第 2 块屏。drawPixelRGB888(x,y,r,g,b) 直接用 0~127 的 x 坐标即可,GPIO 完全不变,两块屏靠排线菊花链连接。

五、完整工程架构

整体流程:上电 -> WiFi 自动配网 -> 启动 TCP 服务(5000 端口)-> 接收 128×64×3 的 RGB888 帧 -> 逐像素绘制;空闲时显示 NTP 时钟。

关键点:

  1. 按需配网:用 WiFiManager,首次启动无配网信息时生成 ESP32_Setup 热点,手机连上配置 WiFi,之后自动连接。
  2. 推流协议:每帧 128×64×3 = 24576 字节,TCP 连续接收,凑满一帧绘制一帧。
  3. 默认时钟:没有客户端连接时,每秒刷新一次 NTP 时间,避免空屏;NTP 用国内服务器 cn.pool.ntp.orgntp.aliyun.com 更稳。

六、双屏级联验证:左屏 1、右屏 2(颜色不同)

配好级联后,最直观的验证方式:左屏画 1、右屏画 2,且颜色不同,一眼就能看出两块屏是否各自正常、级联方向对不对。

// 在指定区域内画一个大号字符并居中
void drawBigCharCentered(char c, uint16_t color, int regionX, int regionW, int regionH)
{
matrix->setTextSize(8);
matrix->setTextColor(color);
matrix->setTextWrap(false);

char s[2] = {c, '\0'};
int16_t  tbx, tby;
uint16_t tbw, tbh;
matrix->getTextBounds(s, 0, 0, &tbx, &tby, &tbw, &tbh);
matrix->setCursor(regionX + (regionW - tbw) / 2 - tbx,
                        (regionH - tbh) / 2 - tby);
matrix->print(s);

}

void setup() {
Serial.begin(115200);
setupMatrix();
// 左屏(0~63) 青色 1,右屏(64~127) 黄色 2
drawBigCharCentered(‘1’, matrix->color565(0, 255, 255), 0, 64, 64);
drawBigCharCentered(‘2’, matrix->color565(255, 255, 0), 64, 64, 64);
}

void loop() { /* 固定显示,无需刷新 */ }


预期效果:左边屏青色 `1`,右边屏黄色 `2`。根据现象排查:

- 只显示一个数字 -> 另一块屏排线/电源有问题;
- 两个数字都在同一块屏上 -> 级联线没接(实际链长还是 1);
- 左右颠倒 -> 两块屏物理顺序与库默认相反,对调排线或交换 1/2 即可。

## 七、常见问题

1. **屏完全不亮**:先查 `E` 脚(64×64 必须)、`OE/LAT/CLK`,再查独立电源与共地。
2. **花屏 / 上下半屏错位**:`R1/G1/B1` 与 `R2/G2/B2` 接反。
3. **NTP 不同步导致黑屏**:国内 `pool.ntp.org` 可能超时,换成 `cn.pool.ntp.org`、`ntp.aliyun.com`,并在未同步时显示 `--` 兜底,别让屏空着。
4. **级联后内存不足**:128×64 的 DMA 缓冲 + 帧缓冲更大,必要时降低色深或换带 PSRAM 的 ESP32。
5. **文字偏左**:`1` 这类窄字符用 `getTextBounds` 取真实边界再居中,比按字符宽度居中更准。

## 八、总结

- HUB75 双屏级联只需把库的 `chain_length` 设为 2,硬件接好排线即可,软件上是一个 128×64 虚拟屏,无需改 GPIO。
- 用「左 1 右 2、颜色不同」可以快速验证级联是否成功、方向是否正确。
- 配合 WiFiManager 按需配网 + TCP 推流,就能做成一个可远程刷新画面的 LED 显示终端;空闲时还能当 NTP 时钟用。

如果你也在玩 LED 矩阵屏,欢迎留言交流。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐