为 M5Stack PaperMono(M5Stack PaperMono)电子纸设备开发的固件,将该设备变为贴在冰箱上的家庭购物清单,并与手机网页应用保持同步。M5Stack PaperMono 采用 ESP32-S3 芯片,配备 3.97 英寸 480×800 电子纸触摸屏。该项目是一套完整可运行的应用,代码约 2400 行 C++,既可作为购物清单使用,也能作为自行开发其固件的起点。
正文
为 M5Stack PaperMono 电子墨水屏设备开发的固件。它把设备变成贴在冰箱上的家庭购物清单,并与手机 Web 应用保持同步。


PaperMono 是一款 ESP32-S3,配备 3.97 英寸 480×800 电子墨水触摸屏。本项目是一个完整可用的应用,代码量约 2400 行 C++,易于阅读。你可把它当购物清单用,或作为自行开发 PaperMono 固件的起点。
在 PaperMono 上显示的内容
- 妥善处理电子墨水屏刷新。 触摸、滚动和输入使用无闪烁的快速局部刷新。每 10 次局部刷新后强制一次全刷新,以减少残影并保护屏幕。灰色以 1 位点阵绘制,因此在两种刷新模式下显示一致。
- 电子墨水屏上的可用触摸 UI。 点按、滑动和侧边按钮均有效。屏上键盘仅重绘输入时变化的部分,并建议曾经添加过的物品。
- 低功耗联网。 Wi-Fi 仅在同步时开启:每小时一次;若点击屏幕且上次同步已超过 5 分钟则提前;每次编辑后立即同步。其余功能离线可用,编辑内容存入闪存队列直至下次同步。
- 整洁的电源管理。 电源键关机,当 USB 供电使电源 IC 无法切断时启用深度睡眠兜底。设备在安全电池电压下自动关机。前光默认关闭。
- 文档化的硬件启动。 电源 IC、IO 扩展器、屏幕和触摸控制器按已知良好顺序初始化。docs/hardware.md 包含引脚映射、I²C 地址及过程中发现的怪异问题。
工作原理
设备在 PaperMono 上按逛店顺序以通道分组显示清单。点按物品可勾选,或用屏上键盘添加。其他人通过手机添加。


中间有一个小型服务器存储清单。它记录每个物品所属通道,并可选择用 Claude 将全新物品自动归入正确通道。
- 按通道分组,遵循逛店顺序。 你在手机上设置一次通道顺序,两块屏幕都遵从。
- 离线可用。 清单、建议、勾选和添加均无需连接,包括在无信号的店里。
- 记住你的物品。 每个添加过的名称进入目录,驱动设备和手机上的建议。
- 可选自动排序。 服务器首次见到某名称时,可发给 Claude 归类到通道。若手动移到其他通道,该修正保留。
仓库结构
仓库包含 firmware/(PaperMono 的 PlatformIO 项目,C++/Arduino)、server/(FastAPI 服务器、SQLite 存储、手机 Web UI、测试)和 docs/(硬件笔记、架构、API、构建与部署指南、设计笔记)。
快速开始
1. 运行服务器
进入 server 目录,创建虚拟环境并安装:python3 -m venv .venv && .venv/bin/pip install -e .,然后以 SHOPPINGLISTCLASSIFIER=none .venv/bin/uvicorn shopping_list.main:app --host 0.0.0.0 --port 8000 启动。在手机打开 http://
2. 构建并刷写固件
需要 PlatformIO 和 USB-C 连接的 PaperMono。进入 firmware 目录,复制 src/secrets.example.h 为 src/secrets.h 并设置 Wi-Fi 与服务器 URL,然后执行 pio run -t upload。首次刷机前务必备份设备闪存,其中存有该机的出厂校准数据;备份、下载模式和浏览器刷写见 docs/firmware.md。
文档
| 文档 | 内容 | | --- | --- | | 硬件笔记 | 引脚映射、I²C 设备、启动序列、显示、触摸和电源细节;驱动复用 | | 固件 | 构建、配置、刷写与恢复设备;使用;排障 | | 架构 | 组件、数据模型、同步协议、离线行为、显示刷新策略 | | 服务器 | 运行与部署服务器、配置、自动排序、安全 | | HTTP API | 各端点、请求与响应 | | 设计笔记 | 固件来源、决策与权衡、已知限制 |
状态
一个个人项目,运行在家中一台设备上。它能工作,但不是产品。无设备端 Wi-Fi 配置(凭据编译进固件),服务器无认证(请置于 LAN 或带认证的反向代理后),仅测试过 PaperMono C153。详见已知限制。
致谢
固件的板级支持、电子墨水屏与触摸驱动、键盘布局和控件样式改编自 andrecolz 的 MonoMesh(同一硬件的独立 Meshtastic 兼容固件)。docs/design-notes.md 精确列出了复用部分。
许可证
GNU General Public License v3.0,与 MonoMesh 相同,固件部分派生自它。
评论
社区多数赞赏电子墨水冰箱贴创意并分享类似经验,穿插误读为游戏名等轻松调侃,但部分人质疑其相比纸笔或廉价方案的实用性,少数人反感“vibe-coded”标签。
欣赏电子纸创意并期待更大尺寸与功能整合
- 多人用Kindle或自建应用实现类似清单,希望有台面大屏、烹饪步骤显示、语音输入等扩展(较多人) > 这磁铁电子纸想法很棒,尤其烹饪时不用手机和平板(@dgently7)
认为传统纸笔或廉价液晶写字板更实用
- 少数人指出便利贴无电池无攻击面,或日本十几美元画板更便携且避免手机监控,本质电子纸只是难用的纸(少数人) > 便利贴断电可用、无电池、几乎无法远程攻击,还支持墨水蜡笔多种输入(@shitsonothersid)
归咎专利与授权导致电子墨水屏未普及廉价
- 较多人回忆十多年前就设想过此类用途,但专利限制使简单显示屏未像蓝牙音箱般便宜,大尺寸可编程屏缺失(较多人) > 这种简单显示屏本应和蓝牙音箱一样便宜,但存在重大专利限制(@schnevets)
反感项目标榜“vibe-coded”认为缺乏技术印象
- 少数人表示一旦得知是AI生成兴趣归零,认为只是展示工具能力而非作者本事(少数人) > 发现是vibe-coded兴趣就降到零,因为我自己也能提示出来(@ex-aws-dude)
关注刷新残影、电池续航与可编程设备推荐
- 技术向用户询问局部刷新残影问题、电池寿命,并求购类似缺货设备做儿童Anki卡(较多人)
有价值的补充
- 局部刷新正是这类面板残影堆积的环节,需权衡全刷与局部更新(@hn1rig3rak)
- 带麦克风喇叭的设备可实现语音输入购物清单,已有市售方案(@Zaheer)
- 自建应用可加入按超市动线自动排序、膳食计划与扫码录入食谱,解决冗长菜谱问题(@m101、@dgently7)