☰
ESP32-S3 + HUB75 LED矩阵:照片实时马赛克拼贴装置制作全解析
2026/10/27 1:01:44 网站建设 项目流程

打开乐鑫的社区仓库,经常能看到一串带有“ESP-”前缀的奇怪名字,ESP-Mosaico就是其中之一。我第一次看到这个名,脑子里是“马赛克小游戏”之类的画面,实际做完才发现,这个项目是把一张普通照片,在 LED 点阵屏上实时转成由独立色块拼出来的马赛克拼贴画,效果有点接近像素艺术的现代装置。乐鑫的 ESP32 系列在这里不只是当“灯泡控制器”用,而是把图像解析、色彩映射、驱动时序和交互逻辑揉在了一起,十分适合喜欢折腾的硬件玩家。

这篇文章会从项目拆解、硬件选型、色彩算法到固件实现依次讲清楚,最后补一篇我踩过的坑的记录。如果你手里刚好有一块 ESP32-S3 和一块 HUB75 接口的 LED 矩阵,跟着下面的步骤走完,大概一个晚上就能让照片以马赛克形式亮起来。就算没有现成硬件,读完也能明白这类“图像转 LED 矩阵”项目的核心技术路线,以后再看到类似项目就不会两眼一抹黑。

1. 整体思路:这个项目到底在做什么

1.1 把“马赛克”当成一个可控制的视觉输出任务

马赛克拼贴的核心,是把一张连续色调的图片,拆成数量有限、尺寸统一的色块网格,再让这些色块在整体上还原出原图的信息。ESP-Mosaico 的思路不复杂:乐鑫芯片负责读图,然后按你设定的网格尺寸,比如每 8x8 像素对应 LED 矩阵上的一个灯珠位置,重新生成一张低分辨率的“方块化”画面,最后把这些颜色一个个推到屏上。整个过程听起来简单,真正做起来会在颜色映射、抖动算法和内存分配上遇到不少细节问题。

这个项目区别于普通照片轮播的地方在于,它不只是“把图缩小后显示”,而是刻意保留了马赛克分割的边界感。你可以控制每个色块的大小、显示密度、颜色抖动强度,甚至可以加入实时交互,让不同位置的色块响应传感器数据。这就让它从单纯的显示屏变成了一个有“算法意味”的视觉装置,摆在桌面上当动态相框,或者挂墙上当像素画展示,都很合适。

1.2 适合谁来玩,需要哪些基础

如果你写过 Arduino 程序、用过 ESP32 的 GPIO,那这个项目的上手门槛很低。即使你是第一次接触 LED 矩阵,只要会用一根数据线给开发板烧录固件,也能通过现成库把屏幕点亮,后续再一步步理解算法部分。反过来,如果你主要玩摄影或数字艺术,对硬件不太熟,这个项目反而能帮你打开一个低成本制作实体像素作品的入口:一块板子加一块屏,加上几十行代码,就能把照片变成墙上的动态拼贴。

从难度上划分,我会把 ESP-Mosaico 拆成三级。初级玩法是直接用固件里预置的示例图片跑通显示流程;中级玩法是接入自己的图片库,调整马赛克网格大小、颜色数量、刷新率这些参数;高级玩法才是自己改写色彩映射逻辑,加入传感器输入和多屏拼接。这篇文章主要覆盖初级到中级,最后会留一段扩展思路,足够你做完再折腾一周。

2. 硬件架构与选型逻辑

2.1 为什么是 ESP32-S3,而不是树莓派或者单片机

很多人会问,照片转马赛克这种图像处理,用树莓派不是更省事吗?省事是真省事,但树莓派的价格、体积和功耗放在桌面装置场景里都偏重了。方案旁边的 STM32F4 也不算不行,可它处理一张大图的 YUV 转 RGB、缩放、抖动时,性能余量会很紧张,分给显示刷新任务的时间就少了。

乐鑫 ESP32-S3 在这个项目里有个特别合适的底子:内置 512KB SRAM,外部可以挂 8MB PSRAM,用来缓存一帧完整的图像数据绰绰有余;双核 Xtensa LX7 最高跑到 240MHz,一个核跑图像处理,一个核跑 LED 矩阵刷新,调好了几乎互不干扰;再加上原生支持 RGB 矩阵常用的 I2S/SPI 时序,配合库就能直接输出。这块芯片的性价比和生态成熟度,是它胜出的关键。

