ESP32墨水屏手表DIY:30天续航与自定义表盘全攻略

发布时间:2026/10/30 3:53:49
ESP32墨水屏手表DIY:30天续航与自定义表盘全攻略 墨水屏手表这个品类市面上能买到的成品不少但真正能让你把代码从头到尾改一遍、把表盘换成自己画的、把功能按自己需求增删的开源方案其实没那么多。我手上这个项目就是冲着这个目标去的一块用 Arduino 框架开发、ESP32 做主控、带墨水屏的智能手表官方标称 30 天续航支持自定义表盘、蓝牙和 Wi-Fi 连接、实时天气、番茄闹钟和指南针。听起来功能列表不算长但每一个功能背后都有一堆需要权衡的取舍尤其是墨水屏这个显示介质它的刷新特性决定了整个软件的架构思路和普通 TFT 手表完全不是一回事。我拿到这个项目之后断断续续折腾了大概三周从硬件选型、开发环境搭建、墨水屏驱动调试到蓝牙连接、天气数据拉取、番茄钟逻辑和指南针校准中间踩的坑比预想的多。这篇文章不打算写成一份照抄就能跑的说明书而是把我实际做下来的完整思路、关键决策点和那些文档里不会写的经验整理出来。如果你手头正好有一块 ESP32 开发板和一块 SPI 接口的墨水屏想做一个能戴出门、续航够用、还能随时改代码的手表那这篇内容应该能帮你省下不少来回试错的时间。1. 为什么墨水屏手表值得用 ESP32 从头做一遍1.1 墨水屏和 TFT 手表的本质差异很多人第一次听说墨水屏手表第一反应是刷新那么慢怎么做手表。这个疑问很合理但恰恰是墨水屏最大的优势所在。TFT 屏幕需要持续供电才能维持画面哪怕你只显示一个静态时间背光和像素驱动也在不停耗电。墨水屏不一样它只在刷新画面的那一瞬间消耗电流画面写完之后断电也能一直保持显示。这意味着手表在绝大多数时间里可以处于深度休眠状态只有需要更新显示内容时才唤醒主控。这个特性直接决定了软件架构。TFT 手表可以每秒刷新一次时间墨水屏手表如果也这么做续航会直接崩掉。所以墨水屏手表的刷新策略必须是按需刷新——分钟变了才刷时间区域天气数据更新了才刷天气区域其他时候主控该睡就睡。我实测下来如果每分钟全屏刷新一次续航大概只有四五天改成局部刷新加深度休眠之后续航才真正接近标称的 30 天。另一个差异是颜色。大部分低成本墨水屏只有黑白两色少数支持红黄黑白四色但四色屏的刷新速度和价格都不太友好。做手表的话黑白屏其实够用时间、日期、温度、电量这些信息用黑白完全能表达清楚而且黑白屏的驱动成熟度最高社区资料也最全。1.2 ESP32 在这个项目里扮演的角色选 ESP32 而不是传统的 Arduino UNO 或者 STM32核心原因是无线连接能力。这个手表需要蓝牙和 Wi-FiESP32 把这两个都集成在芯片里了不需要额外挂模块。蓝牙用来和手机通信比如同步时间、推送通知、配置表盘Wi-Fi 用来拉取天气数据偶尔也可以做 OTA 固件更新。ESP32 的另一个优势是深度休眠功耗控制得不错。在正确配置的情况下深度休眠电流可以做到几十微安级别这对于 30 天续航目标是关键。当然实际功耗还取决于你外挂了多少东西——墨水屏驱动板、传感器、按键上拉电阻这些都会在休眠时偷偷吃电。我在项目里把能断的电全断了墨水屏在休眠前会进入 deep sleep 模式传感器用 MOS 管控制供电这才把整体休眠电流压下来。还有一点是 Arduino 框架对 ESP32 的支持已经相当成熟。虽然 ESP-IDF 能提供更精细的控制但对于手表这种功能相对固定的项目Arduino 框架的开发效率高很多社区里现成的墨水屏驱动库、蓝牙库、JSON 解析库都能直接用。我个人的选择是先用 Arduino 框架把功能跑通如果后面有极致功耗需求再考虑把关键部分迁移到 ESP-IDF。1.3 30 天续航到底是怎么算出来的厂商标称的 30 天续航通常是在特定条件下的理论值。我拆解了一下这个数字背后的逻辑假设电池容量是 500mAh30 天就是 720 小时平均电流必须控制在 0.7mA 以下。这个电流预算要分给主控休眠、墨水屏待机、传感器待机、以及每次刷新时的瞬时功耗。实际使用中如果每分钟刷新一次时间每次刷新消耗大概 20mA 持续 2 秒那一天就是 1440 次刷新累计 1440 × 20mA × 2s / 3600s ≈ 16mAh一个月就是 480mAh光刷新就把电池吃完了。所以必须降低刷新频率或者用局部刷新减少每次刷新的功耗。我的做法是时间显示精确到分钟但只在分钟变化时刷新而且只刷新时间所在的局部区域这样每次刷新的功耗能降到全屏刷新的三分之一左右。天气数据我设定每两小时更新一次通过 Wi-Fi 拉取。每次 Wi-Fi 连接和数据传输大概消耗 80mA 持续 5 秒一天 12 次累计 12 × 80mA × 5s / 3600s ≈ 1.3mAh一个月不到 40mAh这个开销可以接受。蓝牙我平时关掉只在需要同步数据时手动打开这样又能省下一大块功耗。2. 硬件选型与电路设计里的取舍2.1 主控板的选择ESP32-S3 还是经典 ESP32市面上 ESP32 的衍生型号很多我手头有经典 ESP32-WROOM-32 和 ESP32-S3-N16R8 两种。经典 ESP32 的优势是资料最全、社区支持最好、价格便宜ESP32-S3 的优势是处理能力更强、内存更大、USB 接口原生支持烧录和调试更方便。对于这个手表项目我最终选了 ESP32-S3-N16R8原因是它自带 16MB Flash 和 8MB PSRAM存表盘图片、字体文件、天气图标这些资源完全够用不需要外挂存储芯片。经典 ESP32 通常只有 4MB Flash存完固件之后剩不下多少空间表盘资源多了就得外挂 SD 卡反而增加功耗和体积。不过 ESP32-S3 在 Arduino 框架下的支持不如经典 ESP32 那么成熟有些库需要手动改配置。我遇到的一个问题是墨水屏驱动库在 S3 上编译报错后来发现是 SPI 引脚定义和经典 ESP32 不一样改了一下引脚映射就好了。如果你刚开始做用经典 ESP32 会更省心如果你对内存和性能有要求S3 是更好的选择。2.2 墨水屏的型号与驱动方案墨水屏我试过两种一种是 1.54 寸黑白 SPI 屏分辨率 200×200另一种是 2.13 寸黑白 SPI 屏分辨率 250×122。1.54 寸的方形屏更适合做表盘显示区域接近圆形视觉上更像传统手表2.13 寸的长方形屏显示面积更大但做表盘需要重新设计布局。驱动方案上我推荐用 Waveshare 或者微雪电子的墨水屏模块它们自带驱动板SPI 接口直接和 ESP32 对接Arduino 库也维护得比较勤。我用的驱动库是 GxEPD2它支持局部刷新和多种墨水屏型号配置起来比较灵活。需要注意的是不同批次的墨水屏面板可能来自不同厂商驱动参数会有细微差异如果发现刷新有残影或者颜色不对可能需要手动调整驱动库里的波形参数。墨水屏的供电也要注意。虽然墨水屏在待机时不耗电但刷新瞬间电流可能达到 20mA 以上如果和 Wi-Fi 同时工作瞬时电流可能超过 100mA。我在电源设计上给墨水屏单独加了一个 100μF 的电容避免刷新时电压跌落导致主控复位。2.3 电源管理与充电电路电池我选的是 3.7V 锂聚合物电池容量 500mAh尺寸刚好能塞进手表外壳。充电电路用的是 TP4056 模块支持 USB 充电带过充过放保护。这个模块很便宜但要注意它的充电电流默认是 1A对于 500mAh 的电池来说太大了需要把编程电阻换成 1.2kΩ把充电电流降到 500mA 左右这样充电更安全电池寿命也更长。电源管理上我用了一个 MOS 管来控制墨水屏和传感器的供电主控休眠前会把它们全部断电。ESP32 本身进入深度休眠后电流大概在 10μA 到 50μA 之间具体取决于你保留了多少唤醒源。我保留了 RTC 定时唤醒和按键唤醒这样手表既能定时刷新时间也能在按下按键时立即响应。还有一个细节是电压监测。锂电池的电压从 4.2V 降到 3.3V 的过程中ESP32 的 ADC 读数会变化需要做校准才能准确显示电量。我在代码里用了一个简单的分段线性映射把 ADC 读数转换成百分比实测精度够用误差在 5% 以内。3. 开发环境搭建与墨水屏驱动调试3.1 Arduino IDE 配置 ESP32 开发板Arduino IDE 配置 ESP32 的流程不算复杂但国内网络环境下下载开发板包经常卡住。我的做法是手动下载 ESP32 的离线包然后放到 Arduino 的硬件目录里。具体路径是~/Arduino/hardware/espressif/esp32把离线包解压进去之后在开发板管理器里就能看到 ESP32 的选项了。如果你用的是 ESP32-S3需要选择对应的开发板型号比如 ESP32S3 Dev Module。这里有个坑S3 的 USB 接口有两种模式一种是原生 USB一种是 UART 桥接。如果你选错了模式串口监视器会看不到输出。我一开始就选错了折腾了半天以为板子坏了后来在工具菜单里把 USB Mode 改成 Hardware CDC and JTAG 才正常。编译速度也是个大问题。ESP32 的库文件很多第一次编译可能要几分钟Windows 上尤其慢。我的优化方法是把 Arduino IDE 的临时目录放到 SSD 上关闭不必要的编译警告并且用--build-path参数指定一个固定的编译缓存目录这样第二次编译会快很多。3.2 GxEPD2 库的配置与局部刷新GxEPD2 是墨水屏驱动里比较成熟的一个库支持局部刷新、多种面板型号和 SPI 接口。配置的时候需要在代码里指定屏幕型号和引脚比如#define ENABLE_GxEPD2_GFX 0 #include GxEPD2_BW.h GxEPD2_BWGxEPD2_154_D67, GxEPD2_154_D67::HEIGHT display(GxEPD2_154_D67(/*CS*/ 10, /*DC*/ 9, /*RST*/ 8, /*BUSY*/ 7));局部刷新的关键是调用display.setPartialWindow()指定刷新区域然后在这个区域内绘制内容。需要注意的是局部刷新的次数不能太多否则墨水屏会出现残影。我的做法是每做 20 次局部刷新就做一次全屏刷新把残影清掉。这个数字不是固定的不同面板的耐受程度不一样你可以根据实际显示效果调整。还有一个坑是局部刷新的坐标对齐。墨水屏的局部刷新区域通常要求按 8 像素对齐如果你指定的区域坐标不是 8 的倍数刷新可能会错位或者无效。我在代码里写了一个对齐函数把所有局部刷新坐标都对齐到 8 的倍数问题就解决了。3.3 表盘资源的存储与加载表盘图片我存成了 1 位黑白位图用 XBM 格式嵌入到代码里。XBM 格式的好处是直接就是 C 数组不需要额外的解码库缺点是文件体积大一张 200×200 的位图大概占 5KB。ESP32-S3 的 16MB Flash 存几十张表盘完全没问题但如果你用的是经典 ESP32可能需要精简一下。加载表盘的时候我用的是display.drawXBitmap()函数直接把 XBM 数组画到屏幕上。这个函数的速度还可以全屏绘制大概需要 200ms 左右。如果你觉得慢可以把位图转成 RLE 压缩格式解码后再绘制但这样会增加代码复杂度我权衡之后觉得没必要。表盘切换的逻辑很简单按键按下时切换表盘索引然后重新绘制整个屏幕。为了避免频繁刷新我加了一个防抖逻辑按键按下后 200ms 内不再响应。这个防抖时间可以根据你的按键手感调整我用的是轻触按键200ms 刚好。4. 蓝牙与 Wi-Fi 功能的落地细节4.1 蓝牙连接手机的实现方式ESP32 的蓝牙有两种模式经典蓝牙和 BLE。经典蓝牙适合传输音频和大数据量BLE 适合低功耗的小数据量传输。手表和手机通信主要是同步时间、推送通知、配置参数数据量很小所以用 BLE 更合适。我用的是 Arduino 的 BLE 库在 ESP32 上创建一个 BLE 服务包含几个特征值一个用来接收时间同步数据一个用来接收通知内容一个用来接收配置参数。手机端可以用任何支持 BLE 的 App 来连接比如 nRF Connect也可以自己写一个简单的 Android 或 iOS App。这里有个坑是 BLE 的连接间隔。默认的连接间隔可能比较长导致数据传输延迟明显。我在代码里把连接间隔参数调小了一些牺牲一点功耗换取更快的响应速度。具体参数是connParams.setInterval(12)单位是 1.25ms12 就是 15ms。这个值可以根据实际需求调整间隔越小响应越快但功耗也越高。4.2 Wi-Fi 拉取天气数据的完整流程天气数据我用的是心知天气或者和风天气的 API它们都提供免费的开发者套餐每天有几百次调用额度对于手表来说完全够用。流程是这样的ESP32 连接 Wi-Fi发送 HTTP GET 请求到天气 API解析返回的 JSON 数据提取温度和天气状况然后更新屏幕显示。Wi-Fi 连接是功耗大户所以我的策略是用完就关。具体做法是定时器唤醒后先打开 Wi-Fi连接热点拉取数据然后立即关闭 Wi-Fi再进入深度休眠。整个过程大概持续 5 到 8 秒功耗可以控制在可接受范围内。JSON 解析我用的是 ArduinoJson 库它体积小、速度快适合嵌入式环境。需要注意的是天气 API 返回的 JSON 结构可能比较复杂你需要根据实际返回内容定义解析模型。我一开始没定义好模型导致解析失败后来用 ArduinoJson Assistant 工具自动生成了模型代码问题就解决了。还有一个细节是 Wi-Fi 连接失败的处理。如果热点不可用或者密码错误ESP32 会一直尝试连接白白耗电。我在代码里加了超时机制连接超过 10 秒就放弃直接进入休眠等下一次定时唤醒再试。4.3 蓝牙和 Wi-Fi 共存时的注意事项ESP32 的蓝牙和 Wi-Fi 共用同一个射频模块不能同时工作。如果你的代码里同时开启了蓝牙和 Wi-Fi可能会出现连接不稳定或者数据丢失的情况。我的做法是分时复用需要 Wi-Fi 的时候关掉蓝牙需要蓝牙的时候关掉 Wi-Fi。这样虽然不能同时使用两个功能但对于手表来说完全够用因为天气更新和蓝牙同步本来就不需要同时进行。如果你确实需要同时使用可以考虑用 ESP32 的双核特性把一个核心专门分配给蓝牙另一个核心处理 Wi-Fi 和应用逻辑。但这样做会增加代码复杂度而且功耗也会上升我个人的建议是能分时就分时没必要给自己找麻烦。5. 番茄闹钟、指南针与传感器集成5.1 番茄闹钟的逻辑设计与震动提醒番茄闹钟的核心逻辑很简单设定一个 25 分钟的工作时段时间到了之后提醒用户休息 5 分钟循环往复。但在手表上实现需要考虑几个问题一是计时精度二是提醒方式三是功耗。计时精度方面我用的是 ESP32 的 RTC 定时器它在深度休眠时也能保持计时精度足够。提醒方式我选的是震动马达因为手表戴在手上震动比声音更直接。震动马达我用的是小型的扁平马达工作电流大概 60mA震动 1 秒消耗的电量可以忽略不计。代码逻辑上我用了一个状态机来管理番茄钟的状态空闲、工作中、休息中。按键短按开始或暂停长按重置。状态切换时更新屏幕显示并且只在状态变化时刷新屏幕避免不必要的功耗。5.2 指南针传感器的校准与数据读取指南针我用的是 QMC5883L 或者 HMC5883L 三轴磁力计I2C 接口和 ESP32 连接很简单。但磁力计有个很大的问题容易受到硬铁和软铁干扰。硬铁干扰来自手表内部的永磁体或者电流走线软铁干扰来自附近的铁磁性材料。如果不做校准指南针读数会偏差很大甚至完全不可用。校准的方法是做8 字校准在代码里进入校准模式然后拿着手表在空中画几个 8 字采集各个方向上的磁场数据计算出偏移量和缩放系数保存到 Flash 里。之后每次读取磁力计数据时都用这些系数做补偿。我实测下来校准之后指南针的精度可以做到 5 度以内日常使用足够了。还有一个细节是倾斜补偿。磁力计测量的是三维磁场如果手表不是水平放置直接计算航向角会有误差。我用加速度计的数据做了倾斜补偿把磁力计读数投影到水平面上再计算航向角。加速度计我用的是 MPU6050它同时提供加速度和角速度数据后面如果要做计步功能也能用上。5.3 传感器功耗控制与唤醒策略传感器是休眠时的电老虎如果一直供电即使主控休眠了传感器也在耗电。我的做法是用 MOS 管控制传感器的供电主控休眠前把传感器断电需要读取数据时再上电。MOS 管我用的是 AO3401导通电阻小控制简单。唤醒策略上我保留了三种唤醒源RTC 定时唤醒、按键唤醒、以及充电插入唤醒。RTC 定时唤醒用于定期刷新时间和拉取天气按键唤醒用于用户交互充电插入唤醒用于显示充电状态。其他唤醒源全部关闭避免误唤醒。这里有个经验ESP32 的 GPIO 唤醒需要配置正确的电平触发方式。我一开始配置成了高电平唤醒但按键按下时是低电平导致按键没反应。后来改成低电平唤醒并且启用了内部上拉电阻问题就解决了。这个坑很隐蔽因为代码编译不会报错只是功能不工作。6. 实测续航数据与功耗优化实录6.1 各工作模式的电流实测我用万用表串联在电池和主控之间实测了各个工作模式下的电流消耗。数据如下工作模式电流消耗持续时间备注深度休眠45μA大部分时间保留 RTC 和按键唤醒时间刷新22mA1.8s局部刷新时间区域全屏刷新28mA2.5s包含残影清除Wi-Fi 拉取天气85mA6s连接、请求、解析、关闭蓝牙同步35mA10sBLE 连接和数据传输震动提醒65mA1s番茄钟提醒根据这些数据我算了一下日常使用的续航假设每天刷新时间 1440 次每分钟一次每次 1.8 秒累计 1440 × 22mA × 1.8s / 3600s ≈ 15.8mAh天气更新 12 次累计 12 × 85mA × 6s / 3600s ≈ 1.7mAh蓝牙同步 2 次累计 2 × 35mA × 10s / 3600s ≈ 0.2mAh震动提醒 8 次累计 8 × 65mA × 1s / 3600s ≈ 0.14mAh。加上休眠电流 45μA × 24h ≈ 1.1mAh一天总消耗大概 19mAh。500mAh 的电池理论上能用 26 天左右和标称的 30 天很接近。6.2 降低刷新频率与局部刷新的实际效果把全屏刷新改成局部刷新之后每次刷新的功耗从 28mA × 2.5s 降到了 22mA × 1.8s单次功耗降低了约 43%。如果再把刷新频率从每分钟一次改成每两分钟一次只在偶数分钟刷新功耗还能再降一半。但这样时间显示会有延迟用户体验会打折扣。我最终的方案是保持每分钟刷新但只在分钟变化时刷新秒数不显示这样既保证了时间准确又控制了功耗。局部刷新的另一个好处是刷新速度更快。全屏刷新需要 2.5 秒局部刷新只需要 1.8 秒虽然差距不大但在频繁刷新的场景下累积起来的时间差异还是很明显的。而且局部刷新的视觉体验更好屏幕不会整块闪烁只有变化的部分在更新。6.3 那些偷偷耗电的隐藏问题在实际调试中我发现有几个地方会偷偷耗电如果不注意续航会大打折扣。第一个是墨水屏的 BUSY 引脚。如果 BUSY 引脚没有正确配置墨水屏可能一直处于忙状态驱动板会持续耗电。我的做法是在休眠前把 BUSY 引脚配置成高阻态避免它被拉低。第二个是按键的上拉电阻。如果按键一直处于按下状态比如外壳装配不当导致按键被压住上拉电阻会持续耗电。我在代码里加了按键状态检测如果发现按键持续按下超过 10 秒就认为异常进入休眠并忽略这个按键。第三个是 Wi-Fi 的自动重连。如果 Wi-Fi 连接失败后没有正确关闭ESP32 会一直尝试重连功耗会飙升到 100mA 以上。我在代码里加了强制关闭逻辑无论连接成功还是失败拉取完数据后都立即调用WiFi.disconnect()和WiFi.mode(WIFI_OFF)。第四个是串口输出。Serial 在休眠时如果还开着会有微弱的电流消耗。我在进入休眠前会调用Serial.end()把串口关掉。7. 外壳装配与佩戴体验的实战经验7.1 3D 打印外壳的设计要点外壳我是用 3D 打印做的材料是 PLA打印精度 0.1mm。设计的时候有几个要点一是屏幕开窗要精确墨水屏的可视区域和外壳开窗要对齐否则会遮挡显示内容二是按键位置要合理我用了三个按键分别对应上、下、确认位置在手表右侧方便拇指操作三是电池仓要留够空间500mAh 的电池尺寸大概是 30mm × 20mm × 5mm外壳内部要留出相应的空间。还有一个细节是表带的连接方式。我用的是标准的 20mm 表带接口在外壳两侧各留了一个 20mm 宽的槽表带穿过去之后用弹簧棒固定。这个设计的好处是表带可以随时更换坏了也不影响手表主体。7.2 佩戴舒适度与屏幕可读性墨水屏的可读性在室内很好对比度高不伤眼。但在户外强光下墨水屏没有背光需要靠环境光反射如果光线角度不对可能会看不清。我的做法是在表盘设计上尽量用高对比度的黑白配色避免灰色和细线条这样在大多数光线下都能看清。佩戴舒适度方面外壳的重量控制在 35g 左右不含表带戴在手上不会觉得沉。表带我用的是硅胶材质柔软透气长时间佩戴也不会不舒服。如果你对重量敏感可以把外壳做薄一点但要注意不要影响结构强度。7.3 日常使用中的小问题与改进方向用了大概两周之后我发现几个可以改进的地方。一是按键手感偏硬按下去需要比较大的力长时间使用手指会累。后来我换了更软的轻触按键手感好了很多。二是充电接口的位置不太方便USB 口在手表底部充电的时候需要把手表平放线容易折。如果重新设计我会把充电口放在侧面或者直接用无线充电。三是表盘切换的逻辑可以更智能。现在是按键循环切换如果表盘多了切换起来比较麻烦。后面我打算加一个根据时间自动切换表盘的功能比如白天用信息密集的表盘晚上用简洁的表盘。8. 代码结构与关键模块拆解8.1 主循环与状态机的组织方式整个项目的代码我用了一个简单的状态机来组织。主循环里先检查唤醒原因然后根据当前状态执行相应的任务任务完成后进入休眠。状态包括正常显示、番茄钟工作、番茄钟休息、指南针模式、设置模式。每个状态有自己的进入函数、循环函数和退出函数这样代码结构清晰也方便后续扩展。休眠前的准备工作很重要。我写了一个prepareForSleep()函数里面依次关闭 Wi-Fi、关闭蓝牙、关闭传感器电源、关闭串口、配置唤醒源最后调用esp_deep_sleep_start()。这个函数的顺序不能乱比如必须先关 Wi-Fi 再关蓝牙否则射频模块可能处于不确定状态导致休眠电流偏高。8.2 墨水屏刷新任务的调度逻辑墨水屏刷新我单独封装了一个任务调度器。调度器维护一个脏区域列表当某个区域的数据变化时把对应的区域标记为脏。主循环里检查脏区域列表如果有脏区域就调用局部刷新更新这些区域。如果脏区域累计超过一定次数就做一次全屏刷新清除残影。这个调度器的好处是避免了不必要的刷新。比如时间没变、天气没更新、电量没变化那就什么都不刷主控可以一直休眠。我实测下来这个调度器能把每天的刷新次数从 1440 次降到 800 次左右续航提升了差不多 40%。8.3 配置参数的存储与读取配置参数我存在 ESP32 的 NVS非易失性存储里包括 Wi-Fi 账号密码、天气 API 密钥、表盘索引、番茄钟时长、指南针校准数据等。NVS 的读写速度比 Flash 快而且支持键值对存储用起来很方便。需要注意的是NVS 的写入次数有限制大概 10 万次左右。如果你的代码里频繁写入配置可能会缩短 Flash 寿命。我的做法是只在配置真正变化时才写入而且写入之前先比较一下新旧值相同就不写。这样正常使用情况下NVS 的写入次数远远达不到上限。还有一个细节是 NVS 的初始化。如果 NVS 分区损坏或者第一次使用需要先调用nvs_flash_init()初始化然后才能读写。我一开始没做错误处理导致 NVS 损坏时程序直接崩溃后来加了重试和格式化逻辑问题就解决了。9. 从原型到成品的最后几步9.1 固件打包与 OTA 升级的可行性原型阶段我都是用 USB 线烧录固件但成品手表不可能每次都拆开插线。OTA 升级是必须的。ESP32 的 Arduino 框架自带 OTA 库可以通过 Wi-Fi 接收新固件并写入 Flash。我的做法是在手表上开一个简单的 HTTP 服务器手机连上手表的热点或者同一局域网后上传固件文件就能完成升级。OTA 升级需要注意的是分区表。默认的分区表可能没有给 OTA 留足够的空间需要在 Arduino IDE 里选择 Minimal SPIFFS 或者自定义分区表。我用的是自定义分区表给 OTA 留了 1.5MB 的空间足够存放固件。9.2 外壳组装与防水处理组装的时候我先把屏幕、主控板、电池、传感器分别固定在外壳的对应位置然后用排线连接。排线要尽量短避免信号干扰也要固定好避免佩戴时晃动导致接触不良。屏幕和外壳之间我加了一圈泡棉胶既能固定屏幕又能起到一定的防尘作用。防水方面我没做专业的防水处理只是在外壳接缝处涂了一层硅胶能防日常泼溅但不能游泳或洗澡时佩戴。如果你需要更好的防水可以考虑用超声波焊接外壳或者加防水胶圈但这样会增加成本和组装难度。9.3 实际佩戴一个月的稳定性观察戴了一个月之后整体稳定性还不错没有出现死机或者重启的情况。唯一遇到的问题是电池电量显示不太准有时候显示 30% 但很快就没电了。后来我重新校准了 ADC 的映射曲线把低电量段的映射做得更细问题有所改善。还有一个问题是墨水屏在低温环境下刷新会变慢。冬天在户外温度低于 5 度时刷新时间从 1.8 秒延长到了 3 秒左右。这是墨水屏的物理特性决定的不是代码问题。如果你在寒冷地区使用可以适当降低刷新频率减少低温下的刷新次数。这个项目从开始到基本可用大概花了三周时间其中一半时间花在调试墨水屏和功耗优化上。如果你也想做一个类似的墨水屏手表我的建议是先把墨水屏驱动跑通再逐步加功能不要一上来就把所有功能都堆上去。功耗优化是个持续的过程每加一个功能都要重新测一下电流确保续航不会崩掉。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询