ESP32 驱动 HUB75 LED 矩阵屏双屏级联显示(WiFi 配网 + TCP 推流 + NTP 时钟)
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 时钟。
关键点:
- 按需配网:用 WiFiManager,首次启动无配网信息时生成
ESP32_Setup热点,手机连上配置 WiFi,之后自动连接。 - 推流协议:每帧
128×64×3 = 24576字节,TCP 连续接收,凑满一帧绘制一帧。 - 默认时钟:没有客户端连接时,每秒刷新一次 NTP 时间,避免空屏;NTP 用国内服务器
cn.pool.ntp.org、ntp.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 矩阵屏,欢迎留言交流。
更多推荐


所有评论(0)