《2025 DigiKey AI应用创意挑战赛》AI LED 艺术墙
## 一、作品介绍### 1.1 这玩意儿是啥?
大家好,我是 HonestQiao,一个干了十几年的嵌入式开发工程师。
说实话,这个项目的诞生特别简单——有一天我媳妇跟我说:"你天天鼓捣那些 LED 灯,能不能弄个有意思的东西?"
我一想,对哦!与其整那些花里胡哨的传感器demo,不如整个活儿——**让 LED 屏幕会说话、会思考、能互动**!
于是就有了这个 **AI LED 艺术墙**:

简单来说,就是:
- 你跟它说话,它能听懂
- 它能自己画图(AI 生成的哦)
- 画完了还能在 LED 屏幕上给你秀出来
- 还带彩虹渐变、动态边框,保证亮瞎眼
我媳妇表示:终于不用看我那些无聊的传感器实验了。
### 1.2 这东西能干啥?
| 功能 | 能做啥 | 适用场景 |
|-----|-------|---------|
| AI对话 | 你说它听,它还能回你 | 商场揽客、展览互动 |
| 图片生成 | 告诉它你想要啥,它画给你看 | 定制化广告、节日主题 |
| 文字显示 | 汉字、英文都行,还带颜色 | 表白墙、欢迎词 |
| 动画效果 | 彩虹渐变、边框闪烁、文字移位 | 吸引眼球专用 |
| MCP 控制 | 标准协议,扩展性超强 | 二次开发、物联网集成 |
### 1.3 都能用在哪?
说实话,这东西的应用场景比我一开始想的多多了:
**商场/店铺门口**
- "欢迎光临"自动切换
- 节日主题自动换
- 比传统静态招牌好玩多了
**婚礼/表白现场**
- "XXX,嫁给我吧"大字显示
- AI 生成的浪漫图片
- 现场效果杠杠的(亲测有效,我媳妇很满意)
**展览/活动**
- 互动装置,观众自己玩
- AI 讲解 + LED 展示
- 科技感拉满
**家里自嗨**
- 没事跟 AI 聊聊天
- 生成的图片直接显示
- 朋友们来了演示一下,倍儿有面子
---
## 二、设计思路
### 2.1 怎么想到做这个的?
我是湖北人,大家都知道湖北人有个特点——**不服周**(方言,意思是"不服输、较真")。
嵌入式干了这么多年,看到现在 AI 这么火,我就想:能不能把 AI 和嵌入式结合起来?不能光是云端玩 AI 啊,得让 AI "下凡",跑到硬件上来!
刚好那段时间在做 LED 灯板的项目,就琢磨:要是 LED 屏幕能自己"思考",那多有意思?
然后我就开始动手了。前后花了大概两个月(利用周末和晚上时间),边学边做,遇到问题就解决,解决不了就换方案。中间还踩了不少坑,后面的"研究总结"里我会详细说。
### 2.2 我的设计理念
1. **智能化 —— 能动嘴就绝不动手**
作为一个资深极客,我坚信:\*\*懒是第一生产力\*\*。能语音控制的,绝对不手动操作。所以这个项目主打语音/文字输入,让用户"动动嘴"就能搞定一切。
2. **艺术化 —— 不能只当指示牌**
LED 屏幕如果只显示"欢迎光临"四个大字,那也太无聊了。我给它加上了彩虹渐变、动态边框、文字移位等各种效果,保证看起来不像个土味指示牌。
3. **互动性 —— 能对话才好玩**
接入了小智 AI 云端大模型,它能理解你说的话,还能智能回复。不只是机械地执行命令,而是真的能"对话"。
4. **开源性 —— 独乐乐不如众乐乐**
我是狂热的开源爱好者,代码全部开源。网上那些"开源"项目,要么是阉割版,要么是收费的,我看不惯。我这个项目,从硬件到软件,全套开源,爱咋改咋改。
5. **易用性 —— 降低门槛**
作为一个"乐于助人"的湖北佬(湖北人确实热情),我写代码的时候特别注重易用性。配置文件、环境变量、文档说明,能给的都给配上,就是为了让新手也能跑起来。
### 2.3 为啥选这些技术?
**树莓派 5**
- 便宜!,才 500 块
- 性能够用,Python 跑得飞起
- 生态好,资料多
- GPIO 接口多,能接 5 块 LED 板
**WS2812B LED**
- 便宜!5 块板子才 400 块
- 彩灯效果棒
- 串行控制,线少好接
- 资料一堆,不用自己造轮子
**MCP 协议**
- AI 圈的标准协议
- 小智 AI 原生支持
- 不用自己设计通信格式
- 扩展性强,以后加功能方便
**MiniMax API**
- 图片生成效果好
- 响应速度快
- 价格便宜
- 有免费额度,测试不用花钱
---
## 三、系统框图
### 3.1 整体架构
!(https://www.eefocus.com/forum/data/attachment/forum/202602/01/000906ubpdn3aixaioa33d.png)
### 3.2 通信流程(说人话版)
1.** 你说,它听 **- 对着麦克风说话,或者打字
2. **传到云端** - 行空板把音频/文字发给小智 AI
3. **AI 思考** - 云端大模型理解你的意思
4. **决定干活** - AI 发现需要显示内容,调用 MCP 工具
5. **指令下发** - 通过 MCP Hub 发给树莓派
6. **干活显示** - 树莓派执行,显示在 LED 屏幕上
整个过程也就几秒钟,你说完没2分钟,屏幕就显示出来了。
### 3.3 数据流向
| 阶段 | 数据类型 | 传输方式 | 速度 |
|-----|---------|---------|------|
| 用户输入 | 语音/文字 | 麦克风/键盘 | 即时 |
| 云端处理 | 音频/文字 | HTTP | 取决于网速 |
| AI 决策 | JSON | MCP 协议 | 1-2秒 |
| 指令下发 | JSON | SSE | 即时 |
| LED 控制 | GPIO | 串行 | 毫秒级 |
---
## 四、硬件选型
### 4.1 主要硬件清单
作为一个资深嵌入式工程师,我选硬件的原则是:**够用就行,别花冤枉钱**。
| 序号 | 名称 | 数量 | 单价(元) | 说明 |
|-----|------|-----|---------|------|
| 1 | 树莓派 5 | 1 | 500 | 主控制器,运行 MCP 服务 |
| 2 | 行空板 K10 | 1 | 150 | 运行 xiaozhi-esp32,拾音和对话 |
| 3 | WS2812B LED 灯板 | 5 | 80 | 每块 8×32,拼接成 40×32 大屏 |
| 4 | 5V 3A 电源 | 1 | 30 | 给 LED 灯板供电 |
| 5 | 杜邦线 | 若干 | 10 | 连接 GPIO 和 LED |
| 6 | 开关电源 5V 3A | 1 | 30 | 给树莓派供电 |
| **合计** | | | **~800** | 一顿火锅的钱 |
### 4.2 LED 灯板规格
| 参数 | 值 |
|-----|-----|
| LED 类型 | WS2812B (NeoPixel) |
| 灯板数量 | 5 块 |
| 每块尺寸 | 8 行 × 32 列 = 256 颗灯 |
| 总尺寸 | 40 行 × 32 列 = 1280 颗灯 |
| 控制引脚 | D24, D25, D23, D18, D12 |
### 4.3 灯板布局
```
┌────────────────────────┐板1 (第0-7行)
├────────────────────────┤板2 (第8-15行)
├────────────────────────┤板3 (第16-23行)
├────────────────────────┤板4 (第24-31行)
└────────────────────────┘板5 (第32-39行)
每块板子内部采用蛇形扫描(Z字形):
列0: 上→下列1: 下→上列2: 上→下...
为什么要这么搞?因为 WS2812B 是串行控制的,
蛇形扫描可以让 LED 均匀发光,不会有"阴阳脸"。
```
### 4.4 硬件连接图
```
┌─────────────────────────────────────────────────────┐
│ 树莓派 5 │
│ │
│ GPIO D24 ────────┐ │
│ ├───┼───→ 板1 (8×32) │
│ GPIO D25 ────────┤ │
│ ├───┼───→ 板2 (8×32) │
│ GPIO D23 ────────┤ │
│ ├───┼───→ 板3 (8×32) │
│ GPIO D18 ────────┤ │
│ ├───┼───→ 板4 (8×32) │
│ GPIO D12 ────────┤ │
│ └───┼───→ 板5 (8×32) │
│ │
│ GND ────────────────────────────────────────────────┐
│ 5V────────────────────────────────────────────────┤
│ (电源供电) │
└───────────────────────────────────────────────────────┘
注意:5V 电源要够力,1280 颗 LED 全亮起来需要一定电流。
如果发现亮度不足或闪烁,建议更换更大功率的电源。
```
---
## 五、软件设计
### 5.1 软件架构!(https://www.eefocus.com/forum/data/attachment/forum/202602/01/001026w7bab8e882z8be8w.png)
### 5.2 核心模块说明
#### 5.2.1 MCP 服务端 (led_image_mcp_server.py)
**功能:** 接收 AI 指令,管理任务队列
作为一个被多线程坑过无数次的老工程师,我深知 **"线程安全"** 的重要性。
树莓派5上控制 LED 的 `neopixel_write` 函数,它底层是 C 扩展,**不是线程安全的**。如果多个线程同时调用,直接给你表演一个"段错误"(Segmentation Fault)。
我的解决方案是:**单工作线程 + 任务队列**。
```python
# 所有 LED 操作都在这个线程里执行
def led_worker():
while True:
task = led_task_queue.get()
# 执行显示任务
_do_display_text(...)
led_task_queue.task_done()
# 收到新任务时,先清空队列里旧的
def queue_display_task(text, duration, ...):
while not led_task_queue.empty():
try:
led_task_queue.get_nowait()
led_task_queue.task_done()
except:
break
led_task_queue.put((text[:4], duration, ...))
```
这样就不会有并发问题了,而且新任务会优先执行,响应速度杠杠的。
**核心工具:**
| 工具名 | 参数 | 说明 |
|-------|------|------|
| generate_and_display_image | prompt, duration | 告诉 AI 你想要啥图,它画完给你显示 |
| generate_text_image | text, duration | 生成英文文字图片,比如"LOVE" |
| check_generation_status | wait_timeout | 检查图片生成到哪一步了 |
| get_status | 无 | 服务器还活着没 |
#### 5.2.2 图片生成模块
**功能:** 调用 MiniMax API 生成 AI 图片
这个模块主要干这几件事:
1. **接收提示词** - 比如"一只可爱的猫"
2. **加后缀** - 我写了一个 LED 专用的后缀,让生成的图片更适合 LED 显示
3. **调 API** - 调用 MiniMax 的 image-01 模型
4. **后处理** - 图片二值化、高对比度、转成 LED 像素
```python
# LED 优化提示词后缀
LED_PROMPT_SUFFIX = (
", pixel art style, " # 像素风
"8-bit style, " # 8位风格
"bitmap style, " # 位图风格
"solid black background, " # 纯黑背景
"white content on black, " # 白色内容
"high contrast, " # 高对比度
"content should be LARGE, " # 内容要大
"suitable for LED display" # 适合 LED
)
```
为什么要加这些后缀?因为 AI 生成的图片默认是彩色照片,直接在 LED 上显示效果很差(颜色会混在一起,看不清楚)。用这个后缀生成的图片,是黑底白字/白图案,二值化处理后 LED 显示效果特别好。
#### 5.2.3 LED 显示模块
**功能:** 控制 LED 灯板显示内容
**坐标映射算法** - 这是我花了不少时间调试出来的:
```python
def get_pixel_index(col, row):
"""
屏幕坐标 -> 灯板索引 + 板内索引
蛇形扫描:偶数列从上往下,奇数列从下往上
"""
board_index = row // 8 # 第几块板
local_row = row % 8 # 板内行号
if local_col % 2 == 0:
# 偶数列:从上往下
pixel_index = local_col * 8 + local_row
else:
# 奇数列:从下往上(Z字形)
pixel_index = local_col * 8 + (7 - local_row)
return board_index, pixel_index
```
这个算法看起来简单,但调试的时候坑了我好几次。比如一开始算错了,LED 显示出来是镜像的,文字是反的。后来加了一堆打印语句,一个像素一个像素地验证,才搞定。
**显示效果:**
- **背景**:黑色(不亮)
- **内容**:彩虹渐变颜色(根据位置计算色相)
- **边框**:动态彩虹闪烁动画
### 5.3 技术栈
| 层级 | 技术 | 为啥选它 |
|-----|------|---------|
| AI 对话 | 小智 AI + xiaozhi-esp32 | 云端大模型,理解能力强 |
| 通信协议 | MCP (Model Context Protocol) | AI 圈的事实标准 |
| 传输方式 | SSE (Server-Sent Events) | HTTP 长连接,不用轮询 |
| 主控制器 | 树莓派 5 | 便宜、生态好、Python 友好 |
| LED 驱动 | raspberry-pi5-neopixel-write | 树莓派 5 PIO 模式专用 |
| 图像处理 | Pillow | Python 图像处理老大哥 |
| 动画库 | adafruit-led-animation | 开源、效果好、拿来即用 |
### 5.4 关键代码说明
#### 5.4.1 树莓派 5 LED 适配类
```python
class Pi5Pixelbuf(adafruit_pixelbuf.PixelBuf):
"""
树莓派5专用的 PixelBuf 适配类
树莓派5不能用传统PWM,得用PIO
"""
def __init__(self, pin, size, **kwargs):
self._pin = pin
super().__init__(size=size, **kwargs)
def _transmit(self, buf):
# 用树莓派5的 neopixel_write 驱动
neopixel_write(self._pin, buf)
```
就这几行代码,搞了我两天。树莓派5的资料那时候还不多,很多库不兼容 PIO 模式。后来在一个 GitHub Issue 里发现了这个解决方案,改吧改吧就能用了。
#### 5.4.2 汉字显示
```python
def display_text(text):
"""在 LED 屏上显示汉字(最多4个)"""
img = Image.new("RGB", (32, 40), (0, 0, 0))# 黑底
draw = ImageDraw.Draw(img)
# 加载字体,画汉字
font = ImageFont.truetype(
"fonts/AlibabaPuHuiTi-3-55-Regular.ttf", 32
)
draw.text((x, y), char, font=font, fill=color)
# 遍历像素,写入 LED
for row in range(40):
for col in range(32):
pixel = img.getpixel((col, row))
if pixel != (0, 0, 0):# 黑色不显示
board_idx, pixel_idx = get_pixel_index(col, row)
pixel_objects = pixel
# 发送数据到 LED
for pixels in pixel_objects:
pixels.show()
```
流程就是:**汉字 → 画成图片 → 取像素 → 算坐标 → 写 LED**。简单粗暴,但效果还不错。
#### 5.4.3 彩虹边框动画
```python
def draw_border(hue_offset=0):
"""绘制彩虹渐变边框"""
for col in range(32):
hue = (col / 32 + hue_offset) % 1.0
color = hsv_to_rgb(hue, 1.0, 0.1)# 亮度 10%
set_pixel_no_clear(col, 0, color) # 上边框
set_pixel_no_clear(col, 39, color) # 下边框
for row in range(40):
hue = (row / 40 + hue_offset) % 1.0
color = hsv_to_rgb(hue, 1.0, 0.1)
set_pixel_no_clear(0, row, color) # 左边框
set_pixel_no_clear(31, row, color) # 右边框
```
hue 是色相,0-1 之间循环。边框每颗 LED 的颜色根据位置偏移一点,整体看过去就像彩虹在流动。
---
## 六、作品亮点
### 6.1 创新点
**1. AI 与硬件深度融合**
把 MCP 协议应用到 LED 显示控制,AI 不只是"回答问题",而是能真正控制硬件。这个思路我觉得挺有意思的,后面扩展空间也大。
**2. AI 图片生成 + LED 显示闭环**
从用户输入到 AI 绘图,再到 LED 显示,整个流程打通。不是"展示预生成图片",而是"实时生成、实时显示"。
**3. 艺术化视觉呈现**
彩虹渐变、动态边框、文字移位...不只是显示内容,更是视觉艺术。我媳妇说,放在客厅当装饰品都行。
### 6.2 技术难点突破
作为一个踩坑无数的老司机,这几个问题让我印象深刻:
**问题1:树莓派5兼容性问题**
树莓派5出来的时候,很多库还没更新。用传统的 `neopixel` 库控制 LED,根本不工作。后来发现树莓派5要用 PIO 模式,换了 `raspberry-pi5-neopixel-write` 库才搞定。
**问题2:多板坐标映射**
5 块 LED 板,每块蛇形扫描,坐标计算很容易出错。我在调试时写了个测试程序,一颗一颗 LED 地验证,才把公式调对。
**问题3:段错误**
这是最大的坑。最初我每个显示任务开一个新线程,结果服务器动不动就崩溃。后来用 `dmesg` 看日志,全是"Segmentation Fault"。查了很久才发现是 `neopixel_write` 非线程安全。最终方案是单工作线程 + 任务队列,所有 LED 操作都在一个线程里执行。
**问题4:字体渲染**
汉字显示需要合适的字体。默认字体太小,显示不清楚。后来找到了"阿里巴巴普惠体",大小和效果都不错。
### 6.3 实用价值
这项目不只是"玩一玩",真的有实用价值:
**商业应用**
- 吸引眼球的广告展示
- 低成本、易部署
- 可定制化内容
**情感表达**
- 表白、求婚现场
- 节日祝福
- 生日惊喜
**教育培训**
- AI 与物联网结合案例
- MCP 协议教学
- 嵌入式开发参考
**开源参考**
- 完整的代码和文档
- 树莓派5控制 LED 的解决方案
- 多线程与队列的实践经验
---
## 七、参赛宣言
### 7.1 作品口号
**"让每一面墙都会说话,用 AI 点亮生活的浪漫"**
### 7.2 参赛感言
大家好,我是 HonestQiao,圈内人称"乔帮主"或"乔大妈"。
干了十几年嵌入式,见过太多"为了技术而技术"的项目。我一直觉得,技术的价值在于**解决实际问题、创造美好体验**。
这个项目的初衷很简单:让 LED 屏幕不只是个显示设备,而是能理解用户、生成内容、传递情感的"智能伙伴"。
做这个项目的过程中,我踩了很多坑,也学到了很多。最开心的是,终于做出了一个**我媳妇觉得有用的东西**(之前做的传感器实验,她表示毫无兴趣)。
开源多年,我深知分享的价值。这个项目完全开源,代码、文档、踩坑经验,全部分享出来。希望对大家有帮助,也希望能看到更多有趣的改进和扩展。
最后,感谢 DigiKey 举办这个比赛,给了我们展示的机会。也感谢小智 AI、MiniMax 等平台提供的优质服务。
**技术不只是冷冰冰的代码,它可以让生活更浪漫。**
---
## 八、团队介绍
### 8.1 团队信息
| 项目 | 内容 |
|-----|------|
| 团队名称 | 光年战队 |
| 参赛赛道 | AI 应用创意挑战赛 |
| 成员数量 | 1 人 |
### 8.2 成员分工
| 成员 | 角色 | 主要工作 |
|-----|------|---------|
| HonestQiao(乔帮主) | 项目负责人 | 硬件选型、软件架构、代码实现、文档撰写 |
### 8.3 关于我(HonestQiao)
- 资深嵌入式开发工程师(十几年经验)
- 极客,热爱开源
- 湖北人,乐于助人
- 圈内人称"乔帮主"、"乔大妈"
- GitHub: https://github.com/HonestQiao
### 8.4 联系方式
| 渠道 | 信息 |
|-----|------|
| GitHub | https://github.com/HonestQiao/LED-Art-Wall |
| 邮箱 | honestqiao@gmail.com |
---
---
## 九、作品照片和视频
### 项目概览
!(https://www.eefocus.com/forum/data/attachment/forum/202602/01/001133fj6mpboze0i31ao7.jpg)
### AI图片显示效果
!(https://www.eefocus.com/forum/data/attachment/forum/202602/01/001141wq3mhm3nqc3l4k77.jpg)
!(https://www.eefocus.com/forum/data/attachment/forum/202602/01/001147bhsaxo6t4uzxpgxi.jpg)
!(https://www.eefocus.com/forum/data/attachment/forum/202602/01/001149xbkf5m76d9nkn9kn.jpg)
!(https://www.eefocus.com/forum/data/attachment/forum/202602/01/001151iul9t7t7ffaltkfq.jpg)
### 演示视频
((https://www.bilibili.com/video/BV15F6nBLEjK/))
---
## 十、源代码说明
### 11.1 开源地址
**GitHub 仓库:** https://github.com/HonestQiao/LED-Art-Wall
### 11.2 主要文件
| 文件 | 功能 | 行数 |
|-----|------|-----|
| led_image_mcp_server.py | MCP 服务端(图片生成) | 700+ |
| led_image_display.py | 图片显示模块 | 400+ |
| config.py | 配置文件 | 50+ |
### 11.3 依赖安装
```bash
# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate# Linux/Mac
# .venv\Scripts\activate# Windows
# 安装依赖
pip install mcp
pip install adafruit-circuitpython-led-animation
pip install adafruit-blinka
pip install adafruit-circuitpython-raspberry-pi5-neopixel-write
pip install Pillow
pip install uvicorn
```
### 11.4 运行方式
```bash
# 启动 MCP 服务(图片生成)
python led_image_mcp_server.py
```
---
## 十二、参考资料
1. [小智 AI 官网](https://www.xiaozhi.ai/)
2. (https://modelcontextprotocol.io/)
3. (https://www.adafruit.com/product/1138)
4. [树莓派 5 GPIO 文档](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html)
5. (https://github.com/adafruit/Adafruit_CircuitPython_LED_Animation)
---
## 十三、常见问题解答(FAQ)
**Q1: 树莓派5为什么不能用传统方式控制LED?**
A1: 树莓派5 使用 PIO(可编程输入输出)而不是传统 PWM。底层硬件有变化,很多老库不兼容。解决方案是使用 `raspberry-pi5-neopixel-write` 库。
**Q2: 如何避免段错误?**
A2: `neopixel_write` 函数非线程安全。我的方案是:单工作线程 + 任务队列,所有 LED 操作都在一个线程里执行。
**Q3: 图片生成需要多长时间?**
A3: MiniMax API 通常需要 3-5 秒生成一张图片。受网络和 API 负载影响。
**Q4: LED 亮度不够怎么办?**
A4: 检查电源功率。1280 颗 LED 全亮需要较大电流,建议使用 5V 10A 或更高功率的电源。
**Q5: 汉字显示不清楚怎么办?**
A5: 尝试更换字体。我使用的是"阿里巴巴普惠体",效果不错。字体大小也需要根据 LED 分辨率调整。
**Q6: 如何扩展更多功能?**
A6: MCP 协议扩展很方便。按照格式定义新工具,在 `call_tool` 函数中添加处理逻辑即可。
---
## 十四、给后来者的建议
作为一个踩坑无数的过来人,给大家几点建议:
**1. 先跑通单块**
别一开始就接 5 块 LED 板。先搞定一块,调通坐标映射、显示效果,再扩展。步子大了容易扯着蛋。
**2. 善用现成库**
Adafruit 的 LED 动画库很好用,不用自己造轮子。省下的时间喝杯奶茶不香吗?
**3. 坐标计算要细心**
蛇形布局很容易算错。我的经验是:写测试程序,一颗一颗 LED 验证,别靠猜。
**4. 避免段错误**
`neopixel_write` 非线程安全。记住:**所有 LED 操作必须在同一个线程中执行**。这是血的教训。
---
## 十五、写在最后
做这个项目的一个月,虽然累,但很快乐。
每一次调通一个新功能,每一次看到屏幕显示出漂亮的效果,都有一种特别的成就感。
更重要的是,做了一个**媳妇觉得有用的项目**,这比啥都强。
开源多年,我始终相信:**分享是快乐的源泉**。
希望这个项目对你有帮助。如果你有想法、建议、改进,欢迎提 Issue、提 PR、或者给我发邮件聊聊天。
**技术的意义,在于创造美好。**
页:
[1]