如果你手里已经有 ESP32 经典版,也就是双核 240MHz 加 4MB Flash 那个,也能玩,只是 PSRAM 容量小一些,大分辨率图片加载后剩余空间不多。用 ESP32 时我建议把网格设大一点,比如 16x16 像素对应一颗灯珠,减少解码缓冲的压力。至于 ESP32-C3 这种单核方案,跑动态抖动会明显吃力,不太推荐在这个项目里用。

2.2 物料清单与接线参考

硬件清单很直接,核心就三样:一块 ESP32-S3 开发板、一块 HUB75 接口的 RGB 矩阵屏幕、一个能给屏幕稳定供电的 5V 电源。屏幕尺寸从 64x32 到 64x64 都可以,新手建议从 64x32 起步,价格便宜而且调试时看得清每一颗灯珠的颜色变化。开发板选带 PSRAM 的型号,比如 ESP32-S3-DevKitC-1 的 N8R8 版本,或者合宙、微雪那些兼容板,注意板载 USB 串口芯片是否为 CP2102 或 CH343,影响后续烧录稳定性。

接线方面,HUB75 接口本质上是 8 路 RGB 数据加 4 路行选、2 路时钟和锁存,总共有 16 根信号线,如果直接用杜邦线从开发板跳线到屏幕,线一多就会乱。我的做法是把公母杜邦线颜色按功能分组:红色线统一接 R0/R1/G0/G1,绿色线接 B0/B1,黄色线接行地址 A/B/C/D,黑白接 CLK、LAT、OE。大多数库,比如 ESP32-HUB75-MatrixPanel-I2S-DMA 库,会直接给出默认引脚映射,照着接就行。

供电这里多说一句,RGB 矩阵屏全白显示时电流很夸张,一块 64x32 的屏轻松超过 2A,全彩动画甚至冲到 4A。USB 口的 5V 供电只适合点个亮,要真正跑马赛克动画,必须单独配一个 5V/10A 左右的开关电源,同时把屏幕电源和开发板电源共地,否则电平参考不一致会出现各种随机花屏。开发板本身可以用 USB 供电,但 GND 一定要和屏幕电源的 GND 连在一起,这是我后来才认真对待的一条接线。

组件推荐规格数量备注
主控板ESP32-S3 DevKitC N8R81带 PSRAM 8MB,Flash 8MB
RGB 矩阵HUB75 接口 P3/P4,64x321新手选 64x32,进阶选 64x64
电源5V 10A 开关电源1给屏幕供电,必须与开发板共地
逻辑电平转换74HCT245 模块1如果信号线过长或板子驱动弱
连接线16P 公母杜邦线一套1按颜色分组,便于排查
存储SPI Flash 芯片可选1如需大量存图,可外挂 W25Q128

如果你屏幕和开发板之间的距离超过 20 厘米,强烈建议加一个 74HCT245 电平转换缓冲,它能把 ESP32 的 3.3V 信号转成 5V 电平,同时增强驱动能力。矩阵屏的 HUB75 接口是 5V 逻辑,虽然有部分屏幕标称兼容 3.3V,但线一长或者供电波动,电平余量不足就会出现偶发花屏,加了缓冲芯片之后这类问题基本能根除。

3. 核心算法:从照片到马赛克色的转化

3.1 照片、网格与 LED 灯珠的映射关系

要理解 ESP-Mosaico 的显示逻辑,先搞清楚三层坐标:原始图片的像素坐标、马赛克网格坐标、LED 矩阵的物理坐标。假设你有一张 1024x768 的照片,想要在 64x32 的 LED 矩阵上显示,那矩阵每颗灯珠需要“吞掉”原始图片上的 16x24 像素区域,取这个区域内所有像素的平均颜色,作为这颗灯珠最终显示的颜色。这个取平均的过程,就是马赛克化的核心。

实际操作里,我不会对每个区域里的每个像素做累加平均,那样计算量虽然串行主板也扛得住,但每帧都这样做就浪费了 DMA 刷新时间的带宽。更常用的方式是先把图片缩小到与矩阵相同的分辨率,再用缩放后的像素值作为色块颜色。ESP32 上可以用 JPEGDEC 这类库做硬件加速解码,解码后直接得到低分辨率帧到内存,省去一次单独缩放的循环。

