起因

咸鱼上淘电子设备,最值的一类是大型连锁商超淘汰的电子价签(ESL,Electronic Shelf Label)。这些价签用的是墨水屏(电子纸),断电也能保持画面,功耗极低,商超一换批次或者整体下架某个供应商的方案,大批"九成新"的价签驱动板就流到了二手市场,价格通常比新买裸屏+主控便宜一大截。

这次入手的是 ZKONG(智控网络) 品牌的二手价签,卖家描述是"4.2寸三色墨水屏,日历+时钟+相框三合一,无背光,2颗CR2450电池供电,尺寸105×87×6mm",附赠一个 3D 打印支架。ZKONG 是做电子价签系统的厂商,客户覆盖零售、商超、便利店、药房等多个行业,二手市场上流出的这批具体原先用在哪家门店不确定,卖家也没写来源,不用纠结这一点。而且实测连上以后蓝牙广播名以 NRF_EPD_ 开头,这个命名格式是 EPD-nRF5 固件自己写死的(DEVICE_NAME="NRF_EPD" 拼接 MAC 地址后两字节),说明实际主控是 nRF52811买二手价签时卖家标的芯片型号别全信,连上蓝牙看广播名或者拆开看丝印才是准的。这颗 nRF52811 是市面 ESL 方案里很常见的选型(EPD-nRF5 项目文档里另一款盒马/阿里定制价签同样用的是它),本身支持蓝牙 5.0,只要固件支持得住,完全可以刷成自己的日历屏、时钟屏或者数码相框。

这篇整理的是开源项目 EPD-nRF5 的适配思路:怎么识别手上的价签板子、怎么烧固件、怎么用网页蓝牙界面配置显示内容。项目本身支持的主控范围更广(nrf51822/nrf51802/nrf52811/nrf52810),不止 ZKONG 这一款,思路是通用的。

这类价签值得改造的原因

  • 屏幕成本已经被摊掉:商超价签的墨水屏是走大批量采购的,二手价格远低于单独买裸屏
  • 低功耗电路已经设计好:驱动板自带电源管理和休眠电路,不用自己重新设计
  • 蓝牙是标配:价签本身就要支持无线刷新价格,主控自带 BLE,改造后天然支持手机/网页配置,不用额外接模块
  • 风险也在这:这是厂商定制方案,没有对外文档,型号、引脚、驱动 IC 都要自己动手识别,固件也要靠社区适配而不是官方支持

拿到板子后先干什么:识别硬件

价签到手,第一步不是急着刷机,是看清楚三件事:

  1. 主控型号:拆开外壳看主控芯片丝印,nrf51822/nrf51802/nrf52811/nrf52810 都在 EPD-nRF5 支持范围内。盒马/阿里这批用的是 nRF52811(RAM 24K,ROM 192K)。同一个方案不同批次也可能换过主控,卖家页面标注的型号不能全信,别直接照抄就开始刷机,以实物丝印为准。如果不方便拆机,也可以先用手机蓝牙扫描一下广播名——EPD-nRF5 固件的设备名固定是 NRF_EPD_XXXX 格式(XXXX 是 MAC 地址后两字节),扫到这个格式基本能确认是 nRF 系列在跑该固件,不是别的芯片方案。

  2. 驱动 IC:墨水屏本身贴的驱动芯片决定了刷新协议走哪一套命令集。项目目前实现了两大家族:

    驱动 IC 家族 具体型号 支持尺寸 颜色
    UC81xx UC8176 4.2寸 400×300 黑白 / 黑白红
    UC81xx UC8179 7.5寸 640×384、5.83寸 648×480 黑白 / 黑白红
    UC81xx UC8159(低功耗刷新版) 7.5寸/5.83寸低刷新版 黑白 / 黑白红
    UC81xx扩展 JD79668 4.2寸 黑白红黄四色(BWRY)
    UC81xx扩展 JD79665 7.5寸、5.83寸 黑白红黄四色(BWRY)
    SSD16xx SSD1619 4.2寸 400×300 黑白 / 黑白红
    SSD16xx SSD1677 7.5寸HD 800×480 黑白 / 黑白红

    驱动 IC 型号一般印在屏幕背面的柔性排线基板上,或者能在驱动板上查到走线对应的丝印。

  3. 引脚映射:主控和电子纸之间的 SPI/控制线(CS、DC、RST、BUSY 等)在不同价签板子上接的 GPIO 不一样,这是厂商定制方案里最没有文档、最需要自己动手量的部分。项目已经适配过的几款板子可以直接参考引脚配置,没有对上型号的就要用万用表或者看丝印过孔自己排查,再在网页界面里手动填引脚号试错。

