最近做了个 codex 小摆件,有兴趣可以复刻一个玩玩

发布于

## V2EX 发布草稿

- 推荐节点:`分享创造`(也可选 `硬件`)
- 发帖语法:`Markdown`
- 标题:`做了一个 ESP32-C3 桌面 Codex 用量监视器,还能联动 Lunar 自动调光`

最近用 Codex 比较多,但每次想看 5 小时和每周额度,都要切回网页。于是做了一个放在显示器旁边的小屏幕:平时抬眼就能看到 Codex 用量,也可以切成 macOS 系统监视器。

主控是 ESP32-C3 SuperMini,配一块 160 × 80 的 ST7735 彩屏。外壳、固件、本地服务和 Web 控制台都自己做了,目前已经开源。

![ESP32-C3 SuperMini Codex Monitor 实机](http://pic.zhso.org/2026/07/21/19c6513bb34d.jpg)

## 两个显示页面

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

![Codex 用量页面](http://pic.zhso.org/2026/07/21/f0d0bea2c2e6.jpg)

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

![macOS 系统监视页面](http://pic.zhso.org/2026/07/21/3b4033500f1f.jpg)

## 不只是显示 Codex 用量

我给它加了一颗光敏电阻,目前有三种用途:

1. 根据环境亮度自动调节小 TFT 自己的背光;
2. 通过遮挡手势切换 Codex / 系统监视页面;
3. 通过 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,不需要重新烧录。

![Web 控制台](http://pic.zhso.org/2026/07/21/1aca71dd4703.png)

## 硬件和接线

主要材料:

- 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](https://github.com/evoking6/esp32-code-monitor)

仓库里包含:

- ESP32-C3 固件(有光感 / 无光感两个构建环境)
- LittleFS 配网页面
- Python 用量与性能服务
- WebSocket 控制台
- macOS 屏幕状态联动
- 完整接线和部署文档
- 外壳、盖子、导光件 STL

目前主要在 macOS 上使用,其他系统的基础性能采集可以工作,但屏幕睡眠联动是 macOS 专用的。后面可能会继续优化外壳、光感标定和更多显示页面。

如果大家有更适合 160 × 80 小屏幕展示的指标,或者有不同显示器搭配 Lunar 的经验,欢迎交流。

---

原文链接:[点击查看](https://www.v2ex.com/t/1228719)

评论(8)

感觉要是能把指示灯的功能也做进去就完美了。就像交通灯那种,绿灯表示工作完成,黄灯表示运行中,闪烁的黄灯表示需要人工确认啥的。淘宝上倒是有卖那种只有三个 LED 灯没有屏幕的。

· 0 个赞

回复

楼上的建议已经采纳啦!已经在屏幕上加了个小灯条,工作的时候彩光流动,等待人工审批的时候会有呼吸效果。

· 0 个赞

回复

我去翻了接口文档,发现完全可行。晚上我会更新一个支持工作状态的版本上来。

· 0 个赞

回复

确实可以加一个专门展示工作状态的页面,我先去研究一下怎么搞。

· 0 个赞

顺便分享一个我之前做的纯桌面版监控小工具,大家也可以看看:https://gitee.com/assad2008/monitoring-codex-usage

· 0 个赞

楼主,这套硬件全部弄下来大概花了多少钱呀?

· 0 个赞

回复

硬件成本不高,全部算下来不到 40 块钱。

· 0 个赞

之前也看到过一个纯软件的桌面版方案,可以参考一下:@steipete/CodexBar

· 0 个赞