☰
基于ESP32-S3与ePaper的电子钥匙链DIY:硬件选型、低功耗设计与Arduino开发实战
2026/10/9 7:11:27 网站建设 项目流程

1. 项目缘起与整体设计思路

1.1 为什么我会想到做一个电子钥匙链

钥匙链这东西,几乎每个人身上都挂着一个,但绝大多数就是一块塑料牌或者一个金属环,除了挂钥匙没有任何其他作用。我平时出门带的东西不多,钥匙、门禁卡、公交卡,偶尔还要记一下停车位编号或者临时要记的琐事。手机虽然什么都能干,但掏手机、解锁、打开备忘录这一套动作下来,少说也要十几秒,有时候手上拎着东西根本不想掏手机。

于是我就琢磨,能不能把钥匙链做成一个带屏幕的小终端,平时挂在包上或者裤腰上,需要的时候按一下就能显示我预设好的信息,比如停车位号、常用电话、待办事项,甚至显示个简单的图案当装饰。这个想法落地之后,就有了eChain这个项目——一个基于ESP32-S3的趣味电子钥匙链。

它的核心定位很明确:低功耗常显、随身携带、信息可随时更新。屏幕我选了ePaper电子墨水屏,原因后面会详细说。主控用ESP32-S3,因为它自带Wi-Fi,可以让我在浏览器里直接改显示内容,不用每次都插线烧录。开发环境用的是Arduino IDE,对个人项目来说上手快、库生态成熟,没必要上更重的框架。

这个项目适合谁呢?如果你玩过 Arduino,想找一个既有实用性又能练手的综合项目,eChain 很合适。它涉及屏幕驱动、电源管理、无线通信、外壳结构几个模块,麻雀虽小五脏俱全。如果你是完全的新手,也不用怕,我会把每一步拆开讲清楚,包括我踩过的坑。

1.2 硬件选型的取舍逻辑

选型这件事,我前后折腾了差不多两周,换过三套方案,最后才定下来。这里把思考过程完整写出来,方便你根据自己的需求调整。

主控:为什么是 ESP32-S3 而不是 ESP32 或 RP2040

ESP32-S3 相比老款 ESP32,主要优势在于 GPIO 数量更多、USB OTG 原生支持、以及更低的深度睡眠功耗。对于钥匙链这种靠小电池供电的设备,深度睡眠电流直接决定了续航。我实测 ESP32-S3 在深度睡眠下可以做到几十微安级别,而老款 ESP32 通常在百微安以上。另外 S3 的 USB 接口可以直接模拟串口,烧录和调试都方便,不需要额外的 USB-TTL 模块。

RP2040 我也考虑过,它的低功耗表现不错,但没有原生 Wi-Fi,要加无线模块就得额外占空间和功耗,对于钥匙链这种寸土寸金的体积来说不划算。

屏幕:ePaper 是唯一解

钥匙链的屏幕必须满足三个条件:常显不耗电、阳光下可读、体积薄。LCD 常显要持续供电,OLED 虽然省电但阳光下看不清,而且长时间显示静态内容有烧屏风险。ePaper 电子墨水屏完美符合:断电后画面保持,只在刷新时耗电,阳光下对比度反而更好,厚度也薄。

我选的是 1.54 英寸、200x200 分辨率的黑白 ePaper 模块,带 SPI 接口。这个尺寸挂在钥匙链上刚好,分辨率显示几行文字和简单图标足够。彩色 ePaper 我也试过,刷新太慢而且贵,没必要。

开发板:ESP32-S3-N16R8 Mini

热词里提到的esp32-s3-n16r8 mini开发板16mb wi-fi正是我用的这款。N16R8 的意思是 16MB Flash + 8MB PSRAM。对于这个项目,16MB Flash 其实用不完,但 PSRAM 在缓存图片数据时很有用。Mini 版的尺寸小,适合塞进钥匙链外壳。如果你手头是其他 ESP32-S3 开发板,只要引脚够用也完全可以。

1.3 系统架构一句话说清

整个系统就三块:ESP32-S3 负责逻辑和无线,ePaper 负责显示,锂电池负责供电。工作时 ESP32-S3 平时处于深度睡眠,按按键唤醒后刷新屏幕,然后通过 Wi-Fi 提供一个简单的网页配置界面,手机连上就能改内容。改完保存,设备重新进入睡眠。没有云、没有服务器、没有 App,所有数据存在本地 Flash 里。

