最近把毛豆时钟升级成了双模式:保留经典的太空人天气时钟,新增了 AI Agent 实时物理监控看板。物理按键一键切换,WebSocket 毫秒级推送,ELF 级局部重绘零闪屏。下面完整分享一下。
🖼️ 最终的样子
默认外壳就是裸板美学——开发板和屏幕背靠背贴好,小支架一靠就很稳。当然,透明亚克力或积木也能搭出个性底座。
🌟 核心特性
1. 双模式秒级无缝切换
通过物理按键(GPIO 9)触发模式切换。状态机管理前后台,切换过程无黑屏、无闪烁。
模式一:经典太空人天气时钟 🌤️
- 零代码智能配网(WiFiManager),手机连上热点即可配置
- 抗锯齿中文字体,NTP 网络对时
- 心知天气 API 获取气温、体感、AQI,污染变色提醒
- 右下角经典太空人两帧走动动画
模式二:AI Agent 实时物理监控 🤖
- ESP32 与电脑端 Agent 建立 WebSocket 异步长连接,消息毫秒级推送
- 弹性流式排版,超长文本自动折行,内容变短时自动吸附贴合
- 超出屏幕时逐行平滑滚动(每 1.5 秒一行,句首句尾停顿 3 秒)
- 完美支持 Hermes Agent、OpenClaw(小龙虾)等主流自主智能体
2. 零闪屏局部重绘(Zero Flicker)
应用游戏级 ELF 局部绘制技术——只有像素行内容发生真实变化时才局部擦除重绘,杜绝传统 TFT 刷屏的剧烈闪烁和高频撕裂。
📦 硬件清单
| 模块 | 规格 | 备注 |
|---|---|---|
| 主控 | ESP32-C3 | 推荐 WeAct Studio / SuperMini |
| 屏幕 | 1.8 寸 RGB TFT | 驱动 IC: ST7735S, 128×160 |
| 按键 | 轻触按键 | 可用开发板板载 BOOT 键(GPIO 9) |
接线表
| 屏幕引脚 | ESP32-C3 引脚 | 功能 |
|---|---|---|
| VCC | 3.3V | 电源正极 |
| GND | GND | 共地 |
| SCL (SCK) | GPIO 4 | SPI 时钟 |
| SDA (MOSI) | GPIO 6 | SPI 数据 |
| RES (RST) | GPIO 3 | 复位 |
| DC (A0) | GPIO 2 | 命令/数据选择 |
| CS | GPIO 7 | 片选 |
| BLK | 3.3V / GPIO 5 | 背光(可指定引脚控制亮度) |
| 物理按键 | GPIO 9 | 模式切换(一端接 GPIO 9,一端接 GND) |
🔧 软件环境配置(PlatformIO)
推荐 VS Code + PlatformIO 开发环境。
依赖库(platformio.ini)
lib_deps =
Adafruit GFX Library
Adafruit ST7735 and ST7789 Library
U8g2_for_Adafruit_GFX
ArduinoJson
WiFiManager
links2004/WebSockets @ ^2.4.1
大程序分区
中文字库体积较大,需启用 huge_app 分区:
board_build.partitions = huge_app.csv
编译烧录
git clone项目并用 PlatformIO 打开- 修改
src/main.cpp中的配置:
// 天气配置
const String apiKey = "你的心知天气私钥";
const String location = "shenzhen"; // 城市拼音
// Agent WebSocket 配置
String agentIP = "172.20.10.4"; // 电脑局域网 IP(不能写 127.0.0.1)
int agentPort = 9119;
String wsPath = "/api/agent/status";
- 编译烧录
💻 PC 端伴侣脚本
电脑端运行 agent_companion.py——实时监控 Agent 会话文件,过滤 Markdown 符号,通过 WebSocket 推送清洗后的纯净数据到时钟:
pip install websockets asyncio
python agent_companion.py
脚本自动在 ws://0.0.0.0:9119 开启局域网端口,自动定位最新 Agent 会话文件。
🎨 界面运行状态
天气时钟模式:精准阿里云对时,红色秒针平滑运动,太空人每 500ms 交互走动。
Agent 监控模式:
- 状态行:
已连接(绿色)/已离线(红色) - 任务与回复行:内容自适应布局,短内容自动贴合,超出屏幕平滑滚动
- Tokens & 进度条:淡黄色 Tokens 左下角,橙色进度条指示器
💡 代码亮点
- 天气图标自动匹配:判断天气文本关键字,显示对应的像素图标
- 太空人动画:布尔变量每帧翻转,两帧位图切换,仅需几行代码
- WebSocket 异步事件驱动:不占用 CPU 轮询资源
- 弹性流式排版(Vertical Flow Layout):智能计算中英文混排真实宽度
📁 项目地址
完整源码开源在 GitHub:
🪐 GitHub: https://github.com/guitarliu/Maodou-Clock
如果这个毛豆让你觉得有趣,给它一颗 ⭐️ Star 就是最好的鼓励 🫶。
