跳到正文
CHUN折腾
全部项目
已跑通 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() 后面全要返工
  • 屏和灯带共用一块板很划算,但总线要提前规划好

更新日志

  1. 接进米家,小爱同学语音控制可用。
  2. 灯带跑通,能按消息切换 12 种灯效。

标签相近的项目

S3_Station:一块 ESP32-S3 做的桌面小站

已跑通

频谱屏 + 灯控 + 人体感应 + DNS 广告拦截,两块不同的 S3 板子共用一套固件,靠一个头文件切引脚。

  • #ESP32
  • #嵌入式
  • #桌面设备
  • #LVGL
ESP-IDF 5.5 / LVGL 9