这个架构的好处是完全离线可用,不依赖任何外部服务,隐私也好。Wi-Fi 只在需要配置时开启,平时关闭,进一步省电。

2. 核心细节解析与实操要点

2.1 ePaper 屏幕驱动的关键参数

ePaper 屏幕的驱动是新手最容易卡住的地方,因为它的刷新逻辑和普通屏幕完全不同。普通屏幕你写什么它显示什么,ePaper 需要一套完整的初始化、清屏、写数据、刷新、休眠流程,少一步屏幕就白屏或者花屏。

我用的这款 1.54 寸屏,驱动芯片是 SSD1681,分辨率 200x200。接线是标准 SPI:SCK、MOSI、CS、DC、RST、BUSY 六根线。其中BUSY 引脚特别重要,它告诉主控屏幕当前是否在刷新。如果你不等 BUSY 变低就发下一条命令,屏幕会直接罢工。

刷新模式有两种:全刷和局刷。全刷会闪一下黑屏再显示新内容,大概 2 秒;局刷只更新变化区域,不闪,但用多了会有残影。我的策略是:日常更新用局刷,每隔十次局刷做一次全刷清除残影。这个细节在官方例程里不会告诉你,是我实际用了一周才总结出来的。

注意:ePaper 的工作电压是 3.3V,千万不要接 5V,否则驱动芯片会烧。我第一次就差点接错,幸好看了一眼规格书。

2.2 电源管理与续航估算

钥匙链的电池仓空间有限,我选的是 500mAh 的锂聚合物电池,尺寸刚好塞进外壳。续航怎么算?关键看工作电流和睡眠电流。

ESP32-S3 深度睡眠电流约 50 微安,ePaper 休眠电流几乎为零,加上其他杂散损耗,整体睡眠电流按 100 微安算。工作时的电流:ESP32-S3 运行 Wi-Fi 时约 120 毫安,ePaper 刷新时约 10 毫安,刷新一次耗时 2 秒。

假设你每天刷新 20 次,每次工作 5 秒(含 Wi-Fi 配置时间),那么每天工作耗电是 120mA × 5s × 20 = 12000mA·s,换算成 mAh 是 12000 / 3600 ≈ 3.33mAh。睡眠耗电是 0.1mA × 24h = 2.4mAh。加起来每天约 5.73mAh。500mAh 电池理论上能用 87 天。

当然这是理想值,实际因为电池自放电、温度影响,打个七折,大约两个月充一次电。这个续航对钥匙链来说完全够用。

2.3 Arduino IDE 环境搭建的坑

热词里出现了arduino ide esp32离线包和arduino ide 启动时一直等待,说明很多人在这两步卡住了。我把自己装环境的完整过程写下来。

首先,Arduino IDE 建议用 2.x 版本,1.8.x 虽然也能用,但对 ESP32-S3 的支持不如新版完善。安装完之后,需要在“首选项”里添加 ESP32 的开发板管理器网址。这个网址在乐鑫的官方文档里有,我这里不贴具体链接,你搜“ESP32 Arduino 开发板管理器”就能找到。

添加网址后,打开开发板管理器,搜索 esp32,安装。这一步最大的坑是网络问题,因为开发板包有好几百 MB,下载经常中断。如果你遇到arduino ide 启动时一直等待,大概率是它在后台检查更新或者下载索引,可以断开网络再启动,或者直接下载离线包手动安装。

离线包的用法:下载对应版本的 zip 包,解压到 Arduino 的 hardware 目录下,重启 IDE 就能在开发板列表里看到 ESP32。这个方法比在线安装稳定得多,尤其适合网络环境不稳定的情况。

Mac 用户注意:热词里有mac arduino ide,Mac 上安装 ESP32 包之后,如果串口识别不到开发板,需要装 CH340 或 CP210x 驱动。ESP32-S3 的 Mini 板子有的用 CH340,有的用原生 USB,买之前看清楚。我用的这块是原生 USB,Mac 免驱,插上就能识别。

2.4 按键与交互设计

