打造一款像素艺术LED矩阵时钟
在一块3D打印扩散器后方,安装了四块LED面板,由树莓派驱动。明亮的白色数字在不断变化的彩色背景中闪烁——或者将屏幕翻转,数字便会呈现负数显示。
其下方仅由1024颗LED组成,但它们前方则是一块3D打印的扩散器,为每颗LED提供独立的小型“单元格”空间,使整个画面呈现出清晰锐利的像素艺术效果,而非零散的亮点。
硬件配置
画布由四块OzzMaker 16×16 RGB LED面板串联而成,从左至右拼接成一个64×16的显示屏,共1024个像素。通过OzzMaker的LED接口连接树莓派,使用Henner Zeller开发的rpi-rgb-led-matrix库,以高速传输数据到各面板。将面板按OUT→IN方向连接,提供适当电源后,树莓派便将其视为一条连续的宽幅条状图像。
3D打印的扩散器直接位于面板正前方,形成网格结构,为每颗LED提供独立的封闭小单元空间。它将原始的、发亮的点状光源软化为清晰均匀发光的方块,使显示屏呈现出清晰的像素艺术效果,而非散落的亮光点。这些像素之间的硬质边框也营造了白色数字的视觉效果:亮白色的数字与旁边的彩色区域在边缘处形成鲜明的高对比度分界,而不是相互渗透。这是构建中最便宜的部分,却承担了最多的任务——区别于“带有LED的电路板”和“屏幕”的本质差异。扩散器同时起到支架的作用。
如下图所示,扩散器背面内部壁面使用黑色PLA打印,以防止LED之间出现光线泄漏。该部件由Babu Lab P2S多色打印机打印而成。
绘制数字
所有内容首先被渲染到一个简单的内存缓冲区中——即64×16个RGB元组的列表——最后才推送到硬件上。数字本身采用传统的七段数码显示方式,每个数字仅由一组小矩形构成;每个数字表示需要亮起的七段:# 每个数字点亮的7个段(a=顶部,g=中间,……)
SEGMENTS = { “0”: “abcdef”, “1”: “bc”,“2”: “abged”,“3”: “abgcd”,“4”: “fgbc”,“8”: “abcdefg”,# … }
默认情况下,这些段落以白色在彩色背景上显示,因此时间。
数字本身采用传统的七段显示方式。每个数字只是若干小矩形的组合;每个数字表示需要亮起的段:
一个用于实时调整的小型网页面板
通过编辑文件并重启来修改设置非常麻烦,因此同一程序还运行了一个小型 Flask 网页面板。从网络中的任何手机或笔记本电脑打开,即可看到亮度、调色板、效果、过渡等选项的滑块和下拉菜单——同时还能实时预览面板正在绘制的实际画面。每次更改都会保存到 settings.json 文件中,并在重启后保留。其底层结构是一个进程,包含两个线程,彼此完全不干扰:一个渲染线程负责管理矩阵,每帧运行约 20 帧;另一个是 Web 服务器。两者仅通过一组线程安全的对象进行通信——设置信息输入,状态帧输出。保持边界清洁,使得在不断添加功能时,显示始终不会卡顿,从而确保了安全性。
本文编译自hackster.io





