Appearance
OpenClaw 实时状态显示器
一个放在桌面上的 OpenClaw 后台状态小窗。
它由 ESP32-S3 和 2.9 寸 Waveshare 电子墨水屏组成,通过 Wi-Fi 从云端服务拉取 OpenClaw 的运行状态,把“已接收、工具调用、整理中、已回复”等后台过程显示出来。
这个项目解决的不是让 AI 更快回复,而是让等待期间的后台过程变得可见。

3 秒自动检查间隔
Wi-FiESP32 独立联网
中文服务器端位图渲染
PM2云端服务常驻
项目背景
OpenClaw 执行复杂任务时,最终回复可能需要几十秒甚至几分钟。问题不只是等待时间长,而是等待期间很难知道它到底在做什么:是在调用工具、查资料、整理回复,还是已经卡住。
这个小硬件的目标是提供一种低打扰的“掌控感”:不用打开日志,不用切后台,不用反复确认,只要看一眼桌面上的电子墨水屏,就能知道 OpenClaw 当前处于哪个阶段。
最终效果
屏幕会显示这些信息:
- 当前状态:例如
空闲、已接收、工具完成、整理中、已回复 - 前序动作:保留上一步动作,让任务推进过程更连续
- 任务信息:模型、本轮 token、上下文占比、更新时间
- 耗时:运行中显示已用时间,完成后显示总耗时
- 设备状态:右上角 Wi-Fi 图标
- 今日统计:今日任务数和今日累计 token
硬件清单
| 硬件 | 型号 / 说明 |
|---|---|
| 开发板 | Hosyond ESP32-S3 N16R8,带 Wi-Fi |
| 屏幕 | Waveshare 2.9 inch e-Paper Module,黑白,SPI |
| 线材 | 随屏幕附带的杜邦线 |
| 供电 | 目前通过 USB 给 ESP32-S3 供电 |
接线表
| 墨水屏接口 | ESP32-S3 引脚 |
|---|---|
| VCC | 3V3 |
| GND | GND |
| DIN | GPIO11 |
| CLK | GPIO12 |
| CS | GPIO10 |
| DC | GPIO9 |
| RST | GPIO8 |
| BUSY | GPIO7 |
接线和插拔时建议断电操作。这个项目里使用的是 3.3V 供电,不要接到 5V。
工作原理
整体链路可以理解成三段:
text
OpenClaw 后台状态
↓
云端 FastAPI 状态服务
↓
ESP32-S3 通过 Wi-Fi 每 3 秒拉取画面
↓
2.9 寸电子墨水屏显示ESP32 并不是通过 USB 数据线和电脑实时通信。它连上 Wi-Fi 后,会像一个独立的小设备一样,定期访问云端接口 /frame/activity.raw,下载一张已经渲染好的 1-bit 屏幕画面。
为了支持中文显示,最终没有让 ESP32 自己画中文,而是在云端用 Python/Pillow 先把中文界面渲染成电子墨水屏所需的原始帧,再由 ESP32 下载并刷新屏幕。
开发过程摘要
这个项目的开发更像一次人机协作:
| 我负责 | Codex 负责 |
|---|---|
| 提出需求 | 拆解实现方案 |
| 提供硬件链接和照片 | 判断硬件型号和接线方式 |
| 接线、拍照、观察屏幕 | 写 MicroPython 程序和屏幕驱动 |
| 反馈显示异常 | 修正旋转、镜像和扫描方向 |
| 提出界面体验要求 | 实现中文界面、刷新策略和云端服务 |
最初只是点亮屏幕就经历了多轮调试:不显示、上下颠倒、左右镜像、字母反向、内容越界。后续又继续打磨中文状态文案、3 秒轮询、防频闪、Wi-Fi 状态、今日统计和任务耗时。
刷新策略
电子墨水屏不适合高频全屏刷新,所以当前策略是:
- ESP32 每 3 秒检查一次云端画面
- 只有画面字节发生变化时才刷新屏幕
- 运行耗时采用粗粒度显示,避免秒级变化导致频繁刷屏
- 局部刷新已经做过预研,但当前版本仍采用“有变化才全刷”的稳定策略
这个策略在真实演示中可以比较流畅地展示后台过程,同时避免无意义闪屏。
当前限制
- 还没有外壳,线材和屏幕仍然裸露
- 供电还依赖 USB,不够优雅
- 当前显示内容还可以继续根据真实使用习惯调整
- 局部刷新暂未正式启用
- 如果云端状态服务停止,屏幕会停留在最后一次画面
后续计划
- 设计外壳和支架
- 优化供电方式
- 继续打磨中文状态文案
- 评估是否启用局部刷新
- 增加更清晰的复刻教程和代码包
下载资料
更多说明见 OpenClaw 状态显示器资料包。