引言:

PaperPi(项目地址:https://github.com/txoof/PaperPi)是一款用于电子墨水屏的信息轮播显示软件,目前版本为 V0.5。它可以定时轮询显示不同插件提供的信息界面,例如漫画、新闻或图片等。

电子墨水屏(E-Ink)由于其特殊的显示原理,具有许多传统屏幕不具备的优势:

  • 无背光、无频闪
  • 显示效果接近纸张
  • 光线越强越清晰
  • 可视角度接近 180°
  • 长时间观看不易产生视觉疲劳

因此,电子墨水屏非常适合用于低刷新频率的信息展示场景,例如天气信息屏、日历或资讯展示终端。

PaperPi 的运行方式非常简单。只需在配置文件中设定插件和轮播时间,它便会按照设定周期自动轮询信息页面,非常适合摆放在书桌或客厅中。

一、我的硬件环境

我使用以下硬件搭建了 PaperPi:

  • Raspberry Pi 4
  • Waveshare 9.7 寸黑白电子墨水屏,分辨率:1200*825,16级灰度
  • 控制芯片:IT8951

系统运行后,PaperPi 会按照插件设定的时间默默轮询各种信息页面。

不过,项目自带的插件(例如 XKCD 漫画、Reddit 信息等)不太适合国内使用环境。因此我决定重新设计页面,并对 PaperPi 进行一次“本地化改造”。

二、EpdLib 的设计理念与局限

PaperPi 的页面布局由 EpdLib (项目地址:https://github.com/txoof/epdlib)创建。EpdLib 的布局结构采用三层架构:Block → Layout → Screen。设计理念是构建分辨率无关的模块化界面系统。

但在实际使用中,我发现它存在一些问题:

1. 布局代码冗长:每一个显示元素的坐标、对齐方式、布局关系都需要完整定义,导致布局文件非常长。

2. 所有元素的坐标都需要手动计算,对于复杂页面来说非常低效。

3. EpdLib 没有实时预览功能,每次修改布局都必须运行完整程序才能确定是否修改到位,调试效率低。

4.错误提示不友好,当布局冲突时,系统通常只会抛出异常,很难定位是哪个元素出错或者哪个布局冲突,调试体验不友好。

三、页面设计思路

为了简化布局,我采用了一种非常直接的方案:

每个页面只使用一个 Image 元素。

也就是说:

Layout
            └── Image

所有信息都提前绘制到一张图片中。这样做具有几个明显优点:

  • 不需要计算布局坐标
  • 布局文件极其简洁
  • 可以自由设计界面
  • 调试效率高

这样页面逻辑就变成:采集信息 → 绘制图片 → 显示图片,然后借助 AI 编程工具(如 ChatGPT),可以很快生成绘图代码。

四、如何增加一个页面插件(示例)

这里以 树莓派运行状态页面为例。

插件功能是显示当前树莓派系统运行状态(图1)。

 

图1 树莓派运行状态

(一)页面信息布局:

  • 左上角:树莓派硬件信息、CPU类型、系统版本
  • 右上角:CPU 温度
  • 中部:CPU、内存、SD 卡、Swap占用率
  • 左下角:IP 地址、下载上传速率、读取写入速率等信息
  • 右下角:页面刷新时间

(二)插件创建步骤

(1)复制插件模板

进入:/usr/local/paperpi/plugins/

创建目录:demo_plugin_pistatus

然后复制一个原有插件:如slideshow下所有文件作为模板。

(2)修改布局文件

编辑 layout.py:

my_layout_one = {

    'image': {

        'type': 'ImageBlock',

        'image': True,

        'mode': 'L',

        'width': 1,

        'height': 1,

       'abs_coordinates': (0, 0),

        'random': False,

        'relative': False,

        'hcenter': True,

        'vcenter': True,

        'bkground': 'BLACK',

        'rgb_support': True

    }

}

这样布局中只保留一个 Image 元素。

(3)编写插件代码

创建demo_plugin_pistatus.py。我主要使用 AI生成代码(chatgpt网页版)

基本提示词如下:

 

生成一张 1200×825 的仪表盘图片,用于电子墨水屏显示。

图片布局要求:

左上角:树莓派硬件信息、CPU类型、系统版本

右上角:CPU 温度(温度表,下面为温度值)

中部:CPU、内存、SD 卡、Swap占用率(四个圆环图)

左下角:IP 地址、下载上传速率、读取写入速率等信息

右下角:页面刷新时间

 

生成绘图代码后(一般需进行微调,譬如字体大小、显示坐标等),再把 slideshow.py 的结构提供给 AI,让其把代码改造成 PaperPi 插件结构。因为插件最终需要返回Tuple类型,以适配 PaperPi 框架。

(4)修改插件名称

编辑constants.py,修改:

name = demo_plugin_pistatus

(5)修改配置文件

编辑:home/pi/.config/com.txoof.paperpi/paperpi.ini,新增:

[Plugin: A Demo Plugin pistatus]

layout = layout

plugin = demo_plugin_pistatus

min_display_time = 600

refresh_rate = 600

max_priority = 2

各参数说明可参考 PaperPi 项目文档。

(6)重启 PaperPi

重新启动paperi服务即可加载插件。

五、目前已开发的插件

目前我已经制作了 12 个插件,基本替代原有插件。

序号

插件数据源

1

成语解释本地 JSON格式 成语库

2

慢电影随机抓取MP4视频文件帧

3

山水画生成矢量山水画的网站截图

4

14天天气调用Open-Meteo API

5

豆瓣书籍预先生成的豆瓣图片库

6

电影资料调用TMDB API

7

24小时降水预报中央气象台天气网站

8

日历AI绘制

9

Unsplash图片调用Unsplash API

10

Wiki地理调用Wikipedia API

11

树莓派状态调用树莓派系统API

12

印象派图片调用Wikimedia API

其中几个插件效果如下:

  • 慢电影

从电影文件(.MP4)中随机截取一帧,并在左上角显示电影名,右下角显示播放进度(图2)。

 

图2 慢电影(类似: https://github.com/TomWhitwell/SlowMovie

  • 山水画

来自项目:https://lingdong-.github.io/shan-shui-inf/,该项目完全使用 JavaScript 生成中国山水画,并输出 SVG 矢量图(图3)

图3 随机山水画

  • 14天天气趋势

使用Open-Meteo API。展示未来14天的温度、雨量和降水概率(图4)。

图4 14天天气预报图

六、提高调试效率:配置编辑器

随着插件越来越多,手动编辑 paperpi.ini 变得很麻烦。于是我又用 AI 写了一个PaperPi 配置编辑工具(图5),大大提高了管理效率。

主要功能:

  • 可视化插件列表
  • 拖拽调整插件顺序
  • 快速启用/禁用插件
  • 自动生成 paperpi.ini
  • 自动备份功能,防止系统崩溃

图5 paperpi.ini可视化编辑器

七、一些心得

(一)AI 编程确实提升效率

对于 略懂编程的人来说,AI可以快速生成基础代码、提供优化建议、帮助调整结构,效率较完成重构插件有极大提升。

(二)AI 更适合“辅助开发”

AI 生成的代码通常需要手动微调,特别是涉及调整UI元素,基本不可能一步到位,但它仍然可以大幅减少重复编码工作。

 

4
0