已跑通 2026-09-18 — 2026-09-20
灯带 + 2.0 寸屏:给桌面做一块状态面板
WS2812 灯带配 ST7789 小屏,用巴法云当 MQTT 中转,接进米家,小爱同学一句话就能换灯效。
- 开始
- 2026-09-18
- 结束
- 2026-09-20
- 耗时
- 约 8 小时
- 花费
- ¥60
技术栈 ArduinoWS2812ST7789巴法云 MQTT
背景
显示器下面一直空着,想放点”有用又好看”的东西:一条灯带作氛围光,再配一块小屏显示当前状态。
硬性要求只有两个:不买新网关、能用小爱同学控。
方案
- 主控:手里的 ESP32(一块板同时驱动灯带和屏)
- 灯带:WS2812B,单线控制,一根 IO 就够
- 屏:2.0 寸 ST7789,SPI
- 云端:巴法云当 MQTT 中转——它原生支持被米家接入,等于白嫖一个网关
链路:
小爱同学 → 米家 → 巴法云(MQTT) → ESP32 → 灯带 + 屏
过程
灯效做了 12 种:常亮、呼吸、彩虹流动、音乐随动、指针钟……
// 收 MQTT 消息换灯效
void onMqttMessage(String topic, String payload) {
int mode = payload.toInt();
if (mode >= 0 && mode < MODE_COUNT) currentMode = mode;
FastLED.show();
}
关键是灯效切换要无感:不能在动画循环里阻塞,所有效果都写成状态机,每帧推进一小步。
踩坑
| 现象 | 原因 | 解法 |
|---|---|---|
| 灯带闪一下就卡住 | 动画里用了 delay(),把 MQTT loop 堵死了 | 改成非阻塞状态机,loop() 里只推进帧 |
| 屏和灯带抢 SPI 总线 | 没做互斥 | 屏刷新放低优先级,灯带用独立 IO 不占 SPI |
| 米家收不到状态 | 只做了下行没做上行 | 状态变化后主动 publish 一次,米家才会显示”在线” |
| 断电重启后灯效丢失 | 状态只在内存里 | 写 NVS 保存最后一次模式 |
结果
用好几个月了,稳定。
- 小爱同学说”打开桌面灯”就亮,切换灯效也能语音
- 屏上显示时钟、天气、在线状态
- 成本约 60 元(灯带 + 屏)
- 全部代码在一个
.ino拆成多文件,接线图写在 README 里
复盘
- 智能家居项目里**“云平台选谁”比代码重要**:巴法云能被米家直接认,省掉了自己搭网关、写对接的全部工作
- 灯效这类东西,非阻塞是硬要求,一开始用了
delay()后面全要返工 - 屏和灯带共用一块板很划算,但总线要提前规划好
更新日志
- 接进米家,小爱同学语音控制可用。
- 灯带跑通,能按消息切换 12 种灯效。