在为 Voron 2.4(或其它基于 Klipper 的 3D 打印机)配置机箱照明时,很多人习惯直接将 LED 接在主板(如必趣章鱼主板 BTT Octopus)的 5V 或 GPIO 上。但如果灯珠数量较多(例如围机箱一圈 72 颗),主板的 5V LDO 供电和单片机算力就会面临不小的压力。

最优雅的解法是:使用独立的 ESP32 运行 WLED 固件,通过 Wi-Fi 局域网接入 Moonraker,实现与 3D 打印生命周期的自动化灯效联动。

💡 实际灯效展示

🔴 加热状态 (Heating)🔵 待机状态 (Standby)⚪ 打印状态 (Printing)
Voron 2.4 WLED 加热状态红光呼吸灯效Voron 2.4 WLED 待机状态冰蓝常亮灯效Voron 2.4 WLED 打印状态高亮纯白照明灯效

本文记录了从系统架构、固件升级、WLED 预设配置、Klipper 宏注入,到踩过的所有"坑"与排查思路。


🛠️ 一、硬件架构与优势

组件型号
主控板必趣章鱼主板(BTT Octopus V1.1,运行 Klipper)
灯光控制器ESP32(运行 WLED v0.16.1,静态 IP:192.168.5.202)
灯带规格WS2812B 幻彩灯带(72 颗灯珠)
上位机树莓派(Fluidd / Mainsail + Moonraker)

为什么选择 ESP32 + WLED 方案?

  1. 零占用主板资源:不占用必趣章鱼主板任何有限的 GPIO 和板载 5V/DCDC 电源。
  2. 安全隔离:全亮 72 颗 RGB 全白灯珠最大电流可达 4.3A,由独立降压模块供电,避免必趣章鱼主板因电流过载拉低电压崩溃。
  3. 灯效极度丰富:WLED 内置上百种酷炫动态效果,ESP32 独立处理 PWM 驱动,不消耗 Klipper MCU 的任何性能。
  4. OTA 无线升级:WLED 支持浏览器在线 OTA 固件升级,无需拆机。
  5. Presets 持久化:所有灯效参数(颜色、速度、亮度)保存在 ESP32 Flash 中,即使断电重启也完整保留。

🔌 二、ESP32 接线与 WLED 固件烧录

1. 硬件接线

WS2812B 灯带每颗灯珠最大耗电约 60mA(RGB 全白全亮),72 颗合计最大 4.3A,必须使用独立 5V 电源供电,绝对不能从 ESP32 的板载 5V 引脚取电。

接线拓扑图

┌─────────────────────────────────────────────────────────┐
│                   独立 5V 降压模块(≥5A)                  │
│   输入:打印机 24V  →  输出:5V                            │
└────────┬────────────────────┬────────────────────────────┘
         │ 5V                 │ GND
         │                   │
         ▼                   ▼
┌─────────────────┐   ┌──────────────┐
│  WS2812B 灯带   │   │  公共地 (GND) │ ← 三者必须共地!
│  VCC ← 5V      │   └──────┬───────┘
│  GND ← GND     │          │
│  DIN ←─────────┼──── 330Ω 电阻 ←── ESP32 GPIO2
└─────────────────┘          │
                             │ GND
                      ┌──────┴───────┐
                      │    ESP32     │
                      │  GPIO2 → DIN│ (数据信号)
                      │  GND  → GND │ (共地)
                      │  5V/USB 供电 │ (ESP32 单独取电)
                      └─────────────┘

ESP32 与 WS2812B 灯带接线示意图

接线要点说明
三者必须共地独立电源 GND、ESP32 GND、灯带 GND 必须接在一起,否则数据信号无法传输
数据线串 330Ω 电阻在 ESP32 GPIO 引脚与灯带 DIN 之间串联一个 330Ω 电阻,防止高频信号反射损坏 ESP32 输出引脚
灯带头部并联滤波电容在灯带 VCC 与 GND 之间并联一个 1000µF / 6.3V 电解电容,吸收电流突变防止第一颗灯珠损坏
不要用 ESP32 板载 5V 给灯带供电ESP32 USB 5V 引脚最大输出约 500mA,点亮多颗灯珠会直接烧毁 USB 电路或造成 ESP32 重启
GPIO 引脚推荐 GPIO2WLED 默认数据引脚为 GPIO2,也可选 GPIO16、GPIO4,避免使用 GPIO0(烧录模式引脚)

