HonestQiaoQiao 发表于 2026-2-1 22:17:05

《2025 DigiKey AI应用创意挑战赛》AI LED 艺术墙

## 一、作品介绍

### 1.1 这玩意儿是啥?

大家好,我是 HonestQiao,一个干了十几年的嵌入式开发工程师。

说实话,这个项目的诞生特别简单——有一天我媳妇跟我说:"你天天鼓捣那些 LED 灯,能不能弄个有意思的东西?"

我一想,对哦!与其整那些花里胡哨的传感器demo,不如整个活儿——**让 LED 屏幕会说话、会思考、能互动**!

于是就有了这个 **AI LED 艺术墙**:
![配图0:AI LED艺术墙](https://www.eefocus.com/forum/forum.php?mod=image&aid=2233629&size=300x300&key=2357ce3e67eac7b9&nocache=yes&type=fixnone)

简单来说,就是:

- 你跟它说话,它能听懂
- 它能自己画图(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]
查看完整版本: 《2025 DigiKey AI应用创意挑战赛》AI LED 艺术墙