V2EX 发布草稿
- 推荐节点:
分享创造(也可选 硬件)
- 发帖语法:
Markdown
- 标题:
做了一个 ESP32-C3 桌面 Codex 用量监视器,还能联动 Lunar 自动调光
最近用 Codex 比较多,但每次想看 5 小时和每周额度,都要切回网页。于是做了一个放在显示器旁边的小屏幕:平时抬眼就能看到 Codex 用量,也可以切成 macOS 系统监视器。
主控是 ESP32-C3 SuperMini ,配一块 160 × 80 的 ST7735 彩屏。外壳、固件、本地服务和 Web 控制台都自己做了,目前已经开源。

两个显示页面
第一个页面显示 Codex 用量,包括 5 小时窗口、每周窗口、重置进度和连接状态。数据由 Mac 上的 Python 服务读取,再通过 WebSocket 推送给 ESP32 ; Codex 的登录令牌始终留在电脑上,不会写进单片机。

第二个页面是系统监视器,可以显示 CPU 、内存或内存压力、磁盘、系统负载以及网络上下行速度。性能页做了平滑动画和多套配色,切换时不会突然跳数。

不只是显示 Codex 用量
我给它加了一颗光敏电阻,目前有三种用途:
- 根据环境亮度自动调节小 TFT 自己的背光;
- 通过遮挡手势切换 Codex / 系统监视页面;
- 通过 mDNS 发布
lunarsensor.local,把照度提供给 Lunar ,用于自动调节电脑显示器亮度。
第三项是我比较喜欢的部分。ESP32 会提供:
http://lunarsensor.local/sensor/ambient_light
http://lunarsensor.local/sensor/status
http://lunarsensor.local/events
其中 /events 是 SSE 实时照度流。Mac 和 ESP32 在同一个局域网时,Lunar 可以通过 lunarsensor.local 找到传感器,再根据环境光控制显示器亮度。
当然,这部分要求显示器及连接方式本身支持被 Lunar 调节;不支持的话,ESP32 的照度上报和 TFT 自身自动背光仍然可以正常使用。
Web 控制台
本地服务还带了一个 Web 控制台,可以实时查看:
- ESP32 在线状态和最后上报时间
- Codex 用量与 Mac 性能
- 环境照度和 TFT 背光百分比
- WebSocket 推送状态
也可以远程切换显示模式、屏幕方向、内存指标、Mac 屏幕亮灭跟随,以及性能页配色。修改后通过 WebSocket 直接下发给 ESP32 ,不需要重新烧录。

硬件和接线
主要材料:
- ESP32-C3 SuperMini
- 0.96 英寸 160 × 80 ST7735 SPI 屏幕
- 光敏电阻 + 10 kΩ 电阻
- 3D 打印外壳
固件中的接线如下,全部是 SuperMini 板上标注的原始 GPIO:
ESP32-C3 SuperMini ST7735 / 传感器
3V3 -> VCC
GND -> GND
GPIO5 -> BLK
GPIO6 -> CS
GPIO7 -> DC / A0
GPIO8 -> SCL / CLK
GPIO9 -> RST / RES
GPIO10 -> SDA / MOSI
GPIO0 -> 光敏电阻与 10 kΩ 电阻中点
PlatformIO 里借用了 seeed_xiao_esp32c3 的兼容编译环境,但实际主控不是 XIAO ,接线不能照搬 XIAO 的 D0–D10 编号。
软件结构
整体数据链路比较简单:
Codex API ─┐
├─> Mac 本地 Python 服务 ─WebSocket─> ESP32-C3 ─SPI─> TFT
系统指标 ──┘ │
└─> Web 控制台
环境光 ─> ESP32-C3 ─mDNS / HTTP / SSE─> Lunar ─> 电脑显示器亮度
Python 服务默认监听 0.0.0.0:8080,常用命令是:
./server.sh start
./server.sh status
./server.sh restart
./server.sh stop
./server.sh foreground
第一次上电时,ESP32 会创建 CodexUsage-xxxx 热点。连上后打开 192.168.4.1,填写 Wi-Fi 、Mac 的局域网 IP 和端口即可。Wi-Fi 、显示模式和配色会保存到 NVS 。
开源地址
项目已经放到 GitHub:
https://github.com/evoking6/esp32-code-monitor
仓库里包含:
- ESP32-C3 固件(有光感 / 无光感两个构建环境)
- LittleFS 配网页面
- Python 用量与性能服务
- WebSocket 控制台
- macOS 屏幕状态联动
- 完整接线和部署文档
- 外壳、盖子、导光件 STL
目前主要在 macOS 上使用,其他系统的基础性能采集可以工作,但屏幕睡眠联动是 macOS 专用的。后面可能会继续优化外壳、光感标定和更多显示页面。
如果大家有更适合 160 × 80 小屏幕展示的指标,或者有不同显示器搭配 Lunar 的经验,欢迎交流。