另一个容易忽略的点是矩阵的蛇形走线。HUB75 屏幕的灯珠并不是从左到右一行行顺序排列的,偶数行和奇数行的方向常常相反。如果你直接把解码后的像素按顺序推给屏幕,会看到画面像被“拉链”拉开一样。所以写驱动前,第一件事是查清楚自己这块屏幕是蛇形走线还是顺序走线,并在映射函数里做坐标反转。这个问题我第一次跑通时没注意,结果整张脸的花屏和残影折腾了一晚上。

3.2 颜色量化与 Floyd–Steinberg 抖动

当你把一张彩色照片缩小到 64x32 之后,每个像素仍然可以有上千万种颜色,但 LED 灯珠实际能表达的色彩范围有限,尤其是低端 RGB 灯珠,亮度不一致还会进一步压缩有效色域。这时候如果直接取整截断,会出现明显的色带断层,就像渐变天空被硬生生切成了几圈水波纹。要解决这个问题,必须引入颜色量化,更准确说,是带误差扩散的量化和抖动。

最经典的算法是 Floyd-Steinberg 抖动。它的思路不复杂:扫描图像时,把当前像素量化到最接近的可用颜色,算出来的差值不丢掉,而是按比例分发给右、下、左下、右下这几个尚未处理的像素。这样原本断层的色带会被随机散布的噪点填充,肉眼看反而会觉得过渡更连续了。ESP32 在 240MHz 频率下处理 64x32 的帧,每秒跑几十次 Floyd-Steinberg 完全没问题,只要图像分辨率控制在点阵同尺寸以内,性能就不是瓶颈。

我这里贴一段在 ESP32 平台上实现 Floyd-Steinberg 抖动的示意代码,核心逻辑可以直接迁移到 Arduino 或 ESP-IDF 工程里。

// 输入 src:与点阵同尺寸的 RGB 缓冲 // 输出 dst:量化后的 RGB 缓冲 // paletteSize:颜色量化等级,比如 8 表示每个通道 3bit void ditherFloydSteinberg(uint16_t w, uint16_t h, RGB* src, RGB* dst, int paletteSize) { // 我在实际代码里会复制一份 src 到 buffer,因为误差传播会修改像素值 for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { RGB old = src[y * w + x]; RGB quantized; quantized.r = quantizeChannel(old.r, paletteSize); quantized.g = quantizeChannel(old.g, paletteSize); quantized.b = quantizeChannel(old.b, paletteSize); dst[y * w + x] = quantized; int dr = old.r - quantized.r; int dg = old.g - quantized.g; int db = old.b - quantized.b; // 误差按 Floyd-Steinberg 比例扩散到相邻像素 addError(src, w, h, x + 1, y, dr, dg, db, 7); addError(src, w, h, x - 1, y + 1, dr, dg, db, 3); addError(src, w, h, x, y + 1, dr, dg, db, 5); addError(src, w, h, x + 1, y + 1, dr, dg, db, 1); } } }

这段代码只是示意,真实工程里我会把误差扩散操作内联展开,避免每次都做函数调用,还有注意处理图像边界时不要越界。DMA 刷新另一个核正在跑,所以这边的循环不要碰显示缓冲,量化完成后再统一提交,避免出现撕裂画面。抖动算法的好处很明显,但也别过量使用,否则整幅画面会有一种“发毛”的噪点感,我会在强度和平滑区间里调一个适合自己的平衡值。

3.3 亮度校正与伽马补偿

很多人点亮 LED 矩阵的第一个感觉是“颜色太鲜艳了,鲜艳到失真”。这是因为灯珠的亮度与 PWM 占空比并不成线性关系,中低亮度区域尤其明显。如果不做处理,画面暗部会显得发黑,亮部直接过曝,中间调却异常丰富,整体观感偏“电子味”。

伽马校正的公式很常见:输出亮度等于输入值的 gamma 次方,gamma 取值通常在 2.2 到 2.8 之间。在 ESP-Mosaico 里,我对每个 RGB 通道分别做一次查表映射,把线性值转成非线性亮度值。需要注意,不同批次灯珠的 gamma 特性不完全一样,同一个配置在屏 A 上效果很好,换到屏 B 上可能偏绿或者偏红。解决办法是写一段简单的校准流程:手动输入三个通道的固定值,依次显示纯红、纯绿、纯蓝,然后调整映射表的指数系数,直到白色区域不发紫、灰色区域没有色偏。