⚠️ 安全提示:WS2812B 灯带对 5V 极性敏感,接线前务必用万用表确认电源极性,反接会瞬间烧毁灯珠。


2. WLED 固件烧录

方法 A:网页一键烧录(强烈推荐,无需安装任何软件)

  1. 用 USB 数据线(注意:必须是有数据传输功能的线,非仅充电线)将 ESP32 接入电脑
  2. 用 Chrome 或 Edge 浏览器(必须支持 WebSerial)打开:
    👉 https://install.wled.me
  3. 点击 “Install”,选择对应 ESP32 的串口,按提示完成烧录(约 1~2 分钟)
  4. 烧录完成后,ESP32 会自动重启并广播一个名为 WLED-AP 的 Wi-Fi 热点

方法 B:手动下载 .bin 烧录

# 安装 esptool
pip install esptool

# 烧录(替换 COMx 为实际串口号,Windows 用 COM3 等,Linux 用 /dev/ttyUSB0)
esptool.py --chip esp32 --port COMx --baud 921600 write_flash 0x0 WLED_0.16.1_ESP32.bin

3. WLED 初始化配置

烧录完成后,用手机或电脑连接 ESP32 广播的 WLED-AP 热点(密码:wled1234),浏览器访问 4.3.2.1 进入配置页面。

第一步:配置 Wi-Fi(接入局域网)

Config → WiFi Setup
  → Network Name (SSID):填写家庭 Wi-Fi 名称
  → Password:填写 Wi-Fi 密码
  → Static IP:192.168.5.202      ← 填写固定 IP(与 moonraker.conf 一致)
  → Gateway:192.168.5.1          ← 路由器地址
  → Subnet mask:255.255.255.0
  → Save → ESP32 重启,连接成功后访问 http://192.168.5.202

第二步:配置 LED 参数

Config → LED Preferences
  → LED outputs → Type:WS281x
  → Color Order:GRB               ← WS2812B 标准色序
  → Length:72                     ← 灯珠数量
  → Data GPIO:2                   ← 数据引脚(GPIO2)
  → Save

第三步:关闭 AP 热点(可选,安全建议)

Config → WiFi Setup
  → Disable AP(勾选)→ Save

完成后,ESP32 即可通过 http://192.168.5.202 局域网访问,Moonraker 也能正常连接控制灯光。


⚙️ 三、配置文件编写

1. 修改 moonraker.conf(关键通信桥梁)

在 moonraker.conf 末尾加入 WLED 节点:

[wled caselight]
type: http
address: 192.168.5.202
chain_count: 72
initial_preset: 1

注意:修改完 moonraker.conf 后,必须在 Web 界面选择"Restart Moonraker",单独重启 Klipper 是不会加载新网络组件的。


2. 在 printer.cfg 中添加基础控制宏与生命周期联动

完整的 printer.cfg 灯光配置分为三层:

第一层:基础驱动宏(底层接口)

[gcode_macro WLED_ON]
description: 点亮 ESP32 机箱灯(不切预设)
gcode:
  {action_call_remote_method("set_wled_state",
                             strip="caselight",
                             state=True)}

[gcode_macro WLED_OFF]
description: 关闭 ESP32 机箱灯
gcode:
  {action_call_remote_method("set_wled_state",
                             strip="caselight",
                             state=False)}

[gcode_macro WLED_PRESET]
description: 切换 WLED 预设 (用法: WLED_PRESET PRESET=1)
gcode:
  {% set preset = params.PRESET|default(1)|int %}
  {action_call_remote_method("set_wled_state",
                             strip="caselight",
                             state=True,
                             preset=preset)}

第二层:状态快捷宏(语义化接口)

[gcode_macro LIGHT_NORMAL]
description: 高亮白光 - 正式打印中(工作照明/摄像头监控)
gcode: WLED_PRESET PRESET=1

