使用 ESP32-C3 SuperMini 改造一个淘宝红绿灯玩具,让 Claude Code 的状态通过红、黄、绿三颗灯显示:
| Claude Code 状态 | 灯光效果 |
|---|---|
| 正在工作 | 绿灯慢闪 |
| 等待用户确认、授权或选择 | 红灯快闪 |
| 当前空闲 | 黄灯常亮 |
| 会话结束 | 全部熄灭 |
- ESP32-C3 SuperMini 开发板
- 淘宝红绿灯主体
- 220 欧电阻 3 个
- 细导线若干
- 焊接工具:电烙铁、焊锡丝、助焊松香、尖嘴钳、电风扇或其他排烟设备
不要同时安装纽扣电池并接入 ESP32 USB 供电。改造后由 ESP32 的 3V3 供电。
红绿灯电路板上的灯位定义如下:
| 灯位 | 颜色 | ESP32-C3 SuperMini 引脚 | 串联电阻 |
|---|---|---|---|
| 公共阳极 | 三灯公共正极 | 3V3 |
不需要 |
L1 负极 |
绿灯 | GPIO4 |
220Ω |
L2 负极 |
黄灯 | GPIO3 |
220Ω |
L3 负极 |
红灯 | GPIO2 |
220Ω |
接线关系:
ESP32 3V3 -> 红绿灯公共阳极
绿灯 L1 负极 -> 220Ω -> ESP32 GPIO4
黄灯 L2 负极 -> 220Ω -> ESP32 GPIO3
红灯 L3 负极 -> 220Ω -> ESP32 GPIO2
固件使用共阳极控制方式:GPIO 输出 LOW 时点亮,输出 HIGH 时熄灭。
Arduino 程序位于:
arduino/traffic_light_test/traffic_light_test.ino
Arduino IDE 设置:
- Board:
ESP32C3 Dev Module - USB CDC On Boot:
Enabled - Port: 选择 ESP32 对应串口
- 波特率:
115200
烧录后,打开串口监视器,行结束符选择 Newline 或 Both NL & CR,可以发送以下命令测试:
| 串口命令 | 灯光效果 |
|---|---|
working |
绿灯慢闪 |
waiting |
红灯快闪 |
idle |
黄灯常亮 |
off |
全部熄灭 |
test |
红、黄、绿依次点亮 |
status |
输出当前状态 |
淘宝买来的红绿灯主体。
先烧录程序,在面包板上测试 ESP32 能否通过串口命令监听 Claude Code 状态,并正确控制红、黄、绿三颗灯。
准备电烙铁、焊锡丝、助焊松香、细导线、220 欧电阻、尖嘴钳,以及电风扇排烟。焊接烟雾有害,建议在通风环境下操作。
焊锡丝建议使用含锡量 >= 63% 的产品,比较容易上锡。
电路板上发光二极管负极焊点比较小,不方便直接焊接。可以用刀小心刮开一点绿油,露出下方铜箔,形成更大的焊接区域。
刮绿油前:
刮绿油后:
分别焊接公共阳极、L1 负极、L2 负极、L3 负极:
L1是绿灯。L2是黄灯。L3是红灯。L1、L2、L3负极出来的导线都需要串联220Ω电阻。
推荐每种灯使用对应颜色的导线,后续排查会更直观。图中 L1 绿灯用了红色线、L3 红灯用了绿色线,这是个人焊接失误
另外也可以考虑使用贴片电阻,但操作难度更高,这里使用的是普通直插电阻。
排针太长,为了能够将开发板贴合在红绿灯外壳背后,需要剪掉 ESP32-C3 SuperMini 的排针。
用电钻在红绿灯后壳开一个小孔,将导线穿过去,然后用绝缘胶带固定开发板。
开发板侧按以下方式焊接:
| ESP32-C3 SuperMini 引脚 | 连接 |
|---|---|
3V3 |
红绿灯公共阳极 |
GPIO4 |
L1 绿灯负极,串联 220Ω |
GPIO3 |
L2 黄灯负极,串联 220Ω |
GPIO2 |
L3 红灯负极,串联 220Ω |
缠上绝缘胶带,进一步固定开发板,避免焊点和外壳、其他导线短路。
使用数据线连接电脑和红绿灯,Claude Code 状态会自动反映到灯光上。
电脑端桥接脚本位于:
scripts/claude_traffic_light.py
它会自动查找 /dev/cu.usbmodem*,常驻持有 ESP32 串口,并接收 Claude Code Hooks 发送的状态。脚本只使用 Python 标准库,不需要安装第三方依赖。
手动测试:
python3 scripts/claude_traffic_light.py working
python3 scripts/claude_traffic_light.py waiting
python3 scripts/claude_traffic_light.py idle如果电脑连接了多个 /dev/cu.usbmodem* 设备,可以显式指定 ESP32 串口:
export CLAUDE_TRAFFIC_LIGHT_PORT=/dev/cu.usbmodem11301
python3 scripts/claude_traffic_light.py working安装 Claude Code Hooks:
python3 scripts/install_claude_hooks.py安装脚本会读取 claude-hooks.example.json,合并到 ~/.claude/settings.json,并在同目录生成备份:
~/.claude/settings.json.traffic-light-backup
Hook 与灯光的主要映射:
| Claude Code 事件 | 发送状态 | 灯光 |
|---|---|---|
UserPromptSubmit |
working |
绿灯慢闪 |
PermissionRequest |
waiting |
红灯快闪 |
PreToolUse(AskUserQuestion) |
waiting |
红灯快闪 |
Elicitation |
waiting |
红灯快闪 |
PostToolUse |
working |
绿灯慢闪 |
Stop |
idle |
黄灯常亮 |
SessionEnd |
off |
全部熄灭 |
运行桥接脚本或 Claude Code 时,应关闭 Arduino IDE 串口监视器,避免两个程序同时占用 ESP32 串口。
诊断日志位于:
/tmp/claude-traffic-light-<uid>.log
- 焊接前务必断开 USB,并取下原来的纽扣电池。
- 每颗灯的负极需要串联
220Ω电阻,不要让 GPIO 直接短接 LED。 - 焊接后建议用万用表蜂鸣档确认没有短路,再连接电脑。
- 如果灯不响应,先用 Arduino 串口监视器发送
test,确认固件和焊接都正常,再检查 Python 脚本和 Claude Hook。