另外还要考虑环境亮度。在光线充足的客厅里,屏幕亮度太高会刺眼,在暗房里亮度太暗又看不清细节。我习惯在代码里加一个亮度系数,按时间段或环境光传感器自动调整 PWM 的占空比上限。这个逻辑不会改变颜色映射,只是整体调整驱动端输出比例,执行起来成本很低,却能让装置融入不同空间而不显得突兀。

4. 实操过程:从固件搭建到点亮马赛克

4.1 开发框架选型:ESP-IDF 还是 Arduino

ESP-Mosaico 这类项目对底层要求不算苛刻,用 Arduino 框架和用 ESP-IDF 都能做。我的建议是:新手用 Arduino,想长期维护或加多线程复杂功能的人上 ESP-IDF。Arduino 的好处在于生态库齐全,ESP32-HUB75-MatrixPanel-I2S-DMA 这个库把复杂时序全部封装好了,你只管填像素颜色;ESP-IDF 的好处则是有更完善的任务调度、PSRAM 管理和文件系统支持,适合做出帧率更稳定、内存更可控的成品。

如果你选 Arduino,我通常这样搭工程:先安装 ESP32 开发板支持包,然后在库里搜索 HUB75 找到对应库安装。默认示例会显示普普通通的动态雪花或者一行滚动文字,先跑通这个,再替换成自己的马赛克图像流程。库会在启动的时候做一次 DMA 通道初始化,并且把 GPIO 引脚配置到内部 I2S 外设上,理论上刷新率能做到 16 位色深 64x32 屏 60 帧,实际上因为图像解码和抖动会占用时间,稳定跑 30 帧左右就很舒服了。

在 ESP-IDF 里做呢?更清晰:配置 lvgl 或自己写驱动,如果用 LVGL,把绘制绑定到矩阵库即可,这种框架适合做出带交互菜单的完整作品,比如切换图片、调节马赛克尺寸、自选抖动强度。缺点是代码体和宏配置较多,第一次跑通要耐心读模板工程。我的结论是,如果你只想快速看到现象,直接 Arduino;如果你打算把 ESP-Mosaico 变成一个长期摆家里的小型数字艺术设备,ESP-IDF 更值得投入时间。

4.2 核心代码拆解:读图、转马赛克、提交显示

我实际项目里采用的流程可以分成三段:读图解码、像素处理、矩阵刷新。读图阶段使用 JPEGDEC 库,直接把 JPEG 文件解码到 PSRAM 缓冲区;像素处理阶段依次做缩放、颜色量化、抖动和伽马校正;矩阵刷新阶段把处理完的帧复制到 DMA 缓冲区,刷新任务自然读取。三个阶段通过两个环形队列串联,避免相互阻塞。

我先给一个基于 Arduino + MatrixPanel 库的缩略代码,去掉细节后大概长这样:

#include <JPEGDEC.h> #include <ESP32-HUB75-MatrixPanel-I2S-DMA.h> MatrixPanel_I2S_DMA *dmaPanel = nullptr; uint16_t *frameBuf = nullptr; // 从 PSRAM 分配 void setup() { dmaPanel = new MatrixPanel_I2S_DMA(); dmaPanel->begin(); dmaPanel->setBrightness8(128); // 在 PSRAM 里分配帧缓冲 frameBuf = (uint16_t*)ps_malloc(64 * 32 * sizeof(uint16_t)); if (!frameBuf) while (1) delay(10); loadAndConvertImage("/demo.jpg"); } void loadAndConvertImage(const char* path) { JPEGDEC jpeg; // 初始化 SD 卡并打开 JPEG if (jpeg.open((uint8_t*)fb, filesize, JPEG_DRAW_NONE, nullptr)) { jpeg.setPixelType(RGB565_BIG_ENDIAN); jpeg.decode(nullptr, 0); // jpeg 解码回调里会把每个像素缩放映射到 64x32 } }

实际代码会比这个长得多,因为 JPEG 解码库默认输出的是全尺寸图片,我不会真把 1024x768 的图全部解码后再缩小,那样 PSRAM 消耗大但也能接受。更高效的做法,是调用 JPEG 的缩放解码功能,直接以 1/8 或 1/16 的缩放比例输出到指定尺寸,内存占用少一大截。JPEGDEC 支持像素采样参数,比如 HALF、QUARTER、EIGHTH,配合矩阵宽度使用正好。

