跳到正文
CHUN折腾
全部项目
已跑通 2026-10-03 — 2026-10-06

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

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

开始
2026-10-03
结束
2026-10-06
耗时
约 20 小时
花费
¥120
技术栈 ESP-IDF 5.5LVGL 9CESP32-S3

背景

桌面上一直缺一块”顺手看一眼”的屏:现在几点、今天天气、当前网速、房间里有没有人。 买现成的总觉得差点意思——要么只能显示固定内容,要么要连厂商云。

手里正好有几块 ESP32-S3 板子(一块带 2.0 寸 ST7789,一块带更大的屏),干脆自己写。

方案

技术栈选 ESP-IDF 5.5 + LVGL 9,而不是 Arduino:

  • LVGL 做界面比手绘坐标舒服太多(布局、动画、字体渲染都现成)
  • ESP-IDF 的组件管理和 idf.py 用起来比 Arduino IDE 干净
  • 代价是编译慢、环境容易踩坑

功能先定四个,只做能一次做完的:

  1. 频谱可视化(接手机投过来的音频数据)
  2. 时钟 + 天气
  3. 人体感应:有人亮屏,无人降亮度
  4. 顺带把 DNS 广告拦截塞进去(板子常开,做个局域网 DNS 很划算)

两块板子共用一套固件,靠 bsp_board.h 里的一个宏切换引脚定义——否则两份代码会慢慢分叉。

过程

// bsp_board.h
#define BOARD_V2  1   // 1 = 2.0 寸屏板,0 = 大屏板

编译:

idf.py set-target esp32s3
idf.py build
idf.py -p COM4 flash monitor

两块板子分别占用 COM4 / COM6,烧写完都能正常跑。

踩坑

现象原因解法
编译到一半报 objdump/kconfgen 编码错误项目路径里有中文,工具链按本地代码页处理路径把整个工程移到 D:\esp\ 这种纯英文路径下
LVGL 界面闪烁、刷新慢全程刷整屏,没有用脏区开双缓冲 + partial refresh,只刷变化区域
换板子后屏幕全黑引脚宏改了但没清构建缓存idf.py fullclean 再编译
频谱和网络任务抢 CPU音频处理放在主任务里拆到独立 task + 队列传数据

路径中文这一条值得单独记:ESP-IDF 在 Windows 上对非 ASCII 路径的支持一直不好, 报错信息还都指向”工具链损坏”,实际原因只是路径。挪到英文目录立刻就好。

结果

跑通了,两块板子都在桌上服役。

  • 构建产物约 1.2MB,启动 1 秒内出界面
  • 人体感应联动可用:人来亮屏,离开 60 秒降亮度
  • DNS 拦截挂在板子上,全屋设备统一生效
  • 成本:板子是用现有的,新的配件约 120 元

复盘

  • 共用固件这个决定是对的,两套代码维护成本会翻倍
  • 界面用 LVGL 是对的,但下次会先做”最小可跑界面”再堆功能,避免一开始就陷进布局
  • 嵌入式项目里,环境问题比代码问题多。中文路径、驱动、串口权限,任何一个都能耗掉半天

更新日志

  1. 两块板子合并到一套固件,一行切换。
  2. 加人体感应联动:有人亮屏、无人降亮度。
  3. LVGL 界面跑起来,频谱 + 时钟 + 状态。

标签相近的项目

灯带 + 2.0 寸屏:给桌面做一块状态面板

已跑通

WS2812 灯带配 ST7789 小屏,用巴法云当 MQTT 中转,接进米家,小爱同学一句话就能换灯效。

  • #ESP32
  • #智能家居
  • #灯效
  • #米家
Arduino / WS2812