基于树莓派与E-ink屏幕打造低功耗智能信息显示终端
1. 项目概述:为什么选择E-ink与树莓派?
如果你和我一样,对“通电就能一直显示,断电了画面还在”的电子墨水屏着迷,同时又想折腾点既实用又有趣的玩意儿,那么这个项目就是为你准备的。我把它叫做“Glance”——一个基于树莓派和E-ink屏幕的智能信息显示终端。它可以是你的桌面电子相框,每天自动更新一张来自云端相册的照片;也可以是一个信息看板,安静地展示你关心的比赛日程或待办事项。最关键的是,得益于E-ink屏幕近乎零功耗的显示特性和树莓派的低功耗设计,配合一块小小的电池,它能做到自动唤醒、工作、然后休眠,续航轻松超过两周,完全无需你操心开关。
为什么是E-ink?这得从它的工作原理说起。你可以把它想象成无数个微小的“墨水池子”(微胶囊),里面悬浮着带正电的白色粒子和带负电的黑色粒子。当施加一个电场时,相应的粒子就会被推到胶囊顶部,从而显示出黑色或白色。一旦粒子就位,即使撤掉电场,它们也会因为物理作用力而保持原位。这就是为什么E-ink屏幕只有在刷新画面时才耗电,显示静态内容时功耗几乎为零。这种“类纸”的观感,不发光、无闪烁,在强光下反而更清晰,让它成为了信息展示的绝佳载体,尤其适合那些需要长时间显示固定内容,又对功耗极其敏感的场景,比如电子价签、公交站牌,或者我们这个桌面终端。
而树莓派,作为最流行的开源硬件平台之一,则是驱动这个显示终端的“大脑”。它提供了完整的Linux环境、丰富的GPIO接口和强大的网络能力,让我们能够轻松地编写Python脚本,从互联网抓取数据、处理图像,并控制屏幕刷新。将这两者结合,我们就能创造出一个既智能又“省心”的设备。Glance项目就是一次具体的实践,我将带你从零开始,完成硬件组装、系统配置、软件部署到全自动运行的每一个步骤,并分享我在这个过程中踩过的坑和总结的经验。
2. 核心硬件选型与组装要点
2.1 硬件清单深度解析
一份清晰的物料清单是成功的一半。以下是构建Glance所需的核心部件,我会解释每个选择的理由和注意事项。
主控与显示核心:
- 树莓派 Zero W:这是我的首选。它体积小巧、功耗极低(空闲时约0.1A),且内置Wi-Fi和蓝牙,完美契合需要联网和便携性的项目。当然,任何型号的树莓派(3B+, 4B, 5)都能工作,但体积和功耗会相应增加。对于纯显示终端,Zero W的性能绰绰有余。
- Waveshare 7.5英寸黑白E-ink屏幕(带HAT):选择7.5英寸是因为它在信息量和桌面占用面积之间取得了很好的平衡。Waveshare的屏幕通常配套提供HAT(Hardware Attached on Top)驱动板,它直接插在树莓派的GPIO针脚上,省去了复杂的接线,对新手非常友好。务必确认型号支持你的树莓派(尤其是Zero的40针GPIO布局与老型号26针不同)。
供电与续航方案:
- PiSugar 2 Portable 电池模块:这是实现“无线”和“自动续航”的关键。PiSugar是专为树莓派Zero/Zero 2 W设计的电池扩展板,通过Pogo Pin(弹簧针)与Pi底部连接,不占用宝贵的GPIO引脚。它集成了电池管理、充放电电路,最重要的是,支持通过软件配置定时唤醒和休眠,这是我们实现自动化运行的硬件基础。对于树莓派3/4/5,你需要选择对应的PiSugar 2 Plus型号。
结构件与辅助材料:
- 3D打印外壳:我提供了前后盖的STL文件。外壳设计紧密包裹屏幕和主板,提供保护并提升美观度。打印时建议使用PLA材料,层高0.2mm,填充率20%即可保证强度。
- 2mm厚EVA泡棉:用于填充屏幕与后盖之间的空隙,起到缓冲和防震作用,避免屏幕玻璃被内部的连接器或PCB划伤。如果没有EVA,厚度相近的橡胶垫、毛毡甚至几层硬卡纸也能临时替代。
- M2.5x5mm螺丝:用于固定前后外壳。这种尺寸的螺丝在电子套件中很常见。
- 可选:5x7英寸相框:如果没有3D打印机,一个现成的相框是完美的替代方案。你需要手动制作一个内衬卡纸来固定屏幕,并将树莓派和电池用双面胶或魔术贴固定在相框背面。
注意:在采购屏幕和电池模块时,务必从官方或授权渠道购买。市面上有些兼容板或山寨电池可能存在驱动不完善、功耗高甚至安全风险。
2.2 精细化的组装流程与避坑指南
组装过程需要耐心和细心,尤其是对待脆弱的排线和屏幕。
第一步:打印与准备下载提供的STL文件进行3D打印。打印完成后,检查所有螺丝孔是否通畅,必要时可以用M2.5的螺丝刀手动通一下。清洁打印件上的支撑材料和碎屑。
第二步:核心模块集成
- 安装PiSugar电池:将PiSugar板对准树莓派Zero W底部的触点,轻轻按压直至听到轻微的“咔哒”声,表示Pogo Pin已连接稳固。确保电池板平整贴合,没有翘起。
- 安装E-ink HAT:将Waveshare屏幕的HAT驱动板,对准树莓派的40针GPIO排母,确保方向正确(通常HAT上的“GPIO”字样朝向树莓派的USB接口方向),然后垂直均匀用力按下。这是整个硬件连接的基础,务必一次插好,避免反复拔插损坏针脚。
第三步:屏幕总成处理这是最需要小心的一步。
- 连接屏幕排线:找到屏幕背面的FPC(柔性印刷电路)连接器。先轻轻抬起黑色的锁扣(通常是用指甲或塑料撬棒从一端挑起),使其处于解锁状态。然后将屏幕排线金色触点面向下,平稳地插入插槽底部。确认插到底后,再将黑色锁扣压回原位锁紧。这个动作要干脆,避免排线歪斜。
- 撕除保护膜:屏幕表面通常有一层透明的塑料保护膜,用于运输防刮。组装前一定要撕掉它!否则会严重影响显示效果,产生眩光,让E-ink在阳光下的可视优势荡然无存。撕膜后尽量避免用手直接触摸屏幕。
第四步:整机合盖
- 放入屏幕:将屏幕正面朝下,小心地放入3D打印的前壳中。因为外壳是精密拟合的,需要一点点调整角度,慢慢滑入,切忌使用蛮力。屏幕玻璃非常脆弱,边缘受力不均极易破裂。
- 粘贴缓冲泡棉:将裁剪好的EVA泡棉贴在屏幕背面(非显示面)的四周或中间凸起部位,目的是让后壳压上来时,力量由泡棉缓冲,而不是直接压在屏幕或排线接头上。
- 理线与合盖:将连接屏幕的排线顺着后壳的预留线槽小心弯折。这里有个关键技巧:排线喜欢被弯曲,但讨厌被反复弯折或扭曲。规划好一次性的弯曲路径,用一点胶带固定形状,然后让排线从后壳的开口穿出。最后将树莓派(已连接电池和HAT)放入后壳的卡位,将排线另一端插入HAT板上对应的座子(同样先开锁扣,再插入,最后锁紧)。
- 最终紧固:对齐前后壳,先用手压紧四周,检查是否有卡扣不到位或排线被挤压。确认无误后,用4颗M2.5螺丝在四角锁紧。螺丝不要拧得过紧,以免压裂塑料外壳。
如果使用相框方案,核心是做好内衬和固定。用硬卡纸制作一个“窗口”,让屏幕显示区域露出来,其余部分遮住。将屏幕用双面胶固定在卡纸上,再将卡纸嵌入相框。树莓派和电池可以用强力魔术贴固定在相框背板外侧,这样方便日后拆卸充电或调试。
3. 系统与驱动软件配置详解
硬件组装完毕,接下来是让硬件“活”起来的软件部分。我们需要为树莓派安装操作系统,并配置好电池管理和屏幕驱动。
3.1 树莓派操作系统初始化
下载与烧录:前往树莓派官网下载最新的Raspberry Pi OS Lite (32-bit)版本。对于Glance这种无头(无显示器直接操作)服务器应用,Lite版本没有图形界面,更轻量,启动更快,功耗也更低。使用Raspberry Pi Imager这款官方工具进行烧录最省心。插入Micro SD卡,打开Imager,选择操作系统 -> Raspberry Pi OS (other) -> Raspberry Pi OS Lite (32-bit),选择你的SD卡,然后点击“烧录”。
关键预配置:在烧录前,Imager有一个隐藏的高级功能(按Ctrl+Shift+X打开),务必在这里进行以下设置,这能省去第一次启动后接显示器键盘的麻烦:
- 启用SSH:勾选“启用SSH”,设置密码认证。这样你就可以通过网络远程登录树莓派。
- 配置Wi-Fi:填写你的家庭Wi-Fi SSID和密码,并选择国家代码(如CN)。
- 设置主机名和用户:可以设置一个易记的主机名,如
glance-pi。默认用户是pi,建议设置一个强密码。 - 配置本地化:设置时区(Asia/Shanghai)。 完成这些设置后再烧录,树莓派首次启动后就会自动连接Wi-Fi并开启SSH。
首次启动与远程登录:将SD卡插入树莓派,上电启动。等待一分钟后,在你的电脑上,使用SSH客户端(如Windows的PowerShell或CMD,macOS/Linux的终端)连接。命令格式为:
ssh pi@glance-pi.local(如果你设置了主机名)或ssh pi@<树莓派的IP地址>。输入密码后,你就进入了树莓派的命令行界面。
3.2 PiSugar电池管理软件配置
PiSugar的强大功能需要通过其软件来实现。
- 启用I2C接口:电池电量读取、按钮控制等功能依赖于I2C总线。在树莓派终端执行
sudo raspi-config,选择Interface Options->I2C,确认启用。退出后重启:sudo reboot。 - 一键安装管理软件:重新SSH登录后,运行PiSugar官方提供的一键安装脚本:
curl -L https://cdn.pisugar.com/release/pisugar-power-manager.sh | sudo bash注意:直接从官方源获取安装命令是最安全可靠的做法,可以避免因教程过期导致的安装失败。安装过程中会提示你设置Web管理界面的用户名和密码,务必牢记。
- 验证与访问:安装完成后,在同一网络下的电脑浏览器中,访问
http://<树莓派IP地址>:8421,用刚才设置的账号密码登录。你将看到一个仪表盘,显示当前电池电量、电压等信息。在这里,你可以后续设置定时唤醒和自定义按钮功能。
3.3 Waveshare E-ink屏幕驱动安装
不同型号的Waveshare屏幕驱动安装方式高度相似,但务必以你购买产品页面提供的Wiki为准。
- 启用SPI接口:E-ink屏幕通过SPI总线通信。在终端运行
sudo raspi-config,选择Interface Options->SPI,确认启用。 - 安装驱动库:通常,Waveshare会提供Python库。可以通过pip安装通用库,但最稳妥的方法是下载针对你屏幕型号的示例代码包。例如,对于7.5英寸HAT,你可以在其产品Wiki页找到Git仓库链接或直接下载ZIP包。通常安装命令类似:
sudo apt-get update sudo apt-get install python3-pip python3-pil python3-numpy git clone https://github.com/waveshare/e-Paper.git cd e-Paper/RaspberryPi_JetsonNano/python sudo pip3 install -r requirements.txt - 运行测试程序:进入对应屏幕尺寸的示例目录,例如
cd examples,然后运行一个测试程序,如python3 epd_7in5_test.py。如果屏幕能正确显示测试图像(如黑白棋盘、文字),则证明驱动和硬件连接成功。
4. Glance应用部署与个性化定制
核心硬件和底层驱动就绪后,现在来部署我们的主角——Glance应用。
4.1 获取与初始化Glance
- 下载代码:在树莓派终端中,克隆项目仓库到合适的位置,比如用户主目录:
如果网络不畅,也可以先在电脑上下载ZIP包,然后通过SFTP工具(如FileZilla)上传到树莓派的cd ~ git clone https://github.com/Numellow/glance.git~目录下并解压。 - 安装Python依赖:Glance是一个Python应用。进入其源码目录并运行安装脚本:
这个脚本会自动安装所需的Python库,如cd glance/src bash setup.shPillow(图像处理)、requests(网络请求)、google-api-python-client(访问Google相册)等。
4.2 配置文件详解与个性化设置
Glance的行为由两个配置文件控制:glance.conf和album.conf。它们位于glance/src目录下。
glance.conf - 主应用配置用文本编辑器(如nano glance.conf)打开,你会看到类似以下内容:
[glance] page = 1 has_pi_sugar = True numofapps = 2page:这是最重要的设置,决定启动时显示哪个应用。0代表显示Instructables竞赛看板,1代表显示照片相册。你可以根据喜好修改。has_pi_sugar: 如果你使用了PiSugar电池模块,保持True,这样界面右上角会显示电池电量图标。如果没用,设为False。numofapps: 当前应用总数,默认是2,除非你后续自己开发了新应用。
album.conf - 相册应用配置如果你使用相册功能,需要配置这个文件:
[album] url = https://photos.app.goo.gl/你的共享相册链接 should_download = True schedule_download = True download_day = sundayurl: 填入一个公开的Google相册共享链接。如何获取?在Google相册网页版或App中,选择相册 -> 点击“共享” -> 创建链接 -> 复制链接。should_download: 是否从网络下载相册。设为True。schedule_download: 是否按计划下载(仅每周一次)。设为True可以节省流量和电量,相册内容不常更新时推荐。download_day: 计划下载的日期,如sunday。
重要提示:关于Google相册API:由于Google相册API的变更,直接使用公开链接可能在新版库中需要更复杂的OAuth认证。项目源码中可能已包含一个简单的解析方法。如果遇到权限错误,一个更稳定的备用方案是:将
should_download设为False,然后手动将你想展示的图片(确保尺寸和格式合适,如800x480的PNG或JPG)放入glance/src/static/album/目录下。Glance会自动读取这个文件夹里的图片。
4.3 手动测试运行
在自动化之前,先手动运行一次,确保一切正常。
cd ~/glance/src python3 glance.py程序会开始运行。如果是相册模式,它会先尝试下载或读取本地图片,然后进行图像处理(转换为E-ink适用的1位位图),最后刷新屏幕。整个过程可能需要几十秒。如果屏幕成功刷新并显示了内容,恭喜你,软件部分基本成功了!如果卡住或报错,请检查:
- 网络连接是否正常(对于需要下载的应用)。
- 屏幕驱动是否安装正确,SPI是否启用。
- 配置文件路径和格式是否正确。
- 查看终端输出的错误信息,这是排查问题的第一手资料。
5. 实现全自动运行:定时唤醒与任务调度
让设备完全自主运行,是提升体验的关键。这需要解决两个问题:如何定时启动?和启动后如何自动执行任务并关机?
5.1 创建自动化任务脚本
Glance项目中已经提供了一个startup.sh脚本模板。我们需要编辑它,指定正确的路径并理解其逻辑。
#!/bin/bash # 切换到Glance应用所在目录 cd /home/pi/glance/src # 运行主程序 python3 glance.py # 等待15分钟,给予足够的时间完成数据获取、图片处理和屏幕刷新 sleep 900 # 执行关机命令 sudo shutdown -h now用编辑器打开它:nano ~/glance/src/startup.sh。将cd后面的路径修改为你实际存放glance/src的绝对路径。例如,如果你克隆到了/home/pi下,那么路径就是/home/pi/glance/src。
这个脚本的逻辑很清晰:运行Glance,等待任务完成(留足15分钟余量),然后关机。等待时间(900秒)可以根据你实际网络速度和图片处理耗时进行调整。
5.2 配置系统启动自执行
我们需要让树莓派在启动时自动运行这个脚本。传统的方法是修改/etc/rc.local文件。
- 编辑rc.local文件:
sudo nano /etc/rc.local - 在
exit 0这一行之前,添加以下内容:# 等待一段时间,确保系统服务(特别是网络)完全启动 sleep 25 # 以pi用户身份在后台运行启动脚本,并将输出重定向到日志文件便于调试 sudo -u pi bash /home/pi/glance/src/startup.sh >> /home/pi/glance.log 2>&1 &sleep 25:非常重要!给系统留出时间连接Wi-Fi。如果网络没准备好,需要联网下载数据的应用就会失败。sudo -u pi:指定以pi用户身份运行,避免权限问题。>> /home/pi/glance.log 2>&1:将脚本的标准输出和错误输出都追加到glance.log文件中。当设备自动运行出错时,这是你排查问题的生命线。&:让脚本在后台运行,不阻塞系统启动过程。
- 保存并退出(在nano中按Ctrl+X,然后按Y确认,再按Enter)。
实操心得:
rc.local并不是现代Linux系统管理服务的最佳方式,但对于这种简单的单次启动任务,它足够直接有效。更规范的做法是创建一个systemd服务单元,可以更好地管理日志、依赖关系和重启行为。但对于初学者,rc.local更易于理解和调试。
5.3 配置PiSugar定时唤醒
这是实现“每日自动开机”的魔法所在。我们需要在PiSugar的Web管理界面中设置。
- 在电脑浏览器打开PiSugar管理页面:
http://<树莓派IP>:8421。 - 登录后,找到“Schedule Wake Up”或“定时唤醒”功能。
- 将开关切换到“Enabled”。
- 设置你希望设备每天唤醒的时间,例如早上8:00。
- (可选)点击“Repeat”或重复设置,可以选择只在特定的星期几唤醒,比如工作日。
- 强烈建议:同时配置“Safe Shutdown”功能。设置一个电压阈值(例如3.2V),当电池电压过低时,PiSugar会主动发送关机命令给树莓派,防止电池过放损坏。
- 保存设置。
现在,整个自动化链条就形成了:每天早8点,PiSugar会准时给树莓派上电 -> 树莓派启动,执行rc.local->rc.local调用startup.sh->startup.sh运行glance.py更新屏幕 -> 等待15分钟后自动关机。设备进入深度休眠,直到第二天再次被唤醒。
5.4 利用PiSugar按钮实现交互
PiSugar板载了一个物理按钮,我们可以赋予它实用功能。比如,实现手动切换应用。
- 在PiSugar Web界面,找到“Button Setting”或“按键设置”。
- 找到“Single Tap”(单击)的配置项。
- 在下拉菜单中选择“Custom”(自定义)。
- 在命令输入框中填入:
(请根据你的实际路径修改)python3 /home/pi/glance/src/next_app.py - 保存。
现在,在设备运行(屏幕刷新完成后,关机倒计时内)时,短按一下这个按钮,它就会执行next_app.py脚本。这个脚本的作用是修改glance.conf文件中的page值,在当前应用间循环切换。下次Glance启动时,就会显示另一个应用了。这为静态设备增加了一点动态的交互乐趣。
6. 故障排查与进阶优化指南
即使按照步骤操作,也可能会遇到问题。这里汇总了一些常见情况及解决方法。
6.1 常见问题速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 屏幕无任何反应,全白或全黑 | 1. 电源未接通或电压不足。 2. 屏幕排线未插好或损坏。 3. SPI驱动未启用或损坏。 4. HAT与GPIO接触不良。 | 1. 检查PiSugar电池是否有电,或尝试用USB线直接给树莓派供电。 2.重点检查:关闭电源,重新拔插屏幕两端的排线,确保锁扣扣紧。 3. 运行 ls /dev/spi*,查看是否有spidev0.0和spidev0.1设备节点。如果没有,在raspi-config中重新启用SPI并重启。4. 重新拔插HAT与树莓派的连接。 |
| SSH无法连接 | 1. Wi-Fi配置错误或信号弱。 2. SSH服务未启用。 3. IP地址不正确。 | 1. 检查SD卡根目录下的wpa_supplicant.conf文件(如果使用Imager预配置)或通过显示器直接查看网络状态。2. 在SD卡根目录创建一个名为 ssh的空文件(无后缀),可强制开启SSH。3. 在路由器管理界面查看树莓派的DHCP分配地址,或使用网络扫描工具(如 Advanced IP Scanner)查找。 |
| Glance运行时报错(如导入错误) | 1. Python依赖库未安装完整。 2. 配置文件路径或格式错误。 3. 网络问题导致API调用失败。 | 1. 进入glance/src目录,重新运行bash setup.sh或手动pip3 install -r requirements.txt。2. 仔细检查 glance.conf和album.conf的语法,确保没有多余空格或中文符号。3. 运行 ping google.com测试网络。对于相册应用,尝试将should_download设为False,并手动放置图片到static/album文件夹测试。 |
| 自动唤醒不工作 | 1. PiSugar软件未正确安装或运行。 2. 定时唤醒设置未保存或时间错误。 3. 电池完全耗尽。 | 1. 通过Web界面 (http://<IP>:8421) 能否访问?不能则重新运行安装脚本。2. 登录Web界面,确认定时唤醒已启用且时间设置正确。检查系统时区是否为 Asia/Shanghai。3. 连接充电器为电池充电,PiSugar在电池电压极低时可能无法响应。 |
| 自动关机不执行 | 1.rc.local脚本未正确添加或路径错误。2. startup.sh脚本权限不足或执行错误。3. 在关机等待期间手动取消了关机。 | 1. 检查/etc/rc.local文件中的命令路径是否正确,尤其是sleep和脚本路径。2. 为 startup.sh添加执行权限:chmod +x startup.sh。查看日志文件/home/pi/glance.log获取错误信息。3. shutdown -c命令可以取消关机。确保在测试期间不要运行它。 |
| 屏幕刷新后有残影 | E-ink屏幕特性,长时间显示静态图像后可能留下上一帧的“鬼影”。 | 这是电子墨水屏的普遍现象,称为“残影”。解决方案是在代码中定期(如每24小时或每次更新前)执行一次“全刷”或“清屏”操作。Waveshare的驱动库通常提供Clear()函数。可以在glance.py的主循环里,每隔若干次正常刷新后,调用一次epd.Clear()来彻底清除残影。 |
6.2 性能与功耗优化技巧
- 禁用不必要的服务:树莓派OS Lite版本已经比较精简,但还可以进一步优化。例如,禁用蓝牙(如果你不用):
sudo systemctl disable hciuart。禁用HDMI输出(对于无头运行):在/boot/config.txt末尾添加hdmi_blanking=1和hdmi_ignore_edid=0xa5000080。 - 降低CPU频率:对于Glance这种轻量级应用,不需要树莓派全速运行。可以设置固定的低频率以省电。编辑
/boot/config.txt,添加arm_freq=600(将CPU频率锁定在600MHz)。务必在设置前用vcgencmd measure_clock arm查看当前频率,选择一个稳定且够用的值。 - 优化SD卡写入:频繁的日志写入会缩短SD卡寿命并增加功耗。可以将日志文件挂载到内存盘(tmpfs),或者直接禁用某些服务的日志。对于我们的
glance.log,如果不需要长期保留,可以定期清理或仅在调试时开启。 - 精细控制刷新:E-ink屏幕全屏刷新一次耗电较多。优化你的应用,只刷新需要变化的区域(如果驱动支持局部刷新)。对于相册应用,确保图片已经预处理为与屏幕分辨率一致,避免在树莓派上进行耗时的缩放计算。
6.3 扩展思路:开发你自己的“App”
Glance的架构设计使得添加新应用变得相对简单。每个“App”本质上是一个Python模块,放在src/pages/目录下。模块需要实现一个draw函数,该函数接收屏幕对象(epd)和配置信息,负责在PIL图像对象上绘制内容,最后调用epd.display()。
例如,你可以创建一个weather.py,从天气API获取数据,然后绘制温度和图标;或者创建一个calendar.py,显示今天的日历事项。核心步骤是:
- 在
src/pages/下新建your_app.py。 - 实现
draw(epd, config)函数。 - 在
glance.py的主应用列表里注册你的新应用。 - 更新
glance.conf中的numofapps值。
这为项目提供了无限的扩展性,你可以将它打造成专属的新闻头条显示器、股票看板、智能家居控制中心,或者仅仅是下一首诗的展示窗。
整个项目从硬件拼装到软件调优,是一次非常完整的嵌入式开发与物联网应用实践。它涉及了硬件接口、Linux系统管理、Python编程、网络API调用和电源管理等多个层面。最关键的是,你得到了一个独一无二、真正实用的智能设备。当它每天清晨悄然亮起,为你展示一张新的风景或提醒你今天的任务时,那种由自己亲手创造的满足感,是任何成品设备都无法给予的。