显示部分最需要注意的是颜色格式。JPEG 解码器通常输出 RGB565 或者 RGB888,HUB75 库内部使用的是 RGB565 或 RGB888 的某种排列,如果你不匹配,会出现红蓝互换或者整个画面色调翻转。最笨也最可靠的办法,是画一个标准测试色卡,依次显示红绿蓝白黑,确认每个通道顺序正确后再调马赛克参数。我每次换新屏都会先做这个测试,省掉了后面排查显示颜色的时间。

4.3 烧录、运行与第一次全彩亮屏

接线检查完毕之后,先用 USB 连接开发板,选择正确的 COM 口和开发板型号。Arduino 菜单里选择 ESP32S3 Dev Module,如果烧录失败或者提示无法进入下载模式,需要按住 BOOT 键再点击烧录,等到编译输出显示连接成功后松开。乐鑫的芯片都是简单直接的下载流程,但每个人第一次都有可能在 BOOT 引脚上卡住,这是完全正常的。

首次亮屏建议先用官方示例的滚动色块测试程序,确认三件事:屏幕拓扑是否正确、颜色是否正常、刷新率是否肉眼可见闪烁。如果色块能连续移动,说明基础驱动没问题;接下来再把 Mosaico 固件烧进去。第一次显示自己照片时,把网格尺寸设置得大一点,比如 8x8 像素对应一颗灯珠,这样马赛克效果最明显,你也容易看出色彩映射是否准确。等到确认整体流程通了,再逐步调小网格尺寸,画面会更接近原图的细节,但色块边界感会减弱。

在我的调试记录里,64x32 屏搭配 4x4 像素马赛克密度时,图片内容依然可辨识,但已经有明显的像素艺术感;8x8 密度则更像抽象画,人脸和风景的细节被强烈简化,适合做背景墙的氛围显示。建议你多试两组参数,找到自己喜欢的效果。亮度方面我提到了校准,实际第一次亮屏先固定 50% 到 70%,太亮容易导致照片高光细节大面积泛白,反而不美观。

5. 常见问题与排查实录

5.1 供电不足:乱闪、偏色、局部熄灭

LED 矩阵最典型的故障是供电没跟上。现象表现为亮度高时画面发灰、某一条线突然熄灭、纯白画面偏黄绿。排查步骤是先量屏幕供电端的电压,在显示大白色块时如果电压掉到 4.5V 以下,基本可以判定电源不够。解决办法是换更大电流的电源,同时把电源线换成至少 18AWG 的软硅胶线,线阻太大会在长距离上白白压掉好几伏特。

另一个隐蔽问题是 PSRAM 供电不足导致程序崩溃,现象是画面闪几下后整个系统重启循环。这个不是屏幕供电的问题,而是开发板上的 3.3V 稳压器同时给芯片和存储供电,电压不稳时最先出问题的往往不是 CPU,而是 PSRAM 的数据读取。我的解决方式是把开发板也从同一个 5V 电源通过板载 LDO 供电,而不用 USB 口供电,这样一来所有电源参考都来自同一个源头,电平和地线都干净了。

5.2 花屏、残影与蛇形走线不匹配

如果你看到画面像被横向拉扯,或者某个区域图案周期性错位,基本都是地址映射错了。HUB75 屏幕的坐标体系取决于屏幕内部 PCB 的走线,有的屏第 0 行从左到右,第 1 行也从左到右,有的屏第 1 行从右到左。处理办法是先在屏幕上打一条斜线,从左上角到右下角画一条渐变色带,观察这条线是否平滑。如果中间出现台阶或者断裂,就打开库配置里的“SNAKE”或者“SerialParallel”开关,把行方向修正过来。

残影还有一个常见来源是 OE 极性设置错误,也就是行扫同步信号反了。这会导致画面整体亮度发灰,关闭时本该熄灭的灯珠还亮着。库的配置里有 INVALID_OE 或 OE 极性开关,切换一下就能解决。这个问题同样可能在更换屏幕型号后出现,记好这个排查项能省很多时间。

5.3 下载失败和矩阵型号不匹配的麻烦

ESP32-S3 首次连接,经常出现“Failed to connect”这样的情况。绝大多数情况是开发板没有进入下载模式。不同开发板进入下载模式的方式不一样,有的需要按住 BOOT 再按一下 RESET,有的则是直接自动复位。另一个容易忽略的点是数据线质量,别用只能充电的线,不仅下载会失败,运行中也可能因为数据线接触不良导致程序反复重启。我专门在工具盒里留了几根标了“可传数据”的短线,就是这个原因。

