Bloody Sunshine

Just too damn hot

自制 E-ink 电子墨水屏相框

去年和 Frish 闲聊的时候提到 Inkposter 这个项目看起来不错,就是有点贵。E6 电子墨水屏看挺适合做相框的。他执行力超强,很快就就搓了一套 7.3 寸微雪墨水屏的方案,并开源给我了。这套方案已经完整可用,唯一的遗憾是 7.3 寸小了点。正好看到闲鱼上有老哥攒的半成品 13.3 寸 E6 彩色墨水屏 + 驱动板 + ESP32 开发板 + 1000mAh电池只要 1400,于是就拿下 + 改造了。

成品效果图:

闲鱼老哥提供的 sample code 已经基于微雪开放的代码实现了基本功能,包括:

  • 基于蓝牙的设备配网
  • 浏览器端运行的FS Dither抖动算法转码
  • ESP32 上跑的服务端
  • 墨水屏驱动和照片展示

使用流程是先给设备配网,每次要更换照片时按钮唤醒设备,浏览器访问设备的服务器上传。但是实际用起来不好用,因为如下几点:

  1. 作为一个电池驱动设备,绝大多数时候都是深度休眠的,每次要上传的时候都要先唤醒设备,设备上电之后启动了服务端,再用浏览器访问,等着选完照片上传,既费电,又麻烦;
  2. FS Dither 实际上在 E6 上的效果不够让人满意,主要是 E6 屏幕特性决定的,增加 30% 的饱和度后会好一些,但是仍然可以更好一些
  3. 家用场景它能定时/指定时间换才是主要场景,这个就完全没支持了

于是就按照自己的需求开始让 AI 爆改,一方面把服务端迁移到 NAS 上,让墨水屏纯做客户端,另一方面把墨水屏的固件改成定时唤醒拉图,尽量最节省电量。

服务端给 AI 的需求.md大概这样:

设计目标:
- 请根据电脑环境和需求选择和事的技术栈并完成整个项目,确定技术栈和项目架构之后请先和我确认再进行后续工作。
- 所有工作都在 /src/Server 目录下完成,不可以写入或修改其他位置的文件

需求:
- 项目仅个人使用,本地部署,技术栈尽量简单
- 服务器是个人电脑,服务尽量控制资源占用
- 部署和未来的维护越简单越好
- /Server 内的内容需要能够独立编译运行

电脑环境:
- Win10 with docker & WSL & Hyper-V
- Intel i7 11600T

功能需求:
- 本地开一个 http 服务器,绑定 eframe.local 域名
- 访问 http://eframe.local 打开首页 /index.html
- 支持以下 API
- /getPhotoList :获得接下来要展示的照片列表,包括预览图、照片名称、URL
- /getShowedPhotoList :获得之前已经展示过的照片列表 MAX=50
- /getEframePhoto :获得下一张要展示墨水屏格式照片
- /uploadEframePhoto :上传一张已经处理成墨水屏格式的照片,需交验合法性
- 首页设计和 /data 中一致,可以上传本地照片、转换成 13.3 寸 E6 墨水屏用的格式,分辨率 1600X1200,首页保留网页上处理墨水屏照片的功能,上传调用 /uploadEframePhoto 直接上传
- 网页右上角增加一个链接:队列。
- 队列网页地址 /photolist.html
- 队列分别显示之前已经被墨水屏取走的照片列表,和接下来每次获取时的队列

基本上就是把技术决策都扔给 AI,Codex 澄清了一些细节之后基本一次成型,还是让人印象非常深刻的,最后方案是 Python 写功能,nssm 做本地服务,必须得说:

  1. Python 真是最 AI 友好的语言哈哈哈哈
  2. 微软的东西做大规模服务全是坑,但是个人用真是你想要啥都能满足,做家用 NAS 操作系统绝配

而客户端就没这么顺利,首先 sample code 是给 Arduino IDE 写的,迁移到 VSC + PlatformIO 就遇到了一些莫名的问题,然后修改功能的时候又 bug 不断,后来把模型从 Copliot 免费的 Haiku 4.5 直接改成了 Codex + OpenAI API(5.3-codex),可靠性大幅提升。

中间遇到最无语的问题是这样的,第一版功能比较粗暴,每天凌晨 3 点唤醒从服务器取一张图,刷新然后休眠。实际使用中发现每天 2:55-2:59 会唤醒两次,每天都会。这个问题搞了一天多,狂烧 token,AI 一直猜测是 API 重复调用或者误触按键,做了好多次调试。最后结果非常的走进科学:ESP32 时钟不准,每次唤醒都不到三点,于是刷新后会再定一个三点唤醒,于是就唤醒了两次 🙄。最让我 🙄 的点是 AI 从头到尾也没想到这个可能性,还是我提示的。。。

最后,整个项目最难的部分是把墨水屏塞到相框里,塞完之后已经 40 天没动了,运行良好,看电压变化估算掉电 40% 左右,如果配个 21700 电池每天刷两次跑半年不充电应该毫无问题。

其他一些收获

  • E6 屏号称六色,其实只有红黄蓝白四色,绿色是黄+蓝,黑色是所有颜色加一起,所以显示色域显著不如 CMYK 四色印刷(更别提六色了),不过新一代 ACeP 技术会稍好一些
  • 电子墨水屏除了色域的问题之外,相比印刷还有个问题是像素密度,因为印刷是可以墨点叠加实现更精细的控制的,但是电子墨水每一个点都是固定的,这就决定了近看还是差一些
  • 体感上一个模型在解决问题的时候如果两轮没搞定,那就大概率搞不定了,换不同的模型搞搞会更好