钥匙链只有一个按键,所以交互必须极简。我的设计是:

  • 短按:刷新屏幕,显示当前内容
  • 长按 3 秒:进入 Wi-Fi 配置模式,屏幕显示热点名称和密码
  • 双击:切换显示页面(比如从停车位号切到待办事项)

按键用轻触开关,接一个 GPIO,配置内部上拉。代码里用中断加消抖,消抖时间 50ms。这里有个细节:ESP32-S3 从深度睡眠唤醒后,需要重新初始化 GPIO 和屏幕,不能假设状态还在。我一开始没注意,唤醒后屏幕没反应,查了半天才发现是初始化顺序问题。

3. 实操过程与核心环节实现

3.1 硬件焊接与组装步骤

先说焊接。ePaper 模块一般自带排针,但为了薄,我直接把排针焊掉,用细导线连接。焊接顺序建议从电源开始:先把电池的正负极焊到开发板的 BAT 和 GND,再焊屏幕的 SPI 线,最后焊按键。

导线长度要控制好,太长塞不进外壳,太短不好操作。我用的 30AWG 硅胶线,柔软且耐弯折。焊完之后先用万用表测一遍通断,确认没有短路再上电。

外壳我用 3D 打印,模型是自己画的,尺寸 60x40x12mm,刚好放下电池、开发板和屏幕。屏幕开窗比屏幕可视区域大 1mm,避免边缘遮挡。按键位置留一个 3mm 的孔,用热熔胶固定按键。

提示:3D 打印外壳的壁厚建议 1.5mm 以上,太薄容易断。我用 PLA 打的,强度够用,如果你经常摔东西,可以考虑 PETG。

3.2 屏幕驱动代码的核心逻辑

代码部分我按功能模块拆开讲。首先是屏幕初始化,这部分直接调用库函数就行,我用的是 GxEPD2 库,它支持市面上大多数 ePaper 模块。初始化时需要传入引脚定义:

GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display( GxEPD2_154_D67(/*CS=*/10, /*DC=*/9, /*RST=*/8, /*BUSY=*/7) );

引脚号根据你的实际接线改。初始化之后,调用display.init()和display.setRotation(0)。然后就是绘制内容:

display.setFullWindow(); display.firstPage(); do { display.fillScreen(GxEPD_WHITE); display.setTextColor(GxEPD_BLACK); display.setCursor(10, 30); display.print("Parking: B2-108"); } while (display.nextPage());

这段代码的逻辑是:先声明全窗口刷新,然后进入分页绘制循环。ePaper 库要求你把所有绘制操作放在firstPage和nextPage之间,因为它需要分多次传输数据。这个结构新手容易写错,记住就行。

3.3 Wi-Fi 配置页面的实现

Wi-Fi 配置用 ESP32 的 WebServer 库。长按按键后,设备启动一个热点,SSID 叫eChain-Config,密码固定12345678。然后启动一个 HTTP 服务器,监听 80 端口。手机连上热点后,浏览器访问192.168.4.1,就能看到一个简单的表单页面。

页面用 HTML 写,包含几个输入框:停车位、待办事项、显示模式。提交后,ESP32 把数据存到 Preferences(Flash 里的键值存储),然后重启进入正常模式。

server.on("/", HTTP_GET, []() { server.send(200, "text/html", configPage); }); server.on("/save", HTTP_POST, []() { prefs.putString("parking", server.arg("parking")); prefs.putString("todo", server.arg("todo")); server.send(200, "text/plain", "Saved"); delay(1000); ESP.restart(); });

这里有个坑:保存后不要立刻重启,要给浏览器时间收到响应,否则页面会显示连接错误。我加了 1 秒延时,实测稳定。

3.4 深度睡眠与唤醒的代码实现

深度睡眠用esp_deep_sleep_start(),唤醒源配置为按键所在的 GPIO:

esp_sleep_enable_ext0_wakeup(GPIO_NUM_3, 0); esp_deep_sleep_start();

ext0表示用单个 GPIO 唤醒,参数 0 表示低电平触发。按键接 GPIO3 和 GND,按下时拉低,触发唤醒。

唤醒后,代码从setup()重新开始执行。所以你需要判断唤醒原因:

esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause(); if (cause == ESP_SLEEP_WAKEUP_EXT0) { // 按键唤醒,刷新屏幕 } else { // 上电启动,正常初始化 }

这个判断很重要,否则每次唤醒都会重新走一遍完整初始化,浪费时间也耗电。

3.5 参数计算与实测数据

我把实测的几个关键数据列出来,方便你参考:

项目数值备注
深度睡眠电流52 微安万用表实测
Wi-Fi 工作电流118 毫安传输时峰值
ePaper 刷新电流9 毫安刷新期间
全刷耗时2.1 秒含清屏
局刷耗时0.8 秒仅更新区域
单次刷新耗电约 0.02mAh按 5 秒工作算
预估续航约 60 天每天 20 次刷新

这些数据是我用 USB 电流表测的,不同批次模块可能有差异,但量级不会差太多。

4. 常见问题与排查技巧实录

4.1 屏幕白屏或花屏怎么办

这是最高频的问题。排查顺序如下:

  1. 检查接线:SPI 的六根线有没有接反、虚焊。特别是 BUSY 线,如果没接,屏幕会一直等。
  2. 检查电压:用万用表量屏幕 VCC 是不是 3.3V。低于 3.0V 屏幕可能不工作。
  3. 检查初始化顺序:必须先display.init(),再绘制。顺序反了屏幕没反应。
  4. 检查刷新模式:局刷用多了会花屏,做一次全刷试试。

我遇到过一次花屏,查了两小时,最后发现是 BUSY 线焊点虚焊,重新焊就好了。所以焊接质量真的很重要。

4.2 Wi-Fi 连不上或配置页面打不开

可能原因:

  • 热点没启动:检查代码里WiFi.softAP()是否调用成功,串口会打印 IP 地址。
  • 手机连了其他 Wi-Fi:连上 eChain 热点后,手机会提示“无互联网连接”,选择“保持连接”才能访问配置页。
  • IP 地址不对:默认是 192.168.4.1,如果你改过代码,以串口打印为准。

注意:有些安卓手机会自动切换到移动数据,导致访问不了 192.168.4.1。在浏览器里手动输入 IP,或者关闭移动数据再试。

4.3 续航不如预期

如果发现电池掉电快,按这个表排查:

现象可能原因解决方法
一天就没电没进深度睡眠检查esp_deep_sleep_start()是否执行
三天没电Wi-Fi 没关配置完确认WiFi.mode(WIFI_OFF)
一周没电屏幕没休眠刷新后调用display.hibernate()
两周没电电池老化换新电池

我最开始忘了调display.hibernate(),屏幕刷新完还保持供电,白白耗电。加上这行之后续航直接翻倍。

4.4 Arduino IDE 编译报错合集

  • “Board not found”:开发板没选对,选 ESP32S3 Dev Module。
  • “PSRAM not enabled”:在工具菜单里开启 PSRAM。
  • “Partition scheme too small”:换一个更大的分区方案,比如 16MB Flash 选 “16M Flash (3MB APP/9.9MB FATFS)”。
  • “Library not found”:GxEPD2 库没装,在库管理器里搜了装上。

这些报错我都遇到过,按上面改基本都能解决。

4.5 独家避坑心得

最后分享几个文档里不会写的经验:

第一,ePaper 的排线很脆弱。我第一块屏幕就是排线折断了,焊的时候用镊子固定,别硬掰。如果排线断了,基本没法修,只能换新。

第二,电池保护板一定要有。锂聚合物电池过放会鼓包甚至起火,买电池时选带保护板的,或者自己加一个 DW01 保护芯片。安全第一。

第三,外壳设计留一点余量。我第一版外壳尺寸卡得太死,装进去之后按键按不动,只能重新打。建议每个方向留 0.5mm 余量。

第四,代码里加看门狗。ESP32 偶尔会死机,加个看门狗定时器,死机自动重启,避免钥匙链变砖。

第五,测试阶段用 USB 供电。别一上来就接电池,先用 USB 调试,确认功能正常再上电池,省得反复拆装。

这个项目我从画图到成品大概花了一个月,中间返工三次。现在它挂在我包上,每天用着挺顺手。如果你也想做一个,建议先从屏幕驱动跑通开始,再一步步加功能,别想着一次做完。硬件项目就是这样,急不得。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询