矩阵型号不匹配,最常见的是扫描模式不同。同样是 64x32,有的屏是 1/16 扫描,有的是 1/8 扫描,库配置里默认值未必适配你手里这块屏。现象是画面只有半屏正常,或者行与行之间出现深色条纹。遇到这种情况,去屏幕商家页面查清楚驱动的扫描配置,然后在库的构造函数里填好行数和扫描比例,问题就能解决。买屏时最好直接备注“用于 ESP32-HUB75 库”,商家就知道发什么型号了。

现象可能原因排查顺序
高亮画面发灰、掉压电源功率不足、线缆太细先测电压,再换电源/线缆
局部熄灭或整片闪地线未连接、OE 极性错误检查共地,再查 OE 配置
画面横向错位或断裂蛇形走线开关未打开跑斜线测试,切换 SNAKE
颜色反相或红蓝互换像素格式不匹配显示三原色测试卡,调格式
下载失败、无响应未进入下载模式、数据线异常按住 BOOT,换数据线
半屏正常半屏条纹扫描模式不匹配核对屏幕扫描参数并修改配置

6. 玩法扩展:从桌面摆件到互动装置

6.1 桌面小相框与墙面大屏的部署差异

如果把 ESP-Mosaico 做成桌面相框,用 64x32 屏就够了,铝合金 U 形槽边框或者亚克力夹板都可以,厚度控制在 5 厘米以内很精致。此时供电可以选用一个 5V/3A 的小型电源适配器,藏在相框底座的理线槽里,整体只露出一根 DC 线,不破坏桌面的干净感。代码上把图片切换改成按键触发或者定时轮换,每次切换时加一个淡入淡出的过渡动画,观感会立刻上一个档次。

墙面大屏则是另一个维度。用四块 64x64 拼成 128x128 的点阵墙,需要的驱动板数量会增加,但 ESP32-S3 最多可以通过并行 RGB 接口驱动一定数量的面板,超出时要用分屏板把数据拆成多路。拼接之后需要做物理边框消差,屏与屏之间的缝隙不能太大,否则马赛克网格会显得割裂。大屏的供电布线更要谨慎,我见过有人用一整排杜邦线并联电源,结果线材发热严重,后来换成电源分配板才解决。

大屏玩法里,我尤其推荐为马赛克画面加一层“缓慢呼吸”的亮度动态:整幅画面亮度在 60% 到 90% 之间以 30 秒周期缓慢变化。这种动态不改变图案内容,但会让墙面看起来像一件有生命感的装置,而不是一块静止广告牌。实现起来很简单,就是周期性地修改 setBrightness8 的参数,再做一次平滑滤波,避免阶梯感。

6.2 加入传感器和交互逻辑

乐鑫最擅长的就是连接,所以不加交互简直浪费。我给 ESP-Mosaico 加过两个低成本交互模块:一个是 PIR 人体红外传感器,一个是声音传感器。PIR 检测到有人靠近时,马赛克从静态模式切换到动画模式,比如让每个色块做轻微的周期偏移,人离远之后 30 秒恢复静态。声音传感器则可以用来控制马赛克密度,声音越大会让色块分割得更碎,画面从抽象慢慢变成接近原图的细节,音乐律动感和画面变化能形成一种粗糙的联觉体验。

在代码实现上,传感器输入统一放进一个浅队列,主循环每 20ms 读取一次最新值,不做滤波的原始数据直接使用容易抖动,所以我用一个简单的一阶低通滤波平滑数值。滤波参数要根据场景调,PIR 的延迟可以大一点,声音则要响应快一些。这样交互逻辑不会阻塞图像刷新任务,两个核各司其职,稳定跑几天都不重启。

最后再扩展一个内容层面:图像源不一定要来自照片。你可以把文字转成位图再马赛克化,做成一块缓慢滚动的诗意标语墙;也可以把电脑屏幕上的小窗口画面截图同步过来,让 LED 矩阵成为桌面的一处像素镜像。这些变体本质上都是在 ESP-Mosaico 的框架里换输入源和映射规则,核心算法和驱动代码完全不用动。我的经验是,先完成一条稳定的照片到屏幕链路,后面往任何交互方向扩展都会顺手很多,因为你已经有了一个可靠的地基。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询