已知的适配案例(供参考对照,不代表你手上的板子完全一致):

  • 老吾 4.2 寸黑白版:nrf51822,驱动 IC UC8176,引脚配置 0508090A0B0C0D,唤醒引脚 07
  • 老吾 4.2 寸黑白红三色版:nrf51802,驱动 IC UC8176,引脚配置 0A0B0C0D0E0F10,唤醒引脚 09,LED 引脚可选 03/04/05
  • 司飞 nrf52810:RAM 24K,ROM 192K
  • 盒马/阿里 nrf52811:RAM 24K,ROM 192K
  • ZKONG 4.2 寸三色版:主控实测为 nrf52811,屏幕尺寸 105×87×6mm(不含电池仓,电池部分厚度 12.5mm),2 颗 CR2450 电池供电,无背光

二手价签买回来大概率是"已使用过"的旧品,卖家一般会提示:屏幕可能有轻微划痕,或者残留原价签内容的淡淡残影,这种残影是电子纸材料本身的特性,随着后续多次刷新会逐渐消退,不是硬件损坏,不必纠结。购买前确认清楚这一点,避免因为正常现象产生不必要的售后纠纷。

引脚配置和驱动型号都可以在网页界面里在线切换,不需要重新编译固件——这也是这个项目比"一板一固件"的传统方案好用的地方。

固件烧录

EPD-nRF5 用 Keil 工程组织编译,nRF51 和 nRF52 平台的工程分开(Keil/EPD-nRF51.uvprojx / 对应的 nRF52 工程),编译目标里除了应用固件,还有专门烧录蓝牙协议栈(SoftDevice)的目标。

完整烧录顺序:

  1. 用 J-Link 或 DAPLink 全片擦除(Keil 里擦除失败可以用编程器自带上位机软件擦)
  2. 切到 flash_softdevice 目标,直接下载蓝牙协议栈(S130 或 S112),这一步不需要编译,只需要烧一次
  3. 切到对应芯片型号的应用固件目标,编译后下载

Flash 内存布局是 MBR(起始 4KB)+ SoftDevice(协议栈)+ Application(应用固件,起始地址 0x19000)的三段式结构;如果要用无线 OTA 升级,还要在更靠后的地址烧 Bootloader 及其配置页。日常开发调试可以只烧 SoftDevice + 应用固件,跳过 Bootloader;要走产线批量烧录,项目自带的 tools/make-ota-nrf51.bat / make-ota-nrf52.bat 脚本会调用 mergehex 把 SoftDevice、Bootloader、应用固件、配置页合并成一个完整 hex,一次性烧完。

调试的时候可以用 RTTView 看 RTT 日志,比拿万用表瞎猜靠谱得多。

如果不方便刷 Keil,或者只是想先看看修改 GUI(日历/时钟界面)以后的显示效果,项目还带了一个 Windows 桌面模拟器(emulator.c),用 MSYS2 + GCC 编译,能把黑/白/红三色缓冲区渲染成窗口里的位图,不用每次改代码都往芯片上刷。

蓝牙设置:网页就是控制台

固件烧好、SoftDevice 也在,价签开机后会自动开始蓝牙广播,不用装 App,浏览器(支持 Web Bluetooth API 的 Chrome/Edge)直接打开配置页面就能连:

  • 在线地址:https://tsl0922.github.io/EPD-nRF5
  • 或者把 html/index.html 下载到本地双击打开

连接与驱动配置

  1. 点"连接",浏览器会弹出蓝牙设备选择框,选中价签设备名
  2. 如果手上有好几块价签,容易选错设备,可以在"设备ID"里填价签蓝牙广播名末尾的 4 位十六进制,缩小搜索范围
  3. 连上以后,在"驱动"下拉框里选对应的驱动 IC 型号(黑白/三色/四色,尺寸和分辨率会跟着联动),“引脚"框里填第 3 步识别出来的引脚映射字符串,点"确定"下发配置——这一步配置错了屏幕大概率花屏或者刷不出内容,是排查的第一现场

