开源智能手表这两年冒出来不少,但多数方案不是屏幕耗电太快,就是功能堆得很满实际续航拉胯,真正能当日常表戴在手腕上的不多。我手里这套基于 Arduino 生态、墨水屏显示、支持蓝牙和 Wi-Fi 的开源手表方案,算是少数能把"长续航"和"可玩性"同时兼顾的一套。
用一句话概括:花一两百元把零件买齐,焊一块能自定义表盘、看实时天气、开番茄闹钟、用指南针的极简智能手表,然后自己改代码继续折腾。对想入门嵌入式开发、熟悉 Arduino、或者单纯想要一块不天天充电的表的人来说,这项目都很值得动手。下面从项目拆解、选型逻辑、硬件组装、软件实现到问题排查,把整套东西讲透。
1. 这套开源手表到底是个什么东西
1.1 拆解标题里的关键词
标题里每一个词都不是营销噱头。"墨水屏"决定了这块表的省电上限,"Arduino 编程"决定了它的改造成本和可玩性,"蓝牙 Wi-Fi"用来解决数据同步和联网,"番茄闹钟"和"指南针"则让这块表在脱离手机后依然有一点独立工具属性。
墨水屏的显示原理是双稳态电泳,画面显示出来后,即使完全断电,屏幕上的内容依然保留。这一点和普通 LCD 或者 AMOLED 屏幕完全不同,后者断电就黑屏,前者断电后字还清清楚楚停在屏上。正是这个特性,让手表的待机功耗可以压到非常低。日常使用中,屏幕只在内容变化时才通电刷新,平时什么都不干,耗电自然就低。我实测下来,这块表单纯当时间显示工具用,充满一次电跑一个月左右完全现实,前提是别频繁刷屏。
蓝牙和 Wi-Fi 在手表里的分工需要说清楚。蓝牙主要承担手机连接、消息通知和低功耗数据同步,适合低频小数据量通信。Wi-Fi 则是在没有手机或者需要拉取天气、校时、同步较大数据时临时打开,用完立即关掉。很多人把这两者混为一谈,其实在嵌入式设备里,Wi-Fi 常年开着就是续航杀手,蓝牙常年开着功耗相对可控。这套开源方案的典型策略就是:蓝牙保持广播或低功耗连接,Wi-Fi 按需启动,任务完成立刻断电。
表盘自定义这件事,本质上是把图片或代码绘制的图形转换成墨水屏控制器能识别的像素数据。开源社区给了很多现成的取模工具和 UI 框架,所以不需要自己从零写像素操作。只要你能画图,或者会用基础绘图指令,就能把表盘换成自己想要的样子。我见过有人把自家猫的照片转成二值图当表盘,也见过有人把日程表直接画在屏幕上,玩法很多。
1.2 为什么选择 Arduino 平台而不是其它方案
这个问题我被人问过很多次。既然要做低功耗智能手表,为什么不用更专业的低功耗芯片平台,而是用 Arduino?答案很简单:生态和门槛。
Arduino 最大的价值不是那颗主控芯片本身,而是围绕它积累的大量开源库、示例代码和社区经验。墨水屏驱动有现成库,蓝牙协议栈有现成封装,低功耗睡眠也有现成接口,甚至很多传感器都有人写好了驱动。对一个想自己动手做手表的人来说,这意味着不用从数据手册的寄存器级开始啃,能省下大量时间。
当然 Arduino 平台也有明显的短板:内存小、算力弱、多任务处理能力差。所以在这套手表中,任务调度往往是单线程轮询加定时唤醒的模式,不能像手机系统那样跑复杂的并发任务。但也正因如此,这种限制逼着你用最低的功耗完成最核心的功能,反而符合穿戴设备的需求。
GitHub 上这类开源手表项目的代码结构都比较清晰,通常在 main 文件里做初始化,然后在主循环里检查事件标志位,根据需要刷新屏幕或者上报数据。整个代码体量不大,哪怕你是第一次接触 Arduino,看完一遍也能大概明白运行逻辑。这就是"Arduino 编程智能手表"对新手友好的地方:它没有晦涩的操作系统层,只有简单直接的硬件操作。
2. 选型思路与低功耗续航原理
2.1 墨水屏为什么是手表续航的关键
经常有人问,为什么不用 OLED 屏幕?OLED 显示黑色确实省电,但只要显示内容复杂一点,亮着的像素仍然持续耗电。而且 OLED 的烧屏问题在手表这种长时间显示静态画面的场景下特别突出。墨水屏的好处是,显示任何内容都不需要持续供电,显示"12:30"和显示一张复杂图片,静态功耗一样是零。
拿一块 1.54 英寸的墨水屏和一块同尺寸 OLED 对比:OLED 全亮时的功耗能到几十毫瓦,而墨水屏只有在刷新瞬间才需要几十毫瓦,刷新完成后功耗直接趋近于零。假设一天亮屏 3 分钟,墨水屏一天下来屏幕耗电几乎可以忽略,OLED 一天下来累计功耗就不小了。按一块 300mAh 的电池算,OLED 方案的续航通常只有两三天,墨水屏方案则轻松按周或按月计算。
不过墨水屏也有代价:刷新速度慢。全刷一次大概需要 1 到 2 秒,而且刷新过程中有闪烁现象。对于手表这种显示内容变化不频繁的场景,这个缺点可以接受;但如果你想拿它看动画或者频繁切换界面,体验就会很糟糕。所以这套开源手表在软件设计上会刻意减少全屏刷新次数,能用局部刷新就用局部刷新,能推迟刷新就推迟刷新。
墨水屏还有一点需要注意,它有"残影"效应:刷新后上一帧的画面会有浅淡残留。温度越低越明显,刷新越快越明显。解决方案一般是定时做一次"全刷加反白"来清除残影,但这会带来额外的耗电和闪烁。为了平衡续航和显示效果,很多开源方案的做法是:局部刷几次之后,强制来一次全刷。这个策略有点类似屏幕保护机制,需要根据实际环境调参数。
2.2 从元器件到算法:30天长续航是怎么来的
要理解 30 天续航,先算一笔功耗账。手表整机的待机功耗可以拆成几个部分:主控睡眠电流、屏幕刷新功耗、蓝牙广播或连接功耗、Wi-Fi 工作功耗、传感器采样功耗。
主控睡眠电流这一项,选低功耗主控是关键。好的低功耗芯片在深度睡眠模式下电流可以低到微安级别,个别型号甚至能到 1 到 2 微安。电源路径上如果加了 LDO 稳压或充电保护板,漏电还会增加一点,但整体可以控制在 10 微安左右。这部分不会显著消耗电池。
真正的耗电大头是通信和刷新。蓝牙如果一直保持连接,功耗在几毫安到几十毫安之间波动;Wi-Fi 连接时功耗能到上百毫安。但这套手表的策略是:蓝牙大部分时间处于广播或休眠状态,只在需要同步数据时短暂唤醒;Wi-Fi 更是只在获取天气或校时的时候打开几秒,之后立刻关闭。屏幕刷新虽然单次电流大,但次数少,假设一天刷 200 次,每次平均 1 秒,一天也才消耗几毫安时。
综合下来,一天平均功耗大概在 3 到 6mAh。一块 300mAh 电池,理论续航 50 到 100 天,但实际还有很多杂散损耗,最终能做到 30 天已经是很稳的结果。我在实际测试中,把 Wi-Fi 同步频率降到两小时一次、蓝牙通知只保留重要消息,表盘刷新次数控制在每分钟一次以内,续航可以跑到 35 天左右。如果你把亮度、刷新频率和同步频率全都调到最激进,续航掉到一周以内也不奇怪。所以"30天续航"是有条件的,前提是软件功耗策略做得好,而不是直接硬件决定了结果。
3. 硬件清单与组装过程
3.1 核心 BOM 清单与选型避坑
这套开源方案选硬件其实没那么复杂,核心部件就几样:主控、墨水屏、电池、充电管理、传感器。
主控推荐带蓝牙功能的低功耗 MCU,常见的选择是 nRF52840 或者 ESP32。如果你的重点是低功耗和蓝牙稳定,nRF52840 更合适,它在睡眠电流和射频功耗方面做得很好;如果希望在本地做更多计算、或者想更简单地把 Wi-Fi 也集成进来,ESP32 更省事,因为模块本身就带 Wi-Fi 和蓝牙双模。缺点是 ESP32 的睡眠电流偏大一些,实际续航会比 nRF 方案短。选哪个取决于你是"续航优先"还是"功能优先"。
墨水屏的选择上,1.54 英寸是主流,尺寸适中,驱动简单,资料也多。想要更大的显示面积可以考虑 2.13 英寸或 2.9 英寸,但刷新时间更长、外壳设计也更麻烦。买屏幕时一定要确认驱动芯片型号,因为不同芯片的初始化代码和命令接口不一样。常见的有 SSD1680、SSD1681、UC8176 这些,开发时记住自己那块屏幕的驱动型号,库里面直接对应选择。
电池方面,300 到 500mAh 的聚合物锂电比较合适。太小了续航体现不出来,太大了表体厚重,戴着不舒服。注意电池要选带保护板的,避免过充过放把电池搞鼓包,特别是用户自己焊接充电电路时。充电管理模块常见的是 TP4056 这类方案,虽然简单,但充电时发热明显,充电电流建议设置在 500mA 以内。
其它器件还需要:一个六轴或九轴传感器用来做指南针和计步,常见型号有 QMC5883L、HMC5883L 或 MPU9250;一个蜂鸣器或者震动马达用于闹钟提醒;可能还要加一两个按键用于交互切换界面。元件清单整体成本控制在 150 元左右,没有特别贵的东西。
3.2 焊接装配要点与屏幕排线注意事项
把零件焊到主控板上是整套流程里最容易翻车的一步,尤其是屏幕排线。墨水屏模组常见的接口是 FPC 排线,需要用转接板或者自己焊接。FPC 焊盘间距很小,烙铁温度不够或者焊接时间太长,很容易把焊盘烫脱落。我踩过最大的坑就是屏幕排线焊好后怎么都不显示,排查了半天,最后发现是排线的焊盘虚焊,表面看着连上了,实际上只是搭在焊盘边缘。
几个实打实的经验:焊接排线之前,先在焊盘上薄薄上一层锡,然后用助焊剂浸润排线触点,再把排线压上去用烙铁快速拖焊。温度控制在 320 摄氏度左右,时间不要太长。焊完别急着上电,先用万用表通断档逐个检查相邻引脚有没有短路,特别是电源引脚和信号引脚之间。墨水屏对静电比较敏感,操作前最好戴防静电手环,或者在接触屏之前先摸一下金属物体放掉身体静电。
主控模块和传感器的焊接相对容易,但要注意模块天线区域附近不要覆盖大面积铜箔或者被金属外壳完全包住,否则蓝牙和 Wi-Fi 信号质量会断崖式下降。我遇到过手表放桌上信号正常、一戴到手腕上就断连的问题,后来发现是金属表带影响了天线辐射,换成皮质表带后问题消失。天线布局问题在装配阶段就要考虑,而不是等测试阶段才发现。
电池连接优先选 JST 插座或者带插头的电池线,千万别把电池线直接焊在主板上,否则以后拆机换电池要动烙铁,非常麻烦。另外电池引线正负极最好用不同颜色,或者贴上标签,防止插反烧掉主板。这个错误我身边不止一个人犯过:电池插反后主控芯片发热,屏幕没有反应,最后只能换板子。
4. 软件与功能实现
4.1 从 Arduino 环境到第一块表盘
软件部分的第一步是把 Arduino 开发环境配置好,然后把项目代码烧录进主控。如果你用 nRF52840,需要在开发板管理器中安装对应的板卡支持包;如果是 ESP32,需要安装 ESP32 板卡支持包。这一步每个开源项目的 README 里都会写得很详细,照着操作即可。重点提醒一句:串口驱动一定要装好,否则电脑识别不到开发板,会让很多新手误以为板子坏了。
烧录完基础示例程序之后,屏幕能亮,手表才能算"活了"。很多新手会直接去改表盘代码,结果发现屏幕各种显示异常,比如只显示一半、有残影、字体重影。这些问题通常不是代码逻辑错了,而是刷新模式没配对。墨水屏有两种刷新模式:全刷和局部刷。全刷显示效果干净但闪烁明显;局部刷速度快但会产生残影。表盘设计时要区分:静态背景用全刷,时间数字变化用局部刷。这个思路直接关系到手感,值得认真调试。
设计第一块表盘,我的建议是先别急着放图片,直接从简单的数字时钟开始。在主循环里读取 RTC 或者网络时间,然后通过图形库在固定坐标绘制时分秒数字。搞清楚基本的坐标计算之后,再加入日期、天气、电池图标等模块,一层一层往上叠加。千万别一上来就做一个复杂的大表盘,调试排错会很痛苦。
代码结构上,推荐把界面绘制、数据获取、传感器读取、电源管理拆分成不同模块文件,保持逻辑清晰。Arduino 项目虽然入口是 .ino 文件,但你完全可以在同一个目录下创建多个 .cpp 和 .h 文件,让代码有更强的可维护性。后期如果要增加新功能,这种结构会让你省很多事。
4.2 表盘自定义:图片转换、布局与刷新策略
真正的自定义表盘通常有两种实现路径:一是用代码绘制,二是直接用位图图片。代码绘制的优点是体积小、改起来灵活,缺点是你需要懂基础的图形坐标;位图图片的优点是好看、设计自由度大,缺点是需要把图片转成适合墨水屏显示的格式。
如果你选位图路线,建议大家把图片做成黑白的 XBM 格式或者直接生成 C 语言数组。工具有现成的,输入图片后设置阈值做二值化,然后输出数组代码。这里有个很容易踩的坑:图片分辨率要和屏幕分辨率一致,否则显示会错位或者被截断。比如 1.54 英寸屏常见分辨率是 200x200,你就要先裁剪成同样大小再做转换。还有一个细节,墨水屏的黑白显示和普通图片的灰度有差异,深灰色区域可能会直接变黑,浅灰色区域可能变白,所以设计素材时尽量用纯黑纯白,不要依赖中间调。
局部刷新策略需要单独讲一下。手表上最常用的表盘是数字时钟,数字变化只占屏幕的一小块区域。如果整块屏幕每秒全刷一次,不仅闪烁严重,续航也会崩。正确做法是:记录上一次刷新的区域,在数字变化时只更新那一小块像素,其他区域保持不变。很多墨水屏驱动库提供了这种局部刷新接口,比如指定区域坐标范围进行更新。你只要在每次时间来临时计算出新的数字坐标,调用局部刷新即可。
为了进一步省电,还可以在不需要变化的时候让主控进入深度睡眠模式。比如每 10 秒醒来一次,读取时间并判断是否需要刷新,如果显示内容没有变化,就直接继续睡。大部分嵌入式低功耗开发都会用这种"事件驱动加定时唤醒"的机制,比在主循环里死循环要省电得多。
4.3 天气、时间与闹钟:云端数据怎么进屏幕
表盘有了,接下来让手表"联网"和"有点用",就要做天气、时间同步和一些小工具。
时间和日期,推荐用 NTP 协议从授时服务器获取。手表上电后,通过 Wi-Fi 连接网络,发出 NTP 请求,收到返回的时间戳后换算成当地时间,写入 RTC 芯片或者主控内部的计时器。之后即使断网,只要电池不断电,时间也能持续走。需要注意时区设置,不然显示出来的时间永远差几个小时。如果在国内使用,要设置东八区偏移;如果代码里没有做时区处理,就需要自己加一个偏移值。
天气数据的获取,通常是调用一个免费天气 API,返回 JSON 格式的温度、天气状况等信息。嵌入式设备内存小,处理 JSON 时不能像手机那样直接全套解析,一般用轻量级的 JSON 解析库,提取关键字段后立刻释放内存。手表获取天气的时机也要讲究,没必要每小时都拉一次数据,那样 Wi-Fi 功耗会直线飙升。我建议一天拉三次,早中晚各一次,甚至可以根据你的作息固定在起床和午休时间。
Wi-Fi 模块的节能逻辑是整套软件优化的重中之重。最简单的做法是:在获取天气或校时之前,打开 Wi-Fi,连接网络,发请求,收完数据立刻执行 Wi-Fi 断开操作。不要在获取完数据后继续挂着 Wi-Fi 等待,否则功耗很容易高出几十倍。从用户角度,天气刷新一次也就几秒钟,完全感知不到延迟,但续航差别非常明显。我在实测中发现,如果 Wi-Fi 一直保持连接,手表续航会从三十天降到不到一周,差距就是这么大。
番茄闹钟和指南针就相对独立了。番茄钟本质是一个计时状态机:设定 25 分钟倒计时,倒计时结束后触发蜂鸣器或震动提醒,然后进入 5 分钟休息倒计时。状态显示在表盘上,用户通过按键切换开始、暂停、重置。实现上并不复杂,但要注意在倒计时过程中保持屏幕显示的同时尽量降低功耗,可以用低频率刷新倒计时数字,而不是每秒刷新一次。指南针功能则依赖磁力计传感器,读取三轴磁场数据后,通过反正切函数算出方位角。磁力计必须做校准,否则读数在转动手腕时会严重漂移,具体校准方法在后面的排查部分细讲。
5. 测试、问题排查与经验实录
5.1 常见问题速查表
实际装完这块表、跑了一段时间之后,我整理了几个高频问题,基本覆盖了大多数新手会遇到的情况,直接给结论:
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 屏幕不显示 | 排线虚焊、驱动型号选错、供电不足 | 用万用表检查排线通断,核对屏幕驱动型号,确认电池电压 >3.3V |
| 屏幕闪烁严重 | 使用了全刷模式刷时间 | 改为局部刷新,仅更新数字变化区域 |
| 显示残影明显 | 局部刷新次数过多、低温环境 | 每刷 30 次左右强制全刷一次,等待屏幕温度回升 |
| 续航远低于 30 天 | Wi-Fi 未关闭、刷新过于频繁、未进入睡眠 | 检查代码中 Wi-Fi 是否主动断开,降低刷新频率,配置深度睡眠 |
| 蓝牙连接不稳定 | 天线被金属遮挡、固件功率设置过低 | 换非金属表带,检查蓝牙发射功率寄存器配置 |
| 指南针方向漂移 | 未做硬磁校准、靠近磁源 | 执行八字形校准,远离表带磁扣和手机 |
| 充电不进去 | 充电电流设置过大、保护板问题 | 将充电电流降到 500mA 以下,检查保护板是否正常输出 |
| 时间不准 | 未做 NTP 同步、RTC 晶振精度不够 | 每天至少同步一次 NTP,更换高精度 32.768k 晶振 |
这张表里的很多问题,初期调试时几乎每个人都会遇到。排线虚焊是最痛苦的,因为问题时有时无,刷新一下可能又好了。建议焊接完之后做"弯折测试":轻轻弯一下排线,观察屏幕是否正常。如果哪里有异常,就是那个位置虚焊了。
指南针校准这里多写两句。磁力计校准的核心是消除"硬磁偏移"和"软磁干扰"。最简单的方法是在程序里进入校准模式,然后手持手表在空中画"8"字,让传感器采集足够多的方向数据,程序自动计算出偏移量和增益补偿。校准完成后把参数保存到 Flash,下次开机直接读取。不校准的数据误差可能达到几十度,校准之后基本能到正负 5 度以内,日常使用没问题。
5.2 实测续航与省电优化细节
我拿这套开源方案做了两轮实测。第一轮是默认配置,Wi-Fi 每一小时连一次,蓝牙保持连接,屏幕每分钟刷新一次,最终续航大约 18 天。第二轮做了一些调整:Wi-Fi 改成每天只连三次,蓝牙设置成只在收到手机通知推送时才唤醒,屏幕只在整点和半点刷新,最终跑出了 36 天。可见软件策略对续航的影响远大于硬件选型。
省电优化里最容易被忽略的是电源管理芯片的静态电流。很多开源手表方案用现成的开发板,开发板上面除了主控之外还有 USB 转串口芯片、电压转换芯片,这些芯片的静态电流加起来可能比主控睡眠电流还要大。如果要在量产或长期使用中追求极致续航,建议直接画一块精简的 PCB,把用不到的调试电路全部去掉,而不是继续用开发板。自己画板子也不难,很多开源项目的硬件源文件可以直接参考。
还有一个小细节:屏幕刷新时电压转换电路会产生瞬时大电流,如果电池内阻大或者电量不足,屏幕刷新瞬间主控可能会复位。表现就是屏幕刚要出内容,手表突然断电重启。解决方法是给屏幕供电并联一个较大的电容,比如 100 微法以上,并且尽量让主控和屏幕的电源走线短粗一些。这个问题在电池快没电时最容易触发,排查顺序一般是:先看电池电压,再看电源走线,最后看是否缺少储能电容。
6. 这项目还能怎么玩
6.1 扩展方向
如果基础版手表做好了,玩法其实很多。我见过有人给它加了光学心率传感器,做成运动手表风格;有人加了震动马达和日历模块,变成纯待办提醒工具;还有人把电路板尺寸缩小,塞进怀表壳里做成桌面摆件。这套方案最舒服的一点是,几乎所有硬件模块都有开源库和资料,扩展的难度不大。
软件层面的扩展空间更大。比如做一个手机端 App,用蓝牙把手机上收到的消息转发到表盘上显示,这就是一个标准的消息通知系统。还可以做一个小程序,把日程、天气、待办事项打包同步给手表,让手表成为信息展示终端。开源社区里还有人做了表盘生成网站,你在网页上拖拽组件,导出代码,直接粘贴进工程就能用,已经非常接近商业手表的表盘商店体验了。
低功耗这一块也能更进一步。如果主控支持 NFC,可以尝试做贴近手机一碰传数据;如果想加无线充电,要重新设计后盖并且注意充电线圈对指南针磁力计的干扰,这个坑需要提前预留屏蔽措施。这些扩展都在现有硬件基础上进行,不需要推倒重来。
6.2 个人经验与最终建议
最后分享几条个人经验,供正准备动手的朋友参考。
第一,不要一上来就追求最小体积或者最薄表体,先保证功能稳定,再考虑缩小尺寸。很多新手第一步就把电路板打磨得很极限,结果屏幕排线、电池连接全都挤在一起,信号和散热都出问题,最后不得不重做。第二,软件的功耗调优建议从头就做,不要等硬件全焊好了再去想省电策略,否则很多硬伤没法改。第三,如果你是纯粹想要一块"能用"的手表,不想投入太多时间调试,那这个项目可能不适合你;但如果你想通过一个完整项目掌握嵌入式开发、低功耗设计和软硬件联调,这个手表值得做一遍。
我自己做完这块表的最大收获,不是戴上了自己焊的智能手表,而是彻底理解了低功耗设备设计里的每一个选择都是怎么影响最终体验的。墨水屏省电、蓝牙适合作息同步、Wi-Fi 定时唤醒、传感器按需采样,这些听起来很虚的概念,在亲手调过续航曲线之后,会变成一种直觉。后续你再去看任何智能硬件方案,一眼就能看出哪里在省电、哪里在浪费电。这个能力是教材给不了的。