[gcode_macro LIGHT_HEATING]
description: 红色呼吸灯 - 加热中,请勿触碰!
gcode: WLED_PRESET PRESET=2

[gcode_macro LIGHT_COMPLETED]
description: 绿色闪烁 - 打印完成,请取件!
gcode: WLED_PRESET PRESET=3

[gcode_macro LIGHT_STANDBY]
description: 冰蓝微光 - 待机/暂停/取消(低功耗夜间不刺眼)
gcode: WLED_PRESET PRESET=4

[gcode_macro LIGHT_HOMING]
description: 扫光跑马灯 - 归零与调平中(G28/QGL)
gcode: WLED_PRESET PRESET=5

[gcode_macro LIGHT_LOADING]
description: 橙色跑马灯 - 换料/进料/吐丝准备中
gcode: WLED_PRESET PRESET=7

第三层:延迟自动化任务

# 打印完成绿灯 5 分钟后自动切换为冰蓝待机灯
# initial_duration: 0 表示不在开机时自动触发,仅由 PRINT_END 手动激活
[delayed_gcode LIGHT_COMPLETED_STANDBY]
initial_duration: 0
gcode:
    LIGHT_STANDBY   # 打印完成提示结束,自动切换冰蓝待机微光

🎨 三、WLED 端 7 大核心预设配置表

