
最近把一块吃灰很久的电子墨水屏翻了出来给它加上了 Wi-Fi 模块做成了一个能自动更新天气和日程的信息面板。整个过程走下来踩了不少坑也理顺了很多之前一知半解的东西。这篇就聊聊这个 Wi-Fi 电子纸项目的完整思路从硬件选型到网络配置再到数据上屏给想自己动手的朋友一个能直接参考的路线。这个项目做出来能干什么简单说就是一块低功耗的“电子纸屏幕”通过 Wi-Fi 定期拉取网络数据显示天气、日历、待办事项、股票价格、RSS 摘要甚至是谁按了门口的门铃。它和手机、平板的最大区别在于电子纸本身不发光靠反射环境光显示静态画面几乎不耗电一块电池能撑几个月。所以它特别适合做那种“摆在桌上、挂在墙上、需要长期显示但不需要频繁操作”的信息设备。适合谁来参考想入门嵌入式联网开发的朋友或者已经在玩 ESP32、想给项目加一块低功耗屏幕的开发者。1. 项目整体设计与思路拆解1.1 到底解决什么问题我一开始在纸上列需求的时候写了这么几条桌面信息牌、天气站、电子相框、To-Do 展示。说白了就是不想每次看天气、看日程都掏手机想要一个“一抬头就能看到”的固定信息源。手机虽然方便但它会打扰你通知一响你就得解锁解锁了就容易刷半天。电子纸完全没有这个问题它不会主动发光、不会弹通知安安静静待在那里。但电子纸单个器件是不具备联网能力的传统电子纸模组就是一个显示面板需要主控芯片通过 SPI 或并行接口给它发数据。要让电子纸“活”起来就必须给它配一颗带 Wi-Fi 能力的主控芯片让屏幕成为 IoT 系统里的一个输出终端。这个“主控 屏 网络”的组合本质上就是一个微型物联网节点。1.2 方案选型时我在想什么选型有几条路我对比了一下方案优点缺点适用场景ESP32 经典版 裸屏模组成本低、资料多、性能够用需要自己接线、自己处理电源和外壳大多数 DIY 项目ESP32-S3 定制 PCB性能强、可做低功耗优化打板周期长、调试复杂产品原型M5Stack Paper集成度高、屏幕和主控一体化价格偏高、外形固定快速原型、不想折腾硬件的人Raspberry Pi 墨水屏生态强大、支持复杂渲染功耗高、体积大、启动慢需要跑完整 Linux 的复杂应用我最后选了 ESP32 经典版加一块 7.5 寸三色电子纸模组。原因有三一是 ESP32 的 Wi-Fi 协议栈非常成熟配网、断线重连的代码都有现成库二是我手里正好有现成的模组三是我需要一个“能快速做出来并且挂在墙上不丑”的方案7.5 寸的分辨率 800x480显示版式有足够的发挥空间。这里的核心权衡在于要不要用 Linux 方案比如树莓派加墨水屏。树莓派确实能让渲染变得非常轻松你有完整的字体库、图形库甚至能在屏上画图表。但它的功耗是 ESP32 的几十倍而且每次开机要几十秒完全违背了“低功耗信息面板”的初衷。ESP32 虽然渲染能力弱但它有一招杀手锏深度休眠。平时不刷新的时候整机电流可以压到几十微安只有定时醒来拉数据刷新完再睡过去。这样的设备才能真正做到“挂墙上几个月不用管”。2. 硬件选型与物料搭配2.1 电子纸屏怎么选电子纸屏有几个关键参数尺寸、分辨率、颜色数、刷新方式。我这次用的 7.5 寸三色屏黑白红分辨率 800x480。三色屏的好处是能高亮重点信息比如温度低于某个值就用红色显示日历上的截止日期用红色标注视觉层次一下子就有了。但代价是刷新时间明显比黑白屏长三色刷新一次大概要 15 到 20 秒黑白屏通常只要 2 到 3 秒。所以如果你的应用对刷新速度敏感选黑白屏更合适。屏幕的驱动 IC 也要注意。同样标称是 7.5 寸 800x480 的屏不同批次可能用不同的驱动芯片常见的有 UC8179、SSD1681、IL0398 这些。驱动 IC 的差异会直接影响初始化寄存器的配置序列你拿到的例程如果和你的芯片版本对不上大概率白屏或者花屏。买屏的时候一定问清楚商家用的是哪颗主控芯片最好让商家提供对应的驱动例程这一条能帮你省下好几天排查时间。2.2 主控板和电源设计主控我用的是 ESP32 DevKitC 开发板自带 USB 转串口芯片方便烧录和调试。如果你要做得更小可以考虑 ESP32-Mini 或者 ESP32-C3 的小模块但新手建议用带排针的开发板因为调试的时候你需要频繁接杜邦线模块化会方便很多。供电方案上我试过两种一种是 USB 供电省心但没法体验“低功耗摆放”的乐趣另一种是 18650 锂电池加一个充放电一体模块比如 TP4056 加升压板。电池方案需要给 ESP32 做深度休眠用定时器唤醒。这里有一个细节ESP32 的深度休眠电流大概是 10 微安级别但你的开发板上的 USB 转串口芯片比如 CP2102会额外吃掉几毫安电流所以如果你要低功耗要么选不带 USB 芯片的裸模块要么在电路上把 USB 芯片的供电切断。屏幕的功耗也要算一笔账。7.5 寸三色屏刷新瞬间峰值电流大概在 30 到 60 毫安平常不刷新的时候几乎不耗电。整套系统如果按“每小时刷新一次、每次刷新 20 秒”来算平均电流大概只有 1 到 2 毫安一块 2000mAh 的电池理论上能用一两个月。这个续航水平是手机完全没法比的。2.3 外壳与结构件的思路要做成能摆上桌或挂上墙的设备外壳是绕不开的一步因为电子纸“裸露”着极其容易碰坏。屏幕的柔性排线非常脆弱弯折角度稍微大一点就可能断线屏幕边缘也容易被磕碰出无法修复的亮点。我的做法是先用 CAD 软件画一个前后面板前面板留出屏幕显示区域的窗口后面板挖出走线的凹槽然后用 3D 打印出来。如果你手头没有 3D 打印机也可以在电商平台买现成的相框把屏幕和主控板用双面胶固定在相框背板上这是成本最低的“外壳方案”。相框方案操作下来实际效果还挺好的因为相框本身就是为“摆放”设计的正面有透明亚克力挡板还能防尘。3. 软件与固件架构从点亮到联网3.1 先用官方例程点亮屏幕拿到屏和主控之后第一件事不是写联网逻辑而是老老实实跑一遍屏幕驱动例程确保你的接线和硬件是通的。我强烈建议你测完例程再动手改装因为如果一开始就混合了网络代码一旦出了问题很难定位是屏幕问题还是网络问题。接线其实特别简单绝大多数电子纸模组都是标准 SPI 接口SCLK→ ESP32 的 GPIO 18MOSI→ ESP23 的 GPIO 23CS→ GPIO 5DC数据/命令选择→ GPIO 17RST→ GPIO 16BUSY→ GPIO 4注意不同厂家的引脚顺序可能不一样以你屏上的丝印为准。ESP32 的 SPI 引脚不是随便接的默认走硬件 SPI 的 VSPI 接口但大部分库都允许你通过软件模拟 SPI 任意改引脚所以如果默认冲突了可以挪。某次我接好线后跑官方例程屏幕一直白屏后来用示波器量发现 MOSI 上没有数据信号。排查了半天发现是杜邦线松了。杜邦线接触不良是 DIY 电子纸项目排名第一的故障源有条件的话直接买那种带锁扣的杜邦线或者干脆做一块转接板。3.2 固件业务逻辑状态机比顺序执行更稳点亮屏幕之后就到了固件架构设计的环节。很多人习惯写一个从上到下的顺序流程初始化 → 连接 Wi-Fi → 拉数据 → 解析 → 刷新屏幕 → 休眠。这种写法没问题但它不抗干扰。一次网络请求超时整个设备就卡死在连接状态屏幕不刷新系统也无法进入休眠电池很快就耗干。我最后用的是状态机架构把固件拆成几个状态BOOT硬件初始化读取配置WIFI_CONNECT连接路由器超时则直接跳到 SLEEP等下一次唤醒FETCH_DATA用 HTTP 拉取 JSON 数据失败则用上次缓存的数据RENDER生成位图数据写入屏幕SLEEP进入深度休眠让 RTC 定时器在 N 分钟后唤醒这个架构最大的好处是每个状态都有超时退出路径任何一个环节卡住系统最终都会回到 SLEEP不会因为一次网络故障就变成“砖头”。3.3 渲染管线把文字变成屏幕像素电子纸屏幕本质上是一块“只能画位图”的显示器你没办法像 HTML 那样铺文字、排版。所以一切文字和图形都要在代码里先渲染成像素点阵再传给屏幕驱动。我在 ESP32 上用了U8g2这个库它对单色屏幕支持特别好内置了多套字体从 6x8 的迷你字体到 24x24 的中文字体都有。中文字体是需要注意的U8g2 自带的几套中文字符集不够大GB2312 的全量字体文件随便就是几百 KB而 ESP32 的 Flash 虽然有几 MB但你还要留空间给固件和缓存。做法有两种一是只加载你需要的几十个汉字子集二是直接用字库生成工具裁剪。这个“渲染管线”是整个项目里最考验耐心的部分因为你看不到中间过程只能反复烧录、反复刷新屏幕验证。4. 配网与网络连接最容易翻车的一个环节4.1 配网方式选哪种Wi-Fi 联网的第一步是让设备知道该连哪个热点、密码是多少。“配网”这个动作看起来简单但用户体验差别很大。我整理了几种常见配网方式配网方式原理优点缺点硬编码在固件里代码里写好 SSID 和密码最简单适合固定环境换网络就要重新烧录SmartConfig / ESP-Touch手机 App 通过 UDP 广播包把 Wi-Fi 信息发给设备不用输密码到设备上依赖 App部分路由器组播隔离会导致失败SoftAP 热点配网设备自己发出一个热点手机连上后通过网页或 App 提交路由信息兼容性最好、最直观实现代码量稍大WPS 按钮配对路由器按 WPS 键设备自动配对无需输入密码很多路由器默认关闭 WPS我推荐SoftAP 配网理由很简单它不依赖任何第三方 App设备启动后自己开一个名为e-paper-config的 AP手机连上去之后打开浏览器输入 192.168.4.1在网页上填好家里的 Wi-Fi 名称和密码然后设备保存配置并重启。整个流程下来 30 秒都不到而且逻辑非常清晰出问题也容易排查。4.2 网络连接诊断当你连不上时该怎么办配网只是第一步真正折磨人的是“看起来配好了但设备死活连不上”。这里把排查思路缕一缕以后遇到任何物联网设备连不上网的问题都按这个顺序排查。先看基础连接。设备上电后它要完成“扫描热点 → 关联 AP → 获取 IP 地址”三个阶段。如果你在串口日志里看到反复出现Wi-Fi disconnected那基本是信号问题或者密码问题。我遇到过一种情况ESP32 放在路由器旁边信号满格但一直连接失败后来发现是路由器开了“5G 优先”功能而 ESP32 的 2.4GHz 频段被挤到角落。所以记住一个重点绝大多数物联网芯片只支持 2.4G Wi-Fi你的路由器就算支持双频也一定要开启“2.4G 兼容”或者关闭“双频合一”。再查IP 获取与路由。如果日志显示关联成功但一直拿不到 IP那多半是 DHCP 问题。可以用最简单的“固定 IP”模式来验证在代码里给设备手动指定一个和路由器同网段的静态 IP。如果手动指定 IP 能正常通信说明 DHCP 服务有问题这时候大概率是路由器本身的问题重启路由或检查 DHCP 地址池。最后查出网能力。设备拿到 IP 不代表能上网。很多路由器默认开启了“客户端隔离”AP 隔离设备虽然能连上路由器但访问不了外网。排查这个很简单让 ESP32 先去 ping 一下网关 IP如果能通但访问不了互联网就去检查路由器的 DNS 设置或者防火墙规则。4.3 说一个真实的“本地热点”翻车场景我在配网调试的时候遇到过一个很典型的场景附近找不到可用路由器就想用笔记本电脑开一个临时热点来测试结果系统弹出了“无法设置移动热点因为你的电脑未建立以太网、Wi-Fi 或手机网络数据连接”的提示。这个提示的意思是Windows 的移动热点功能依赖网卡建立了一个“托管网络”如果当前网卡没有接管任何可用网络连接热点就开不起来。这个问题的根源是电脑自身的网络栈没有形成一条完整的链路而不是配置本身错了。解决思路其实是通用的网络故障排查先确认电脑当前是否已经通过有线或者 Wi-Fi 连上互联网然后在设备管理器里把无线网卡“禁用再启用”重置网卡状态让系统重新初始化网络栈然后是检查“WLAN AutoConfig”服务是否被禁用。这些步骤做完之后再尝试开启热点基本上就能解决。反过来如果电脑本身没有可用的上网连接那就别纠结热点功能了直接用手机开热点或者把设备拿到路由器旁边测试别让环境限制卡住项目本身。这件事给我最大的启发是任何网络问题都遵循“先物理层、再链路层、再网络层”的排查顺序。不管是电脑开热点失败还是 ESP32 连不上路由追问“底层的连接链路在哪一步断了”永远比瞎试配置靠谱。4.4 断线重连与 Wi-Fi 稳定性策略Wi-Fi 模块是出了名的“不稳定”尤其当你的设备放在角落、隔着两堵墙的时候。ESP32 的默认行为是连接失败后重试 5 次然后放弃。这对需要长期稳定运行的信息面板来说远远不够。我在固件里做了三件事来提升稳定性。第一失败后指数退避重连第一次失败等 1 分钟第二次等 2 分钟第三次等 4 分钟最长不超过 30 分钟。这样避免设备疯狂扫描导致路由器暂时封禁。第二信号强度监控每 10 次成功刷新记录一次 RSSI如果信号低于 -80dBm就通过屏幕上的一个小图标提示“Wi-Fi 弱”提醒我可能需要加一个中继。第三看门狗兜底硬件看门狗 5 分钟喂一次如果网络堆栈跑飞看门狗自动重启设备保证设备不会“假死”。5. 数据拉取与屏幕渲染全流程5.1 数据源和 API 选择我的信息面板需要天气、日历和待办事项所以我一共接了两个数据源天气数据用 OpenWeatherMap 的免费 API每天可以免费调用 1000 次够用。请求 URL 长这样http://api.openweathermap.org/data/2.5/weather?qShenzhenappid你的keyunitsmetric日历和待办我自己在服务器上托管了一个简单的 JSON 文件ESP32 通过 HTTP GET 去拉取格式自定义。好处是灵活改服务器数据就等于改屏幕内容不用重新烧录。关于 API Key 有一个坑把 Key 硬编码在固件里一旦固件丢到网上就泄露了。我的做法是让服务器端做一个代理接口ESP32 只请求我自己的服务器服务器再去请求天气 API这样即使固件泄露第三方拿到的也只是我服务器的地址拿不到 API 密钥。5.2 数据格式解析与内存管理ESP32 的内存只有 520KB 的 SRAM7.5 寸三色屏的显示缓冲区是 800x480/8大概是 48KB 黑白加 48KB 红色合起来快 100KB。这意味着数据解析和渲染时你的内存预算非常紧张。我当时踩过一个内存爆掉的坑天气 API 返回的 JSON 有几十个字段我用 ArduinoJson 库解析直接把整个 JSON 文档存到了一个 200KB 的 buffer 里烧录后运行时反复重启。后来我改成用流式解析只提取需要的字段温度、湿度、天气描述、城市名buffer 从 200KB 降到 8KB才稳定下来。在嵌入式设备上永远不要存“完整数据”只留“你需要的那几个字段”这是所有 MCU 开发者的共识。5.3 显示版式设计与渲染技巧7.5 寸 800x480 的屏幕虽然比手机屏大很多但它的黑白像素密度低也没有灰度渐变黑白红三色屏每像素只有 2bit 信息。所以版式设计必须遵循“大字号、高对比、少内容”的原则。我的版式分三块顶部日期、星期、城市名用 24 号字体中间温度大数字和天气图标温度用 48 号字体红色显示底部未来 3 天的气温区间以及 3 条待办事项用 18 号字体这里有一个“字体显示不全”的细节值得说说。U8g2 库在渲染某些字体的中文时如果缓冲区没有足够空间会导致汉字被截断或者干脆不显示。解决办法是在渲染前先计算每个字符串的像素宽度如果超出版面宽度就缩小字号或截断字符串。我写了一个简单的自动换行函数来处理标题实测下来效果很好。5.4 刷新频率与功耗平衡本地的天气数据每小时变一次日历和待办其实一天更新一次就够。我最后把刷新频率设置在“工作日每小时刷新一次夜间 22 点到早上 7 点休眠不刷新”这样既保证了白天看到的信息不过时又兼顾了夜间省电。实测下来这套策略下 2000mAh 电池续航在 70 天左右。有人可能觉得 70 天也不长但如果你把刷新频率降到一天 4 次续航可以拉到 180 天以上。关键在于你到底需要多“实时”的信息以及你愿不愿意接受电池容量的增加。电子纸的信息更新频繁程度永远是一件需要斟酌的事情。6. 常见问题与排查技巧实录6.1 故障速查表这里把项目里遇到的和朋友遇到底的典型问题整理成一个表方便你对照排查。现象可能原因排查步骤首次上电白屏接线错误、驱动 IC 版本不匹配检查 SPI 引脚连接确认驱动芯片型号与库一致刷新后残影严重电子纸物理特性导致做 2-3 次全刷清屏或者在非关键显示用全刷内容刷新到一半卡住刷新期间断电或 BUSY 引脚电平异常检查电源稳定性和 BUSY 引脚上拉电阻能连接路由但拉不到数据DNS 解析失败或 API 返回异常先 ping 网关再测试 API 地址是否能解析设备反复重启内存不足或看门狗触发用ESP.getFreeHeap()打印可用内存优化数据结构时间显示不准确没有校时或时区设置错误用 NTP 校时并设置正确的 UTC 偏移量夜间刷新导致耗电快休眠唤醒太频繁在夜间关闭刷新任务只在白天运行6.2 那个让我排查了三天的问题分享一个记忆犹新的坑。设备调试好之后我把它放在客厅墙上运行了两天一切正常。第三天早上过去一看屏幕停留在“正在更新”的画面红蓝两色块铺满屏幕。串口日志显示设备在拉取数据时卡死在了 HTTP 请求上然后看门狗重启了设备但设备重启后因为网络还没恢复又发起了新的 HTTP 请求……就这么死循环了。这个问题的根因是我没有给 HTTP 请求设置超时时间。ArduinoESP32 的 HTTPClient 库默认可能长时间阻塞如果服务器端 TCP 连接没有及时关闭设备会一直等造成假死。解决办法是显式设置超时http.setTimeout(10000)并把请求失败直接跳到休眠状态的逻辑加上。这样一个周期内最多卡 10 秒然后设备进休眠下个周期再重试不会再死循环。另一个问题也很隐蔽电池电压低至 3.3V 以下时SPI 通信会不稳定屏幕刷新会出现雪花点。这种问题特别难排查因为它不是必现的只在电压到临界值时偶尔出现。后来我在 ADC 引脚上接了一个分压电阻用来监测电池电压当电压低于 3.5V 时屏幕的一角会显示电池电量图标并停止自动刷新提醒用户该充电了。6.3 调试工具推荐既然是做联网和显示相关的项目调试工具值得你花一点时间和预算准备USB 转 TTL 串口模块必备用于查看 ESP32 的日志输出逻辑分析仪几十块钱的 8 通道逻辑分析仪就够排查 SPI 时序问题全靠它可调电源用来观察设备的实时电流验证低功耗策略是否生效万用表排查线路通断和电压异常必不可少逻辑分析仪上你重点观察的是 SPI 总线的 CS、SCLK、MOSI、MISO 信号。如果出现了“波形看起来有数据但屏幕就是没反应”的情况那就用逻辑分析仪对比原厂例程的波形通常会发现是时钟极性CPOL或者相位CPHA设置错了改一下 SPI 模式就能解决。7. 扩展玩法与最终心得到这里这个 Wi-Fi 电子纸的核心功能已经完整跑通了。接下来它还能怎么玩我想到几个方向第一个方向是信息聚合。除了天气和日历你可以在服务器端聚合更多数据源比如 RSS 摘要、待办列表、股票行情、快递进度。说白了服务器想接什么就接什么ESP32 只负责拉取一个聚合好的 JSON然后渲染就行。第二个方向是远程控制。通过接入 MQTT 协议你可以让手机推送一张图片或者一段文字到屏幕上。比如伴侣在办公室发一条消息家里的屏幕上就显示一句“今晚加班不用等我吃饭”。这个功能实现起来也不难MQTT 库在 ESP32 上非常成熟关键还是照旧考虑消息在屏幕上的版式渲染。第三个方向是太阳能供电。既然整机平均电流只有 1 到 2 毫安那用一块 6V 的太阳能板加上锂电池充电管理放在窗台上是完全可行的。改造后这块屏幕就真的可以“挂上墙再也不用管了”。最后分享一点个人体会。做这个项目最大的收获不是那套代码能跑起来而是理解了一个观念任何电子产品都是从硬件到软件再到体验的一整条链路哪一个环节掉链子整个产品就不可用。屏幕驱动不对你连像素都点不亮网络配置不行你拉不到数据即使这些都通了如果你不处理低功耗和异常恢复设备也会在运行几天后悄悄罢工。所以我的建议是如果你也想做这类项目不要一上来就试图做到“完美”先把最小可行的闭环跑通——一块屏、一个主控、简单拉一个天气数据让它在桌上转起来。剩下的优化无论是配网体验、续航优化还是外壳美化都在这个“能跑”的基础上一步步迭代。碰到问题别慌按照链路排查每次解决一个点项目就会越来越扎实。如果看完这篇你也手痒了不妨找个周末把积灰的 ESP32 和那块屏幕翻出来试试。能跑起来的那一瞬间你会觉得之前的折腾都值了。