已跑通 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 干净 - 代价是编译慢、环境容易踩坑
功能先定四个,只做能一次做完的:
- 频谱可视化(接手机投过来的音频数据)
- 时钟 + 天气
- 人体感应:有人亮屏,无人降亮度
- 顺带把 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 是对的,但下次会先做”最小可跑界面”再堆功能,避免一开始就陷进布局
- 嵌入式项目里,环境问题比代码问题多。中文路径、驱动、串口权限,任何一个都能耗掉半天
更新日志
- 两块板子合并到一套固件,一行切换。
- 加人体感应联动:有人亮屏、无人降亮度。
- LVGL 界面跑起来,频谱 + 时钟 + 状态。