打开 WLED Web 界面(http://192.168.5.202),调好颜色与特效后,在 Presets → + Create Preset 中保存,Save to ID 必须填写对应数字:

ID预设名称视觉效果特效名称速度亮度对应状态效果演示
11-Normal暖白/正白光 ≈4500KSolid(常亮)—255 (100%)正式打印中
22-Heating鲜红渐变呼吸 620nmBreathe(呼吸)128 (中速)128 (50%)加热升温中
33-Complete鲜绿闪烁提示 520nmBlink(闪烁)128 (中速)128 (50%)打印完成
44-Standby冰蓝冷光 ≈7500KSolid(常亮)—35 (微亮)待机/暂停
55-Scanner霹雳游侠扫光Knight Rider150 (稍快)200归零/调平
66-Chase彩虹流水追光Chase Rainbow128 (中速)200预留/自定义
77-Loading警示橙科技感加载Android128 (中速)200换料/进料

精确设置亮度的技巧:WLED 界面顶部只有拖动条,无法精确输入数值。推荐先用浏览器访问 http://192.168.5.202/win?A=35 精确设定亮度后,再回到 Presets 页面保存。

WLED 预设配置界面示意图


🔄 四、打印全生命周期灯光时序

打印全生命周期灯光时序流程图

这是本文的核心章节。将上述宏嵌入各生命周期钩子后,机器的完整灯光状态机如下:

完整时序流程图

┌──────────────────────────────────────────────────────────────────┐
│                    打印机全生命周期灯光时序                          │
└──────────────────────────────────────────────────────────────────┘

【开机 / 闲置超时 30 分钟】
         │
         ▼
  🔵 冰蓝待机微光  ←─────────────────────────────────────────────┐
  LIGHT_STANDBY                                                   │
  (Preset 4 · 亮度 35 · 常亮)                                     │
         │                                                        │
         │  切片软件发起 PRINT_START                               │
         ▼                                                        │
━━━━━━━━━━━━━━━━━━━━━ 阶段 A:预热升温 ━━━━━━━━━━━━━━━━━━━━━━━━━━ │
         │                                                        │
         ▼                                                        │
  🔴 红色呼吸灯                                                    │
  LIGHT_HEATING                                                   │
  (Preset 2 · 亮度 128 · 呼吸动效)                                 │
  ⚠️  高温警示,请勿触碰热床和喷嘴!                                 │
  M140 热床加热 → M190 等待热床到温                                 │
         │                                                        │
         │  调用 G32(含 G28 归零 + QGL 四龙门调平)                │
         ▼                                                        │
━━━━━━━━━━━━━━━━━━━━━ 阶段 B:归零调平 ━━━━━━━━━━━━━━━━━━━━━━━━━━ │
         │                                                        │
         ▼                                                        │
  🟣 霹雳游侠扫光跑马灯                                             │
  LIGHT_HOMING                                                    │
  (Preset 5 · 亮度 200 · Knight Rider)                            │
  🎯 机械高精度校准中,充满仪式感!                                   │
  G28 归零 → QUAD_GANTRY_LEVEL → G28 二次归零                      │
         │                                                        │
         │  G32 完成,开始二次升温到打印温度                          │
         ▼                                                        │
━━━━━━━━━━━━━━━━━━━━━ 阶段 C:二次升温 ━━━━━━━━━━━━━━━━━━━━━━━━━━ │
         │                                                        │
         ▼                                                        │
  🔴 红色呼吸灯(重新触发)                                          │
  LIGHT_HEATING                                                   │
  (Preset 2 · 亮度 128 · 呼吸动效)                                 │
  喷嘴移动至角落 → M109 加热到最终打印温度并等待                       │
         │                                                        │
         │  温度到达,开始 Purge Line 划线                           │
         ▼                                                        │
━━━━━━━━━━━━━━━━━━━━━ 阶段 D:划线与打印 ━━━━━━━━━━━━━━━━━━━━━━━━━│
         │                                                        │
         ▼                                                        │
  ⚪ 高亮白光(全亮)                                               │
  LIGHT_NORMAL                                                    │
  (Preset 1 · 亮度 255 · 常亮)                                     │
  💡 白光全亮,方便摄像头监控第一层铺丝!                              │
  划线清理 → 正式开始打印(持续整个打印过程)                           │
         │                                                        │
         │  PRINT_END 触发(退丝、关加热、归位)                      │
         ▼                                                        │
━━━━━━━━━━━━━━━━━━━━━ 阶段 E:打印完成 ━━━━━━━━━━━━━━━━━━━━━━━━━━ │
         │                                                        │
         ▼                                                        │
  🟢 绿色闪烁提示                                                   │
  LIGHT_COMPLETED                                                 │
  (Preset 3 · 亮度 128 · Blink 闪烁)                              │
  ✅ 远距离一眼确认任务成功!                                         │
         │                                                        │
         │  等待 5 分钟(delayed_gcode 自动触发)                    │
         ▼                                                        │
  🔵 自动切换回冰蓝待机微光 ─────────────────────────────────────────┘
  LIGHT_STANDBY(5分钟后自动)


━━━━━━━━━━━━━━━━━━━━━ 异常中断分支 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  【M600 换料 / 断料检测】
         │
         ▼
  🟠 橙色跑马灯(警示!)
  LIGHT_LOADING
  (Preset 7 · 亮度 200 · Android 跑马灯)
  ⚡ 需要用户介入换料!
         │  换料完成,执行 RESUME
         ▼
  ⚪ 高亮白光(自动恢复)
  LIGHT_NORMAL → 继续打印

  【PAUSE 暂停打印】
         │
         ▼
  🔵 冰蓝待机微光
  LIGHT_STANDBY(提示暂停中,低功耗)
         │  执行 RESUME
         ▼
  ⚪ 高亮白光 → 继续打印

  【CANCEL_PRINT 取消打印】
         │
         ▼
  🔵 冰蓝待机微光
  LIGHT_STANDBY(提示任务已终止)

完整触发映射表

生命周期事件触发方式灯光效果Preset
开机 / 闲置 30 分钟超时[idle_timeout] gcode🔵 冰蓝待机微光4
PRINT_START 预热阶段M140/M190 前🔴 红色呼吸灯2
G32 归零与调平G32 宏首行🟣 霹雳游侠扫光5
PRINT_START 二次升温M109 最终打印温度前🔴 红色呼吸灯2
PRINT_START 划线至开始打印Purge Line 前⚪ 高亮白光1
PRINT_END 打印完成退丝关热器后🟢 绿色闪烁3
打印完成 5 分钟后delayed_gcode 自动🔵 冰蓝待机微光4
M600 换料 / 断料M600 宏首行🟠 橙色跑马灯7
PAUSE 暂停PAUSE 宏末尾🔵 冰蓝待机微光4
RESUME 恢复RESUME 宏末尾⚪ 高亮白光1
CANCEL_PRINT 取消CANCEL_PRINT 宏末尾🔵 冰蓝待机微光4

关键宏的完整代码(嵌入后)

以下是生命周期宏嵌入灯光调用后的核心片段:

# ——— [idle_timeout]:闲置超时自动待机 ———
[idle_timeout]
timeout: 1800
gcode:
    LIGHT_STANDBY                   # WLED:超时自动切换冰蓝待机微光
    TURN_OFF_HEATERS
    M84

# ——— [gcode_macro G32]:归零调平 ———
[gcode_macro G32]
gcode:
    LIGHT_HOMING                    # WLED:归零扫光跑马灯
    STATUS_HOMING
    G90
    BED_MESH_CLEAR
    G28
    QUAD_GANTRY_LEVEL
    G28
    G0 Z10 F3000
    G0 X150 Y150 F6000

# ——— [gcode_macro PRINT_START]:关键节点 ———
[gcode_macro PRINT_START]
gcode:
    # 阶段 A:预热
    LIGHT_HEATING                    # WLED:红色呼吸灯
    M140 S{BED}
    M190 S{BED}

    # 阶段 B:归零调平(G32 内部会切换 LIGHT_HOMING)
    G32

    # 阶段 C:二次升温
    LIGHT_HEATING                    # WLED:重新触发红色呼吸灯
    G1 X5 Y8 Z10 F6000
    M109 S{HOTEND}

    # 阶段 D:划线 + 打印
    LIGHT_NORMAL                     # WLED:切换高亮白光
    # ... 划线 G-code ...

# ——— [gcode_macro PRINT_END]:打印完成 ———
[gcode_macro PRINT_END]
gcode:
    # ... 退丝、归位、关加热器 ...
    LIGHT_COMPLETED                  # WLED:绿色完成闪烁
    UPDATE_DELAYED_GCODE ID=LIGHT_COMPLETED_STANDBY DURATION=300  # 5分钟后自动切待机
    M117 Print Finished.

# ——— [gcode_macro M600]:换料警示 ———
[gcode_macro M600]
gcode:
    LIGHT_LOADING                    # WLED:橙色进料警示灯
    PAUSE

# ——— [gcode_macro PAUSE] 末尾 ———
    LIGHT_STANDBY                    # WLED:冰蓝待机微光

# ——— [gcode_macro RESUME] 末尾 ———
    RESUME_BASE {rawparams}
    LIGHT_NORMAL                     # WLED:恢复正常白光

# ——— [gcode_macro CANCEL_PRINT] 末尾 ———
    CANCEL_PRINT_BASE
    LIGHT_STANDBY                    # WLED:冰蓝待机微光

⚠️ 五、血泪避坑指南(5 个典型踩坑记录)

🚨 坑 1:在控制台直接输入 Jinja2 模板脚本报错

  • 现象:在 Mainsail/Fluidd 控制台直接敲入 {action_call_remote_method("set_wled_state", ...)},提示:
    Unknown command: "{ACTION_CALL_REMOTE_METHOD...
  • 原因:Klipper 控制台只接受原生 G-code 指令,不能直接解析 {...} 的 Jinja2 代码。
  • 解法:必须在 printer.cfg 中将代码封装成 [gcode_macro],再在控制台执行宏名。

🚨 坑 2:[wled] 配置写在了 printer.cfg 里

  • 现象:把 [wled caselight] 写在 printer.cfg,系统毫无反应,Klipper 也不报错。
  • 原因:[wled] 是 Moonraker 的组件,必须写在 moonraker.conf;[gcode_macro] 才属于 printer.cfg。
  • 规律记忆:
    moonraker.conf → 网络服务 / 组件(wled, mqtt, power...)
    printer.cfg    → 硬件 / G-code 宏(mcu, stepper, gcode_macro...)
    

🚨 坑 3:混淆 [neopixel] 与 [wled] 的参数

  • 现象:在 moonraker.conf 的 [wled] 下写入了 initial_red: 0.5,配置无效。
  • 原因:initial_red/green/blue 是 Klipper 原生 [neopixel] 节点(直接控制板载 GPIO)的参数;Moonraker 的 [wled] 节点通过 HTTP 与 ESP32 通信,开机颜色应用 initial_preset: 编号 加载 WLED 预设。

🚨 坑 4:改了 moonraker.conf 只重启 Klipper

  • 现象:加上 [wled] 后重启了 Klipper,Fluidd 界面始终没有灯光控制卡片。
  • 原因:moonraker.conf 由 Moonraker 进程读取,修改后必须点 “Restart Moonraker”,单独 Firmware Restart 无效。

🚨 坑 5:使用 Beta 版 WLED 固件导致 Wi-Fi 不稳定

  • 现象:使用 v0.14.0-b3 固件,偶发 Wi-Fi 掉线或 Klipper 报 Timeout。
  • 原因:带 b 字样的为 Beta 测试版,存在内存泄漏或 Wi-Fi 心跳 Bug。
  • 解法:去 WLED GitHub Releases 下载最新稳定版(如 v0.16.1),在 WLED 网页的 Security & Update 中一键 OTA 升级,原有 Presets 配置不会丢失。

📝 六、总结

通过将 ESP32 WLED 无线接入 Moonraker,整套方案具备以下完整能力:

能力实现方式
独立供电,零主板负担ESP32 + 独立 5V 降压模块
7 种语义化灯效预设WLED Presets 持久化存储
打印全生命周期自动联动Klipper gcode_macro 钩子注入
闲置超时自动待机[idle_timeout] gcode 触发
完成绿灯 5 分钟自动熄转[delayed_gcode] 定时切换
换料橙灯警示M600 宏首行触发
Fluidd 面板一键手动切换带 description 的 LIGHT_* 宏

最终实现的灯光状态机:

开机/闲置 → 🔵冰蓝待机
    ↓ 开始打印
🔴红色呼吸(预热)→ 🟣扫光跑马(归零调平)→ 🔴红色呼吸(二次升温)
    ↓ 温度到达
⚪高亮白光(划线+正式打印)
    ↓ 打印完成
🟢绿色闪烁 → [5分钟后] → 🔵冰蓝待机

异常分支:
换料 M600 → 🟠橙色跑马 → RESUME → ⚪白光
暂停 PAUSE → 🔵冰蓝待机 → RESUME → ⚪白光
取消 CANCEL → 🔵冰蓝待机

如果你也在折腾 Voron 或任何 Klipper 机器的灯效联动,这套解法从架构到细节都经过实际调试验证,拿来即用!

本文引用与技术讨论规范

作者:陈亚明(Tony Chen)|微型电磁执行器数字化研发专家

原始出处:ansv.net

本文链接:https://ansv.net/knowledge-base/voron-24-engineering-tuning/06-wled-klipper-guide/

版权声明:除另有说明外,本文原创文字、公式与原创图示采用 CC BY-NC-ND 4.0(署名—非商业性使用—禁止演绎)协议授权。欢迎在署名、注明原文链接且仅作非商业用途的前提下转载;不得改编、删改或拆分原文内容。

除非另有明确说明,文中涉及的第三方商标、专利附图、产品图片及其他第三方素材,均不在本 CC 协议授权范围内,相关权利归其各自权利人所有。

如有技术交流,欢迎联系:hi@ansv.net。

💬 探讨与反馈

💡 快速交流与账号登录贴士
🔹 免填/趣味随机昵称:系统已为您随机分配趣味昵称(如「摸鱼的卡皮巴拉」「喝冰美式的工程喵」),可随时点击 快速换一个,支持免注册畅聊。
🔹 第三方账号一键登录(密码绝不泄露):支持 GitHub、微博、Twitter、Facebook、QQ 官方直接授权登录。点击输入区右上角登录图标即可一键登录,采用标准 OAuth 2.0 官方鉴权机制,密码全程由官方平台验证,本站绝不经手且无法获取您的密码,安全可靠。
🔹 QQ 号免密同步头像:直接在邮箱栏输入 QQ 号 或 QQ 邮箱(如 123456@qq.com),无需登录即可秒显您的专属 QQ 头像。