显示内容:相框模式 与 日历/时钟模式

  • 数码相框模式:网页支持直接拖图片上传,内置多种抖动(dithering)算法把彩色照片转换成电子纸能显示的黑白/三色/四色点阵,还能在图片上涂鸦、加文字、裁剪。图片数据通过蓝牙特征值分块传输,四色/大分辨率屏幕还会用 RLE 压缩减少传输量和刷新等待时间。除了照片,把课程表、值班表这类表格图片传上去当常显内容也很实用,效果如下:

  • 日历模式:点"日历模式"按钮,屏幕切换成月历显示,带农历、节气、节假日调休标注。假期数据从 holiday-cn 项目的年度 JSON 拉取(也可以手动导入 JSON 文件),通过专门的蓝牙指令 0xB6 同步到设备,数据会保存到 Flash,断电不丢,每年只需要重新同步一次最新的节假日安排。

  • 时钟模式:显示实时时间,注意这个模式目前是靠电子纸整屏刷新实现的,网页会弹确认提示——长期开着走时钟容易加速屏幕老化留下残影,更适合临时用来测试或者修屏幕残影问题,不建议当成日常模式。

清屏与命令行调试

  • “清除屏幕"按钮会发一次全刷清空指令,屏幕出现花屏、鬼影严重的时候先清一次
  • 调试模式下有个命令行输入框,能直接发送蓝牙指令的十六进制字节,方便测试没有对应 UI 按钮的功能(比如时间同步、读电压/温度)

踩坑记录

  • 引脚配置填错,屏幕直接花屏或者一片空白:这是最常见的第一次连接后的现象,不代表固件或驱动 IC 型号错了。先确认驱动 IC 型号选对,再一位一位核对引脚字符串,量不准的引脚用万用表通断法配合示波器抓 SPI 时序逐个排除。
  • 蓝牙协议没有加密和重传:项目的蓝牙数据包是裸 opcode + 裸参数,没有 CRC 校验、没有序号、显式拒绝配对加密。日常家用没问题,但意味着传输过程对干扰没有纠错能力,图片刷新中途断连大概率要重新传一遍。
  • 时钟模式别长期开:前面提过,整屏刷新驱动的时钟走时会加速电子纸老化,能用日历模式(局部刷新为主)替代的场景不要用时钟模式。
  • 同一方案不同批次板子可能不完全一致:二手市场来源杂,即使标称同款型号,主控和驱动 IC 也可能因为供应商换过而不同,拿到手第一步永远是先拆开核对丝印,别直接照抄别人的引脚配置就开始刷机。
  • 卖家标的芯片型号不一定准:二手商家很多是批量收货、套用通用文案,页面写的芯片系列跟实物不一致是常事(比如这次 ZKONG 页面写的是 GR51 系列,实测蓝牙广播名却是 EPD-nRF5 固件专属的 NRF_EPD_XXXX 格式,说明实际主控是 nRF52811)。买前当参考,买后务必用蓝牙扫描或拆机核实。
  • 没有外部晶振的板子别开精确时钟源:项目默认不使用外部低速晶振(32.768kHz),因为不是所有价签驱动板都带这颗晶振,盲目改成外部晶振配置,没有晶振的板子会直接跑不起来。确认板子上有这颗晶振再改 main.c(nRF51)或 sdk_config.h(nRF52)里的时钟源配置。
  • 固件版本号打包脚本要手动核对:走 OTA 升级打包时,打包脚本里的版本号和固件代码里的版本宏是两处独立维护的,忘了同步会导致上位机误判版本,升级前检查一下这两处对不对。

总结

把商超淘汰的电子价签改造成自用的墨水屏日历/相框,硬件成本几乎是白捡的,真正的门槛在识别硬件(主控、驱动 IC、引脚映射)和固件适配这两步。EPD-nRF5 把驱动 IC 家族和引脚映射都做成了可在线配置的参数,不需要针对每块板子单独出一份固件,这也是二手市场上"不明来源"驱动板能被社区快速盘活的关键。折腾这类硬件的核心思路是一样的:先看丝印、量引脚,再谈刷机。

固件、GUI 绘制层、网页控制台的源码全部开源,日历/时钟/相框只是作者写好的几个默认玩法,不是这块硬件的能力上限。手里有源码、又能借助 AI 辅助读代码改代码,可玩性会比现成固件高得多:GUI 层是平台无关的绘制代码(改完用项目自带的 Windows 模拟器就能预览,不用每次都往芯片上刷),想显示天气、股票、待办清单、倒计时甚至自定义的仪表盘,本质都是"把数据画到 GUI 缓冲区里”;蓝牙协议是裸 opcode,配合网页前端的 main.js 也能扩展自己的指令和交互。有创意就去改,别把自己框在"能刷日历"这一步。

参考链接