SystemSix:树莓派电子墨水屏桌面日历(e-Ink Calendar)
SystemSix 是一个运行在树莓派上的 5.83 英寸电子墨水屏“桌面摆件”,外观致敬早期 Macintosh,可显示日期、前六个日历事件、本地天气预报和月相,并按天随机切换布局与图标,但它不可交互。
社区作者 · zZz
它解决什么问题
SystemSix 是发布在 GitHub 上的开源电子墨水屏项目,作者把它描述为写给自己的第一台 Macintosh 的“情书”,定位是一个带怀旧感的桌面摆件(配图 1 为项目 Logo)。它运行在树莓派上,驱动一块 Waveshare 5.83 英寸电子墨水屏。虽然看起来像一台老式 Mac 桌面,但它并不具备交互能力——不能点击,只能每天自行刷新出一个新的“桌面”(配图 2、配图 3 为实际的墨水屏显示效果示例)。
核心功能:
- 显示日历日期。
- 抓取并显示当天前六个日历事件,傍晚会再刷新一次。
- 每天开始时抓取并显示本地天气预报。
- 显示当前月相(如果是新月,可能会替换成一个“计算器”图标)。
- 可以指定“倒垃圾日”,到了那一天,桌面上的垃圾桶图标会显示成满的,作为提醒。
- 提供多种整体布局,并从 100 多个经典图标中随机挑选,让每天醒来都能看到不一样的桌面。
显示与刷新机制:项目选用的是一块 Waveshare 5.83 英寸电子墨水屏,分辨率 648 × 480(并非早期经典 Mac 的 512 × 342,市面上没有该分辨率的墨水屏)。因为面板像素一直延伸到金属边框处,作者刻意在四边留出了黑色“信箱式”留边,以便安装塑料边框而不遮挡像素。软件逻辑上,程序先按墨水屏的宽度、高度和位深生成一张完整图像(使用 PIL/Pillow 图形库),再把成品图像交给墨水屏驱动显示;刷新时会伴随十几秒的闪烁,因此代码尽量减少了刷新次数。
更新节奏是:午夜刷新一次(日期变了);凌晨 4:05 的特殊更新会选择当天的新布局,并首次尝试抓取天气与日历事件;傍晚 5:05 再次更新日历事件(显示次日日程)并刷新桌面,此时也可能切换到“月亮”配件显示月相;此外程序每小时唤醒一次,只在上一次抓取失败时重试,成功才刷新屏幕。
技术背景:本项目是作者学习 Python 的入门项目,代码基于 13Bytes 的 eInkCalendar 重构并扩展,新增了天气、月相和大量桌面与图标渲染逻辑;月相最初使用 Atkinson 抖动算法把灰度图转成黑白,这也成了整个项目方向的起点。素材方面,美术资源来自 MiniVMac 模拟器的截图;ChiKareGo2 字体采用 Creative Commons 许可。
作者也说明了自己使用的字体并不完美,多数缺少常见字形(例如 Geneva 9 的度数符号是手动补的),字距和间距可能不理想,Geneva 12 的粗体是靠同一字体偏移一像素二次渲染“作弊”实现的。
已知问题:作者所在地区使用的 api.weather.gov 天气接口并不可靠,常常错误地返回 2021 年 12 月末的旧预报;代码中加入了检测返回预报日期并拒绝该错误预报的逻辑,失败的数据抓取会在每小时重试,通常数小时后会恢复正常。作者暂时没有更换天气 API,因为多数 API 要求注册账号并在 URL 中传 token,对新用户不够友好。
— 本文由 AI 根据公开来源辅助整理,命令、版本与许可证请在使用前到原始页面复核。
安装 / 开始使用
- 准备环境:树莓派(用于驱动墨水屏)或任意可运行的桌面系统(仅预览用)、Waveshare 5.83 英寸电子墨水屏(648 × 480)、Python 3 环境。作者提醒:请确认 Python 环境指向 Python3,而不是更老的 Python 版本。
- 拉取源码:把项目源码下载到本地,例如放在 /home/pi/SystemSix/。
- 安装依赖:项目提供的 requirements.txt 覆盖了所需的 Python 模块,按该文件安装依赖。
- 运行:用 Python IDE 打开 systemsix.py 并直接运行。作者建议新手使用 Thonny(树莓派上通常已预装),桌面系统上常用 PyCharm。
- 无墨水屏时预览:在 systemsix.py 顶部有一个开关 USE_EINK_DISPLAY,将其设为 False,就可以在没有连接墨水屏的环境里运行 systemsix.py。开启该开关时的工作流是先按目标尺寸生成要显示的图像,再把图像交给墨水屏驱动;设为 False 后,最终生成的图像会由当前操作系统打开(在 macOS 上会用“预览”打开),而不是发送给墨水屏驱动。
- 个性化设置(Settings.py):
- “倒垃圾日”用整数表示,1 表示周一、2 表示周二,以此类推;设为 None 表示垃圾桶永远不显示为满;设为其他任意值表示“倒垃圾日”随机。
- 天气:在 Settings.py 中填写 LATITUDE 和 LONGITUDE。程序会查询 api.weather.gov,把经纬度转换成 office ID 以及 weather.gov 使用的网格 X、Y,用来获取本地预报。
- 日历:设置与代码与 13Bytes 的实现相同。作者只在 macOS 日历上验证过:WEBDAV_IS_APPLE 设为 True,WEBDAV_CALENDAR_URL 填入获取公开日历的 URL。获取该 URL 的方法是——在 Apple 日历 App 中新建一个日历并务必标记为“公开”,然后在日历里找到共享入口,把该日历“共享”给自己(例如用邮件发给自己);邮件里的链接中包含那段 150 多个字符的 URL,形如 webcal://p97-caldav.icloud.com/published/2/NDYyNT...,把它粘贴到 Settings.py 中。
- 树莓派无人值守运行:在树莓派的“终端”中执行 crontab -e,打开文本编辑器后滚动到文件末尾,添加一行:@reboot sleep 60 && /home/pi/SystemSix/run_systemsix.sh。含义是开机 60 秒后运行 /home/pi/SystemSix/ 下的 run_systemsix.sh 脚本;如果源码放在其他位置,需要把路径改成实际路径。配置完成后无需人工干预。
- 首次运行与常见问题:
- 墨水屏刷新时会出现大量闪烁,大约十几秒后图像才稳定显示,这属于该类墨水屏(或其驱动)的正常现象。
- 天气接口可能返回错误预报(作者遇到的是错误返回 2021 年 12 月末的预报),程序会检测预报中的日期并拒绝该错误结果,失败的数据抓取每小时重试一次,通常数小时后会自行恢复正常。
- 字体可能缺少常见字形、字距与间距不理想(例如 Geneva 9 的度数符号需要手动添加);黑白两值显示下任何抗锯齿都会显得糟糕,需要仔细挑选能让字形落在完整像素边界上的字体大小。