总成本最低不超过 50 的随身/家庭兼顾墨水屏,最近几天一直在搓这个项目。
这次我把他做成了一个完善的开源工程项目。目前市面上关于这块屏幕通篇都是闭源固件,而且没有完整的端到端 BLE 实现,所以我做了这个项目,欢迎大家二次开发。整套方案设计在 2 天内完成,整整花了 3 天精心打磨,我认为这是一份不错的答卷。
- 💻 GitHub 开源仓库:https://github.com/ZGQ-inc/3.98-epd(全套 Rust/ESP-IDF 固件、PWA 前端源码、立创硬件工程与 3D 打印外壳 STL)
- 🌐 Cloudflare 离线 PWA 随身工坊:https://398epd.zgqinc.gq/(手机/PC 浏览器打开即可,100% 离线运行,支持 WebBLE 蓝牙极速直推)
图:最终装配完成的 3.98 寸随身/家庭墨水屏成品——内嵌强磁稳稳吸附在白板/冰箱上,显示系统状态卡片与四色精致兽设 Demo
🧮 3天心血:和 ESP32-C3 小的可怜的 SRAM 斗智斗勇
这 3 天里面,我基本上是在和 ESP32-C3 小的可怜的 SRAM 斗智斗勇。
本来我最初的设计思路是想偷个懒,直接在单片机内部完成全部 2bpp 计算的。按照原本的构想:用户手机或者 PC 随便传一张图或者发几条排版指令,单片机自己跑图片解码、双线性缩放、字库排版以及 Floyd-Steinberg 误差扩散四色抖动算法,最后把计算好的 2bpp 数据塞入显存刷新。
结果刚一开工写代码就傻眼了——单片机内部算 2bpp?内存根本不够用!
我们来实打实算笔账:
- ESP32-C3 标称物理 SRAM 虽然有 400 KB,但扣除 ROM 引导、数据缓存和系统预留,开机实际能分给用户的可用堆内存(Heap)也就 300 KB 出头;
- 打开 Wi-Fi 协议栈和 LwIP 的收发包缓冲,直接吃掉 60~80 KB;
- 启用 BLE 5.0(NimBLE)的控制器和协议栈,再吃掉 50~60 KB;
- Wi-Fi 和蓝牙双模并发(Coexistence 射频共存),缓冲区又要占掉 15~20 KB;
- FreeRTOS 的系统调度内核、主任务、网络事件回调和定时器任务栈,又稳稳扣除 30~40 KB。
算到这里,系统能喘气的剩余内存其实已经暴跌到了 120~130 KB 左右。
然后最要命的来了: 这块 3.98 寸四色屏幕的分辨率是 768 × 552。因为是黑、白、黄、红四色,每个像素必须用 2 个 Bit(2bpp)来表示。 单单是在内存里开辟一个最基础的显存 Framebuffer: \(\text{显存大小} = \frac{768 \times 552}{4} = 105,984 \text{ 字节} \approx 103.5 \text{ KB}\)
光是这一个静态显存数组,就生生吞掉了 103.5 KB!
这时候你拿计算器一按,最后留给单片机做动态计算和业务逻辑的内存,仅仅剩下可怜的 15 到 25 KB!
不信?我们直接打开单片机的局域网控制台(http://192.168.10.203/)看真实的运行诊断实况:
图:真机实测单片机局域网控制台(192.168.10.203)——系统实时可用堆内存仅剩 15,116 字节(最低下探至 1,352 字节!),彻底印证了前文的内存算账;18 项底层硬件指标、Flash 分区余量、零内存标准字库与 TR3000 路由器连接尽收眼底
这 15KB 不到的残存内存,直接宣判了单片机内部计算的死刑:
- 解码和缩放当场暴毙:任意一张手机传上来的 768×552 图片,解码成未压缩 RGB 就要 $768 \times 552 \times 3 \approx 1.27 \text{ MB}$ 内存,ESP32-C3 把内脏掏空都装不下;更别说还要开浮点或者定点数组跑误差扩散抖动了。
-
WebUI 内部发包让内存瞬间爆满:起初我还尝试退一步,把完整的 WebUI 控制网页打包塞进单片机的 SPIFFS/HTTP 服务器里,结果手机浏览器一连,几个并发 TCP 连接一开,传 HTML、传 CSS、传 JS,LwIP 的 TCP 发包窗口与 socket 缓冲直接把剩下的二三十 KB 堆内存彻底榨干,终端狂弹
malloc failed,紧接着直接 OOM panic 异常重启。
💡 绝地破局:全面转向 PWA + 单片机只留 Debug
既然在单片机内部算是不可能的了,那何必难为它?
我索性彻底改变架构:单片机内部网页彻底剔除复杂交互,只保留最轻量的硬件诊断(Debug)功能;而真正的用户交互、图像预处理与 2bpp 渲染,我写成了一个 100% 离线的 PWA(Progressive Web App)渐进式 Web 应用,托管在 Cloudflare Pages 上(https://398epd.zgqinc.gq/)。
所有的图片缩放、文本排版、点阵字体渲染、离线二维码生成,以及最吃性能的 Floyd-Steinberg 四色微粒抖动算法,全部丢给手机或电脑的浏览器去算!现代手机有几个 G 甚至十几个 G 的运行内存,算这些毫无压力。
PWA 在浏览器里通过 HTML5 Canvas 渲染完成并量化好,打包成严格对齐的 105,984 字节 2bpp 纯二进制流,然后直接通过 Web Bluetooth (WebBLE) 蓝牙直连,或者局域网 HTTP POST 裸推给单片机。
单片机拿到 105KB 数据,一分不差地直接塞入那 103.5KB 显存,然后用硬件 SPI 往屏幕里刷。零计算开销,系统稳得如同磐石,彻底告别内存溢出!
🎨 PWA 功能深度巡礼:四大创作工坊与 9 种微粒算法
为了让这块 3.98 寸四色屏幕真正实用起来,我在 PWA 里构建了一整套极具极客与生活气息的交互生态。我们通过 Playwright 抓取了各个功能面板的实机界面,带大家逐一解析:
1. 四大核心创作工坊合辑
针对这块墨水屏最核心的几个使用场景,PWA 原生提供了四大定制工坊模块:
图:PWA 四大核心创作工坊——左上:智能工牌;右上:兽聚痛卡(展开样式下拉菜单);左下:随身便签清单;右下:4色手绘画板(展开工具下拉菜单)
- 📇 智能工牌 / 电子名片 (Badge): 预设了“极客黑客”、“商务极简”、“兽聚名片”、“展会工作证”等 4 套版式模板。支持职位、姓名、签名自定义排版,右侧根据填入的主页或 Telegram 链接离线实时生成对齐的矢量二维码,挂在胸前科技感十足。
- 🎒 兽聚痛卡 / 角色挂件 (Ita-Bag): 专为二次元与毛毛 OC 设计!配合外壳挂绳孔可直接当作痛包挂件。支持透明 PNG 角色立绘拖拽与 20%~400% 自由缩放。文字样式下拉菜单提供了 “漫画对话气泡 (Speech Bubble)”、“底部铭牌横幅 (Subtitle Banner)” 与 “纯享角色立绘 (无台词遮挡·满幅全身展示)” 3 种版式,边框下拉菜单还可自由选用金属铆钉或四角星芒护角。
- 📝 随身便签 / 备忘待办 (Memo): 采用 32px 超大高对比度粗体字,专为厨房冰箱留言与桌面日历备忘优化。支持多行方框打勾复选清单(如“出门记得带钥匙和工牌”、“给痛卡充好电备战周末兽聚”),吸在冰箱上一目了然。
- 🎨 4色像素手绘画板 (Paint): 手机触屏或鼠标即可实时涂鸦!提供黑、白、黄、红 4 种纯色墨水及 10 种物理微粒混色精选灰阶。工具下拉菜单集成了 画笔 (Pen)、直线 (Line)、矩形框 (Rect)、实心矩形 (Rect Fill)、圆形框 (Circle)、实心圆形 (Circle Fill)、题字 (Text)、橡皮擦 (Eraser) 8 大绘图工具,支持撤销/重做与画笔粗细调节。
2. 图片调色工坊:集齐 9 种 BWRY 误差扩散与半色调算法
由于四色墨水屏只认黑白黄红 4 种物理粒子,如何把复杂的彩色照片和插画还原得自然、没有色阶断层,全看抖动算法。在图片调色工坊中,我一口气实现了 9 种半色调与误差扩散算法:
图:图片调色工坊——支持任意图片/插画导入平移缩放,展开下拉菜单可自由选择 9 种微粒抖动算法,配合对比度与亮度滑块实时预览物理量化效果
下拉菜单内置的 9 种算法各有千秋:
- Floyd-Steinberg 误差扩散(默认推荐):经典四邻域扩散,过渡最为细腻柔和;
- Atkinson(复古 Mac 风格):三成误差保留机制,高光干净、线条清晰硬朗;
- Microsoft 8x8 GDI(经典 Win95 复古像素):充满 90 年代老电脑情怀的规则网点;
- Stucki 误差扩散:十二邻域三行扩散,细节锐利不发糊,特别适合风景与照片;
- Burkes 误差扩散:计算速度更快且高保真的优秀扩散;
- Sierra 误差扩散:三行平衡扩散,暗部细节保留更加均匀;
- Ostromoukhov(动态变系数抗蠕虫):根据灰度动态调节扩散权重,彻底消除水波纹与蠕虫杂斑;
- Bayer 4×4(有序抖动点阵):经典均匀网点,适合波普艺术与漫画网点纸质感;
- Threshold(纯阈值硬边缘):无抖动硬边缘截断,适合纯色矢量 Logo 与高对比文字。
配合下方对比度(-50 ~ +50)与亮度调节滑块,任何照片都能在浏览器里微调出最完美的四色微粒效果!
3. 场景遥控与双轨预设库管理
墨水屏的另一大魅力在于充当常驻桌面组件。PWA 提供了功能丰富的场景遥控与预设管理器:
图:左:场景遥控面板(12 套场景模式快捷切换与全屏强行洗屏遥控);右:预设效果库(单片机板载 Flash 与本地离线草稿库联动)
- 12 套场景模式快捷切换:默认极客时钟、随身备忘便签、厨房冰箱留言、7天天气看板、电子日历倒数、硬件网络雷达、电子相框模式、番茄专注时钟、每日诗词鉴赏、股票加密行情、纪念日倒计时、欠压低电告警。
- 物理洗屏遥控:针对墨水屏长时间使用可能残留的微弱鬼影,提供一键“物理全刷(16秒)”以及“全白”、“全黑”、“全黄”、“全红”强制重置。
- 双轨预设管理器:支持将喜爱的设计同时存入浏览器本地 LocalStorage 草稿库,或一键批量写入单片机的 SPIFFS Flash 分区(分配了 1.4MB 存储空间,可常驻多张离线画报)。
4. 双模网络支持与蓝牙隔空配网
设备管理上同样兼顾了离线外出与家庭智能家居接入:
图:左:局域网 IP 直连与 Home Assistant MQTT Broker 桥接配置;右:蓝牙隔空 Wi-Fi 配网弹窗
-
局域网 IP 直连与 MQTT:墨水屏连入家中 Wi-Fi 后,填入单片机局域网 IP(如
192.168.10.203),PWA 会自动切为高速局域网 HTTP POST 通道,几百毫秒即可推完整张 105KB 显存;同时支持接入 Home Assistant 的 MQTT Broker,用自动化脚本远程定时推屏! - 蓝牙隔空配网 (Air Provisioning):在户外漫展或临时换 Wi-Fi 时,再也不用让手机断开蜂窝数据去连单片机发出的 AP 热点!直接打开蓝牙,PWA 通过 WebBLE 将路由器的 SSID 和密码直接隔空注入单片机,优雅且省心。
🔨 详细物料成本核算:真·50元极限清单
我们常说的“不到 50 元”,不是玩虚标,而是实打实的一件件淘宝/闲鱼散买成本:
| 核心组件 | 推荐规格型号 | 数量 | 采购参考成本 |
|---|---|---|---|
| 3.98” 四色墨水屏 | 华为生态手机壳尾货拆机 (SE0398NZ07) |
1 片 | ~¥20 - ¥25 包邮 |
| 主控核心板 | ESP32-C3 SuperMini (4MB Flash, RISC-V) | 1 块 | ~¥9.9 - ¥12 |
| 锂电充电保护板 | TP4056 Type-C 充电模块 (带保护电路) | 1 块 | ~¥1.0 |
| 高压驱动转接板 | OSHWHub 开源高压转接板 (立创打样自焊) | 1 片 | ~¥0 - ¥5 |
| 聚合物锂电池 | 663032 3.7V 750mAh (带保护板) | 1 块 | ~¥4.5 - ¥6.5 |
| 微型电源开关 | SS12D00 / SS12F15 单刀双掷滑动开关 | 1 个 | ~¥0.3 |
| NFC 贴片 (可选) | NTAG216 (888字节大容量) | 1~2 枚 | ~¥1.0 |
| 螺丝与热熔螺母 | M2 滚花铜螺母 (8颗) + M2 机械螺丝 (4颗) | 1 套 | ~¥1.0 |
| 3D 打印外壳 | PLA+ / PETG 耗材约 40g | 1 套 | ~¥2.0 |
| 合计总成本 | 包含屏幕、主控、电池、电路与外壳的整机成本 | 1 台 | 约 ¥40 ~ ¥49.8 元 |
💬 灵魂发问:这个项目能不能量产?
关于之前评论区不少朋友留言问我:“主播这玩意能不能量产?或者能不能开团批量做一批卖?”
在这里我统一回答一下:我认为现阶段量产还不成熟,甚至可以说根本不现实。
原因主要有以下四个死穴:
1. 最大的问题:哈人接线与手工地狱
你看图片里面的哈人接线就知道了:
图:外壳内部真实的哈人接线实况——除开屏幕 24 根金手指,额外还要手工飞线焊接整整 20 个焊点,高温胶带与热熔胶齐飞,谁看谁迷糊!
除开墨水屏本身的 24-Pin 0.8mm 金手指贴片焊接,主控与外围整整要手工飞线焊接 20 个焊点(ESP32 到驱动板的 8 根 SPI 信号线、电池到充电板正负极、充电板到滑动开关、开关到主控供电轨)。谁量产会这么折腾?人工焊一台得小半个小时,流水线工人都得连夜买站票跑路。
2. 厚度与现成模块堆叠(比一元硬币还薄的梗)
现在的整机实测厚度是 11mm。
虽然听起来没有现代智能手机那么纤薄,但我们不妨学习一下经典友商发布会的传统艺能——只要我把一枚一元硬币(直径 25mm)竖着立起来放,那我就可以理直气壮地宣称:“整机厚度甚至比一枚一元硬币还薄了一大半!”(战术后仰,经典立币对比法)。
图:背部内嵌 4 颗 N52 强磁与 M2 铜螺母,侧边露出滑动硬开关与 Type-C 充电口
调侃归调侃,毕竟里面塞了现成的 ESP32-C3 SuperMini 模块、现成的 TP4056 板子、高压驱动板和 750mAh 电池。模块之间没有做沉板技术(Sunken PCB),完全靠三明治空间错位堆叠。所以后期如果要量产,肯定是要自主设计一整块高度集成的一体化 PCB,把主控、充放电、升压回路全做在同一块板子上,做完这套硬件改版才能谈量产规划。
3. 屏幕是尾货,根本不可能批发
这个也是最大的痛点——这个 3.98 寸四色屏幕本身就是华为手机壳的尾货库存,基本上是买一块少一块,批发是完全不可能的事情。
如果去买微雪原装的四色墨水屏模块,一块光裸屏就奔着上百块去了,整机总成本根本不可能压在 50 元以内!除非哪天墨水屏源头面板大厂愿意直接找我合作供货,否则量产在供应链上直接卡死。
4. 硬件功能其实非常不完善
如你所见,由于极度压缩成本,很多外围并没有补齐:
- 没有库仑计/电量计:如果板载加上一颗 MAX17043 电量计芯片,整机物料成本直接凭空多出 20 块钱;
- 没有多余的按钮辅助控制:整机除了一个电源硬开关,没有任何物理按键;
- 最关键的死穴:屏幕硬件完全不支持区域刷新(局部刷新)! 之前原型文章也提过,这块四色屏幕一次物理全刷需要整整 16 秒的电泳波形闪烁!这就意味着很多需要实时交互的功能是绝对无法实现的(比如秒级时钟、打字机输入、实时股价监视器)。它只适合作为一天只刷几次的工牌、痛卡、留言板或桌面日历。
图:没有电量计下的硬核妥协——利用 ESP32-C3 内部硬件欠压探测器(BOD Level 7)临界监控,在电池耗尽关机前完成最后一次全刷,将告警画面永久定格在屏幕上!
图:半透外壳在暗光下的透光效果,夜晚工作时隐约透出内部红蓝指示灯,科技感拉满
📦 想要的话怎么搞?
综上所述,如果谁有需要这个屏幕伴侣:
- 推荐自己搓:整套软硬件工程、Rust 固件、PWA 前端源码、3D 打印外壳 STL 和参数化 OpenSCAD 文件我已经全部开源并尽可能把文档写得详尽完善了,跟着文档买料自己焊,成本也就一顿外卖钱,享受折腾的快乐;
- 找我代搓?:要么你直接出 BOM 物料费用 + 3D 打印耗材费用 + 手工组装焊接工时费让我来搓——不过坦白讲我平时真的没空,请别人代焊代打也完全可以。
另外,如果你对这个随身墨水屏项目有什么好的功能想法或者二次开发脑洞,欢迎在评论区或群里补充交流!
前往 Telegram 频道参与讨论
在频道帖子下评论
forum 评论区