E-Ink Smart Dashboard
这是一个基于树莓派和 2.9 寸电子墨水屏(E-Ink)打造的智能桌面仪表盘项目。该项目旨在为耐力运动爱好者提供一个低功耗、全天候的信息展示窗口。核心采用 Python 编写驱动,利用 Flask 在局域网内构建 Webhook 服务,实现了与 n8n 自动化工作流及 DeepSeek 大模型的深度集成。
系统包含五大功能视图:实时天气与 AQI 监测、由 DeepSeek 生成的个性化户外运动建议、Strava 近期运动数据同步、支持农历显示的公历月历,以及集成实时天气图标的极简时钟。在交互设计上,项目利用 GPIO 连接物理按键,实现了“单击循环翻页”与“双击主动触发数据刷新”的便捷操作。这是一个融合了 IoT 硬件控制、API 数据聚合与 AI 内容生成的极客 DIY 解决方案,完美兼顾了实用性与桌面美学。
E-Ink Smart Dashboard
这是一个基于 Raspberry Pi 和 E-Ink(电子墨水屏)的智能桌面仪表盘项目。它通过 Python 控制屏幕显示,并通过 Flask 运行一个本地 Web Server 接收来自 n8n 的数据推送。
该项目专为 2.9寸 E-Ink 屏幕 设计,集成了天气、AI 建议、运动数据(Strava)、时钟和农历日历功能。
✨ 主要功能
系统包含 5 个主要页面,通过物理按键循环切换:
- P1 - 天气概览:
- 显示当前位置、AQI 指数、本机 IP 地址。
- 未来 5 天天气预报(图标、中文描述、高低温)。

- P2 - AI 建议 (DeepSeek):
- 显示由 n8n 集成 DeepSeek 生成的户外运动/生活建议。
- 支持中文自动换行排版。

- P3 - 运动记录 (Strava):
- 显示最近 5 条 Strava 运动记录。
- 包含日期、运动类型(跑/骑)、距离和时长。

- P4 - 极简时钟:
- 大字体时间显示。
- 完整日期(公历)、实时天气图标、气温及 AQI。
- 逻辑优化:每分钟自动刷新,且会对齐到下一分钟的第 01 秒唤醒。

- P5 - 日历 (公农历):
- 当月公历日历。
- 集成农历(初一、十五、节气等)显示。
- 高亮显示“今天”。

🛠️ 硬件与环境要求
- 硬件:
- Raspberry Pi (Zero W / 3B / 4B)
- E-Ink Display (需支持
epd_driver) - 物理按键 (连接至 GPIO 21)
- 软件:
- Python 3.x
- Raspberry Pi OS
📦 安装与依赖
安装 Python 库:
pip install flask pillow gpiozero requests zhdate- 驱动程序:
确保项目目录下包含微雪屏幕驱动文件: epd_driver.py(或对应的型号驱动模块)epdconfig.py- 字体文件:
项目严重依赖特定字体,请确保以下路径存在字体文件,或在代码配置区修改路径: - DejaVuSansMono-Bold.ttf: 通用西文/数字
- weather.ttf: 天气图标字体 (映射关系见代码
WEATHER_ICONS) - wqy.ttc: 文泉驿微米黑 (支持中文显示)
- digital.ttf: 电子表风格字体 (用于时钟页)
⚙️ 配置说明
在 main.py 的头部配置区修改以下变量:
# 字体路径
FONT_PATH = '/path/to/your/font.ttf'
CN_FONT_PATH = '/path/to/wqy.ttc'
# ... 其他字体
# 硬件引脚
BUTTON_PIN = 21
# n8n Webhook 地址 (用于双击主动刷新)
N8N_WEBHOOK_URL = "https://yoursite.com/webhook/refresh_weather"
🎮 操作说明
- 单击 (Single Click): 切换到下一页 (P1 -> P2 -> ... -> P5 -> P1)。
- 双击 (Double Click):
- 屏幕跳转至 AI 页 并显示 "正在呼叫 n8n..."。
- 后台向
N8N_WEBHOOK_URL发送请求。 - n8n 处理完毕后,通过 API 将最新数据推回树莓派,屏幕自动刷新。
🔌 API 接口 (供 n8n 调用)
树莓派会在端口 5000 启动 Flask 服务,接收数据推送。
1. 更新天气与数据 (POST /weather)
这是核心数据接口,n8n 流程跑完后应调用此接口。
Endpoint: http://<RPI_IP>:5000/weather
Payload (JSON):
{
"location": "Shanghai",
"aqi": {
"val": "45",
"level": "优"
},
"forecast": [
{
"day": "Mon",
"date": "10/21",
"icon": "01d", // OpenWeatherMap icon code
"high": 24,
"low": 18,
"desc": "晴"
},
// ... 更多天数 (共5天)
],
"strava": [
{
"day": "Sun",
"date": "10/20",
"type": "跑",
"dist": "15.0",
"time": "1h20m"
}
// ... 更多记录
],
"ai_msg": "今天天气适合LSD训练,建议心率控制在140以下。" // DeepSeek 生成的内容
}
2. 简单消息推送 (POST /webhook)
用于简单的调试或状态通知。
Endpoint: http://<RPI_IP>:5000/webhook
Payload:
{
"msg": "Hello World"
}
📂 目录结构建议
/home/zack/eink-monitor/
├── main.py # 主程序
├── epd_driver.py # 屏幕驱动
├── epdconfig.py # 底层引脚配置
├── digital.ttf # 字体资源
├── weather.ttf
├── wqy.ttc
└── assets/ # 其他资源
🚀 运行
推荐使用 systemd 或 supervisor 守护进程运行,确保开机自启。
手动运行:
python3 main.py
若要在无屏幕硬件的环境下测试逻辑(Simulation Mode),脚本会自动检测导入错误并进入模拟模式(需自行修改代码中的 sys.exit() 逻辑以允许模拟运行)。
Author: Zack
Last Updated: 2026-01-23