Sam Broner

纽约市及线上软件项目

基于 Raspberry Pi 和 E-Ink 的火车和天气追踪器

2025年3月2日 Art, Physical, Software

我终于做成了一个我的妻子喜欢的 Raspberry Pi 项目:一个 E-Ink 火车和天气追踪器!如果你也想做一个,GitHub 仓库和教程在这里

E-ink display showing subway schedule information Kira 将要慢跑去上夜班啦!

过去几年,我一直在探索 E-Ink 的可能性。我从一个天气和新闻显示屏开始(它仍然是我网站上唯一能稳定获得自然流量的文章)。虽然我很喜欢它,而且看起来很棒,但用手机看新闻更好,而且天气一天只看一次。然后在 2022 年在 MIT 的时候,我做了 Jarvis,E-Ink 语音转图像显示屏。Jarvis 是个很棒的聚会小技巧 —— 说“Hey Jarvis,在时代广场给我画一头在保龄球上的大象”,然后看着图像逐渐显现。值得注意的是,那是在 ChatGPT 出现之前,人们还对 AI 感到印象深刻的时候!

E-ink weather display showing forecast Jarvis e-ink voice-to-image display Jarvis 现场演示效果更好!

然后在感恩节期间,我有一些空闲时间,一堆备用零件,以及编程和制作实物的冲动。所以就有了现在的 E-Ink 火车和天气追踪器。

这个想法很简单:每天早上,我的妻子和我都会乘坐 F 线或 G 线地铁上班,从一个距离我们家步行 6 分钟或慢跑 2 分钟的车站出发。我喜欢纽约的地铁,它运行得非常好,但火车来的 很频繁 而且 可预测,而不是 按时刻表。所以每天早上我们都在问,下一趟 G 线什么时候来,下一趟 F 线什么时候来 —— 我们中的一个人会拿出手机打开 MTA 应用程序或 Google 地图,然后喊出即将到来的列车时间。然后我们会调整我们的早晨流程,要么加快速度赶上三分钟后的火车,要么放慢速度等待十分钟后的火车。

地铁和天气追踪器让查看火车时间比拿出手机更快更方便。因为它位于我们家的中心位置,所以总有人离它很近,可以瞥一眼。

MTA API 报告的地铁时间是可靠的,一旦火车到达几个站内或 15 分钟内,精度就会随着火车越来越近而提高。墙上的火车时间可以让你在出发时间临近时,查看你的早晨流程与火车时刻表之间的匹配程度。

最棒的是,Kira 喜欢它!它和给她的梳妆台加上腿使其高度更合适,以及在她邀请同事参加读书俱乐部之前修理好毛巾架一样,都属于我的 DIY 佳作。

如果你想自己做一个,或者更好地理解这个项目,我将在下面深入探讨一些编辑和注意事项。实际操作说明、零件和代码都在这个 GitHub 仓库里。

描述和功能

这个火车和天气追踪器基于一个9.7 英寸 1200x825 E-Ink 显示屏,连接到一个 Raspberry Pi 4b。显示屏分为四个部分:一个头部,显示日期、时间和实时秒针以指示活跃状态;一个火车追踪器;通勤天气;以及一个“天气条”,显示未来 12 小时的天气。布局的主要焦点是火车追踪器,它显示未来 30 分钟内到达的 F 线和 G 线列车。

Raw e-ink display showing the train tracking interface

这个显示屏放置在一个激光切割的卡纸板中,卡纸板上有黑色的脊,用于隐藏 E-Ink 显示屏的黑色边框。这个卡纸板放置在一个 8.5 英寸 x 11 英寸的樱桃木框架中,框架深 1.5 英寸,以便 Raspberry Pi 可以后置安装,同时框架仍然与墙壁齐平。我们将显示屏挂在门旁边的钥匙架上方,这通常是合适的位置,而且还有助于隐藏电源线。

Back of the frame showing Raspberry Pi and wiring 不太美观,但有效

项目细节

这个项目的软件部分是可以管理的,尽管在使用 Waveshare E-Ink hat 进行编程时有一些注意事项。我们有一个模块化的架构,具有清晰的责任分离:

  1. Display Engine:将布局渲染到显示屏上,支持与物理 E-Ink 显示屏的通信或为非 Raspberry Pi 开发渲染 png
  2. Layout System:一个非常简陋的元素可视排列。在这里做一些更复杂的事情(例如,一个 html 渲染器)会很有趣,但 🤷‍♂️。如果你想修改这个项目,这可能需要最多的工作
  3. Data Services:从 NYC Transit GTFS feeds 获取和处理(这很重要!)火车到达信息 + 获取天气预报
  4. Application Controller:协调事件循环和订阅模型,以驱动显示屏的更新

最大的技术约束是 E-Ink 显示屏的更新速率。该显示屏支持具有不同权衡的多种更新模式,并且 可以 管理低于 500 毫秒的更新,尤其是在部分更新的情况下,但是更快的刷新会导致字符模糊和明显的重影,看起来非常糟糕。更大的问题是,超载显示屏会导致其崩溃,这需要完全重置。

经过一些测试,我选择了一种混合显示更新策略。

每秒钟,时间的秒和分数字周围的像素都会使用显示屏最快的部分更新模式重新渲染,以清楚地表明显示屏按预期运行。

当接下来的两次火车时间之一发生更新时(这些比 30 分钟后的火车更重要),会进行快速全显示渲染——所有数据都会在此时更新,但只有接下来两次火车之一的新到达时间才会驱动更新。

在每个小时的开始,显示屏都会进行深度全屏渲染,以锐化字符并消除重影。

Different e-ink refresh modes and their visual effects 老实说,你必须亲自尝试才能理解这些看起来会怎么样

进行深度全屏渲染可能会令人不适——它会导致黑色和白色的闪烁,这会引起对屏幕的过多关注——但是每小时一次是可以接受的节奏。对于火车时间,由于布局的原因,快速全显示渲染比部分刷新效果更好。快速部分刷新会跨越元素,从而比全刷新更多地引起对刷新的注意。这可以通过更有目的地选择部分刷新矩形来改进,但是当前的解决方案效果很好。

框架很棘手,因为我想要一些漂亮的东西,但又不想倾家荡产。我不擅长木工,而且我也不想花费 300-500 美元,这是报价的范围(顺便说一句,多年来我一直试图为这些碎玻璃找到一种低成本的框架解决方案——如果你有任何想法,请告诉我)。由于连接电缆和驱动器,E-Ink 显示屏的尺寸很尴尬。显示屏表面也有一个看起来不错但不雅的边框,应该将其覆盖。在与几个框架制造商交谈后,其中一位建议我 购买定制的卡纸板。卡纸板可以隐藏显示屏、Raspberry Pi 和电缆,但更重要的是,卡纸板的外部尺寸正好适合标准尺寸的框架。

成品整齐地放在我们门边,在每天早晨的合适时间提供我们需要的确切信息。我之前写过关于“行为差距”的文章——人们实际做的事情与容易做到但有用的事情之间的差距。这个项目比这更复杂一些,但花费大约 20 个小时的工作时间,对我来说是值得的。我构建了一些可以解决日常需求的东西,我们实际上在使用它,客人会谈论它,而且它看起来很棒。

Home Next →587 Miles, 803 Meetings, and 14 Dates: My completely sane system for personal analytics

Comments hosted by Twitter

Click for discussion © Sam Broner 2025