ESP32 DIY智能手表实战:从需求拆解到低功耗优化全记录
说实话一开始我只是想要一块看起来老老实实的电子表能在手腕上偷偷看一眼通知、不用掏出手机的那种。市面上的产品要么是纯电子表没有智能功能要么是智能手表做得太“大屏”戴在手腕上完全不像一只表。直到我把目光投向 ESP32——手头刚好有一块 ESP32-C3 Super Mini 主板和一块 0.96 寸 OLED 屏幕于是这个 DIY 智能手表项目的雏形就这么定下来了。这篇文章不是一篇“照着焊完就能用”的教程它更像我做完这块表之后的完整复盘从需求拆解、硬件选型、屏幕驱动、外部中断唤醒、低功耗处理到真正戴上手腕后暴露出来的一堆问题。如果你手里有一块 ESP32 开发板想做一个真能戴出门的“伪智能手表”又不想把它变成一块大号手机屏那这篇文章应该能帮你少走很多弯路。1. 从“想要一块电子表”到“决定自己做”需求拆解与硬件选型1.1 先把需求落到纸面再谈买什么很多 DIY 项目翻车不是因为动手能力不行而是因为一开始就没想清楚自己到底要做什么。做手表尤其如此因为手表的核心约束不是“能做什么”而是“在这么小的空间和电池里能撑多久”。我给自己列的需求清单是这样的看起来像一块传统电子表而不是一块缩小的手机屏幕时间显示是基础功能必须精确最好能自动校时显示日期、星期偶尔看看倒计时和秒表翻腕能亮屏这个动作要自然不需要按键手机来消息时手表能震一下、显示一个摘要续航目标至少 3 到 4 天不能每天充电。列完之后你会发现真正核心的需求只有三个精确的时间、方便的亮屏交互、过得去的续航。消息通知属于加分项不是必须项。我建议你也按“核心功能—增强功能—理想功能”三级来拆因为选型和功耗优化都要靠这套优先级来决策。1.2 为什么选 ESP32而不是 STM32 或 nRF52840这块表的核心主控我选的是 ESP32 系列。对比一下你就明白为什么了主控性能/内存无线能力生态门槛单价适合度ESP32 经典款双核 240MHz520KB RAMWiFi BLEArduino 生态极成熟10-20元适合入门但体积偏大ESP32-C3单核 RISC-V 160MHz400KB RAMWiFi BLE 5Arduino/PlatformIO 都支持6-15元尺寸小、功耗适中我最推荐nRF52840Cortex-M4F256KB RAMBLE 5无 WiFi生态偏底层上手慢40元以上低功耗强但学习成本高STM32性能强无无线需外挂需要自己造轮子10-20元不合适无线和蓝牙都要自己搞我的结论很简单ESP32-C3 在“能联网校时”和“体积够小”之间找到了一个很好的平衡点。WiFi 虽然耗电但只在开机校时那几秒用一次平时关掉完全可以接受。BLE 通知是加分项它本身也有。u8g2、Adafruit SSD1306、ADXL345 这类库在 Arduino 生态里都是装完就能跑省掉大量底层开发时间。1.3 屏幕选型决定了这块表的“表味”屏幕是一块手表的脸。我实测过三种方案最后留下了 SSD1306 驱动的 0.96 寸 128x64 I2C OLED。0.96 寸 OLED大约 8 块钱一颗。工作电流 10-30mA 左右全部像素点亮也就几十毫安支持局部刷新驱动库成熟u8g2 直接就能画图形和文字。1.8 寸 TFT LCD颜色好看但背光电流轻松上百毫安而且屏幕本身厚根本塞不进行程有限的表壳。驱动代码也更复杂不推荐在手表上用。墨水屏功耗确实极低但是 1-2 秒的刷新速度让“秒针”这个最基本的时间显示都做不了除非你愿意看一个每 5 秒跳一次的数字时钟。最终我选的是 0.96 寸 I2C OLED原因很简单功耗在可接受范围内、代码难度低、视觉上和电子表风格的字体非常搭。1.4 按键与外部中断低功耗场景下轮询是死路表壳上按卡西欧的风格至少需要四个按键Mode、Start、Reset、Light。每个按键都要能用途中唤醒手表。大多数人刚接触单片机时会直接在loop()里轮询按键这在小屏幕上没问题但在手表上有一个致命问题你在睡眠时 CPU 是停的怎么轮询一个没有电的 CPU所以这里必须用外部中断。按键按下时GPIO 电平变化会从睡眠模式唤醒 ESP32CPU 再起来处理按键逻辑。ESP32-C3 的gpio_wakeup_enable可以直接把按键配置成唤醒源这是我在这个项目里学到的最重要的一课后面会专门展开讲。1.5 电池与充电方案的取舍电池我选的是聚合物锂电池容量 500mAh尺寸大约是 502535厚度和一块手表后壳差不多。充电模块用经典的 TP4056充放电保护都在模块上简单可靠。容量估算很容易先估平均电流再除以电池容量。比如你的平均电流是 2mA500mAh 理论上就是 250 小时约 10 天。实际打折扣因为电池容量标称值在低温和高电流下会缩水。所以我一开始就把目标定为平均电流 3mA 以内而不是先定一个好看的功耗数字再倒推。2. 让 ESP32 跑起来不难难的是在一只表壳里活着核心原理与底层设计2.1 时间从哪来SNTP 校时与 RTC 兜底手表的核心是时间。ESP32 内部有一个 RTC实时时钟但是断电之后它会丢失计数而且它的精度受温度影响长时间跑下来一天差个几秒很正常。所以我的方案是开机后只要 WiFi 一连上立刻用 SNTP 协议去网络时间服务器校时之后再用内部 RTC 维持秒级计时。Arduino 框架下 SNTP 校时其实很简单#include WiFi.h #include time.h void syncNTP() { configTime(8 * 3600, 0, ntp.aliyun.com, pool.ntp.org); struct tm timeinfo; while (!getLocalTime(timeinfo)) { delay(500); } // 同步成功后面的 display 刷新区块用的都是 localtime }等到 7 天之后你会发现内部 RTC 会积累大概几十秒的偏差所以我的固件里加了一个“每周自动校时一次”的逻辑周日凌晨 3 点连一次 WiFi重新同步然后把 WiFi 关掉。这个策略可以在不自弃的情况下保证手表长期走时误差不超过 1 秒。如果你不想依赖 WiFi 校时也可以外挂一颗 PCF8563 RTC 芯片I2C 接口大概 2 块钱断电后由一枚 CR1220 纽扣电池兜底。我的做法是两者都加了正常情况下用 PCF8563 保证精确时间每周用 SNTP 校准 PCF8563。这一层冗余让我这块表哪怕断电重刷固件时间也不会变成 1970 年。2.2 外部中断实战按键唤醒、翻腕亮屏与 ISR 的正确姿势这块手表的所有“醒过来”的动作全是靠外部中断实现的。包括按键唤醒按键按下GPIO 被拉低电平触发中断ESP32 从 light sleep 中醒来翻腕亮屏三轴加速度计 ADXL345 检测到手腕转动通过它的 INT1 引脚输出一个高电平把 ESP32 的 GPIO 唤醒消息通知BLE 的 notify 回调线程唤醒应用层显示。先看按键唤醒最基础的写法#include esp_sleep.h #define KEY_MODE_GPIO GPIO_NUM_0 #define KEY_START_GPIO GPIO_NUM_3 void setup() { pinMode(0, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); // 低电平触发唤醒适用于按键接 GND 的情况 gpio_wakeup_enable(KEY_MODE_GPIO, GPIO_INTR_LOW_LEVEL); gpio_wakeup_enable(KEY_START_GPIO, GPIO_INTR_LOW_LEVEL); esp_sleep_enable_gpio_wakeup(); } void loop() { // 正常显示逻辑... if (millis() - lastActive 10000) { esp_light_sleep_start(); // 进入 light sleep等待外部中断唤醒 } }这里我要强调一个新手特别容易踩的坑中断服务函数ISR里千万不要做耗时操作。比如读取 ADXL345 需要走 I2CI2C 通信在中断里做极其危险容易撞上总线忙导致主循环卡死。我在第一版固件里就这么写过后来发现每次翻腕亮屏后偶尔十几秒后系统就假死。原因是 ISR 里 I2C 读操作被打断总线状态进入了死锁。正确做法是 ISR 里只设置一个全局标志位volatile bool actFlag false; void IRAM_ATTR onActivity() { actFlag true; } // 主循环里再处理 void loop() { if (actFlag) { actFlag false; readAccel(); turnOnDisplay(); } }翻腕亮屏我用的 ADXL345 的 activity 中断。它的寄存器设置是这样做的// 开启活动检测阈值 0.7g持续 40ms writeReg(ADXL345_THRESH_ACT, 0x05); // 0.7g 左右 writeReg(ADXL345_ACT_INACT_CTL, 0x71); writeReg(ADXL345_INT_ENABLE, 0x10); // 使能 activity 中断 writeReg(ADXL345_INT_MAP, 0x00); // INT1 引脚输出2.3 低功耗策略light sleep、deep sleep 与不必要的“待机电流”手表这种设备最大的敌人是静态电流。我第一版固件在没有做任何电源管理时修好之后实测待机是 26mA这个数字直接把 500mAh 电池干到了 19 小时。后来我逐步优化最后稳定在“显示时 22mA、light sleep 时 1.5mA、deep sleep 时 35uA”的状态。先看这套低功耗策略的组成CPU 降频ESP32-C3 最高 160MHz我在setup()里把主频降到 80MHz对显示和按键处理完全没影响但功耗能降 20%OLED 断电用手腕上的“Light 键”控制一颗 P 沟道 MOSFET把 OLED 的 VCC 彻底切断而不是让屏幕自己休眠。OLED 即使显示全黑驱动 IC 也在耗电切断供电才能接近零电流WiFi 用完即关只在开机校时和手动同步时打开校完立刻WiFi.disconnect(true)否则 WiFi 待机电流 100mA 级别手表根本没法带light sleep 作为日常状态平时显示 10 秒后自动熄灭屏幕CPU 进 light sleep随时可以被按键和翻腕唤醒deep sleep 作为长按关机长按 Mode 键 3 秒进入 deep sleep此时整机只有几十微安可以放一周还能存活。实测电流变化我记录过一张表这个数据对我后续所有调优都有帮助工作状态实测电流说明屏幕常亮 WiFi 连着~130mA电池顶不住仅在调试时用屏幕常亮 WiFi 关闭~22mA日常显示状态屏幕关闭 light sleep~1.5mA等待按键或翻腕唤醒deep sleep~35uA关机待机模式2.4 显示刷新策略不要把整个屏幕每 100ms 刷一遍OLED 的功耗其实不只是“亮着”的功耗刷新频率也会影响 CPU 占用和整体功耗。u8g2 库的sendBuffer()会把整个 128x64 缓冲区刷一遍虽然速度很快但如果每 100ms 刷一次CPU 负载和总线活动都会显著升高电池也扛不住。我的做法是“局部刷新”。既然秒级变化只发生在右下角几像素范围内那就只在那一小块区域调用u8g2.drawStr()其他区域不动。U8G2 有setDrawColor(2)和部分更新接口但不是所有字体都支持局部更新所以我直接采用了更简单的办法把界面分区每个区单独维护一个“脏标记”只有脏区域才重画。if (secChanged) { u8g2.drawStr(100, 40, secStr); // 只更新秒区域 } if (minChanged) { u8g2.drawStr(70, 40, minStr); // 只更新分钟区域 } u8g2.sendBuffer();这样做的好处是 CPU 空了非常多系统大部分时间都在esp_light_sleep_start()里睡大觉。3. 三步搭出原型外壳加工、电路连接与固件烧录3.1 表壳改造怎么把一个开发板塞进一块电子表壳外壳是整个项目里最容易被低估的部分。我一开始以为代码写完就大功告成结果发现电路板、屏幕、电池这三样东西要同时塞进一块厚度不到 15mm 的表壳里难度完全不亚于软件调试。我用的方案是“买现成的卡西欧 F-91W 同款透明表壳 3D 打印后盖替换”。具体操作是先把 OLED 屏幕用 3M 双面胶固定到表盘正中央排线沿着表壳内侧走电池放在屏幕正下方502535 尺寸刚好能塞进表壳底部主板叠在电池上方用亚克力片做一层绝缘支撑后盖用 3D 打印重新设计厚度加高 3mm给电路板留出呼吸空间。3D 打印参数可以参考PLA 或 PETG 材质层高 0.2mm填充 20%后盖不需要很高强度。注意摄像头位置不要和表带安装孔重叠否则安装表带螺丝会顶到电路板。开充电口也是个细活。我用小锉刀和模型钻头在表壳侧面打了个 Type-C 口但第一次因为转速太高直接把边缘钻裂了。后来学乖了先用电烙铁沿着 USB 口边缘烫一圈软化塑料再用锉刀慢慢修这样就不会裂。3.2 电路连接与引脚分配表电路连接讲究“先列引脚、再接线”。ESP32-C3 Super Mini 的引脚很少但每个引脚都有自己的脾气比如 GPIO0 是 BOOT 引脚GPIO1 是 TXGPIO2、GPIO3、GPIO4、GPIO8 都是普通 IOGPIO9 是 RX。我的分配如下功能ESP32-C3 引脚备注OLED SDAGPIO8I2C SDA板上拉或外接 4.7kOLED SCLGPIO9I2C SCLOLED 电源控制GPIO10控制 P-MOSFET 栅极ADXL345 INT1GPIO2翻腕唤醒源按键 ModeGPIO0内部上拉按下接 GND按键 SelectGPIO1内部上拉按键 StartGPIO3内部上拉按键 LightGPIO4内部上拉同时也控制 OLED 供电接线时注意两点一是 I2C 总线上拉电阻。OLED 模块本身通常有 4.7k 上拉但如果你的 OLED 是裸屏或转接板没有上拉需要自己加 4.7k 到 3.3V。不加上拉会出现随机花屏和通信失败。二是电源去耦。WiFi 开启瞬间 ESP32 会拉大电流可能导致电池电压瞬间跌落OLED 就会闪一下黑屏。我的解决办法是在电池两端并联一颗 470uF 电解电容在 OLED VCC 和 GND 之间并联一颗 100uF 电容电压跌落问题当场解决。3.3 固件开发环境Arduino IDE 离线包与 PlatformIO 二选一这个项目用 Arduino IDE 完全够用我一开始用的也是它但是后来因为长时间编译等待太痛苦换成了 PlatformIO。如果你坚持用 Arduino IDE第一步是添加 ESP32 开发板管理器地址。在“文件-首选项-附加开发板管理器网址”里填入https://espressif.github.io/arduino-esp32/package_esp32_index.json然后在“开发板管理器”里搜索esp32安装 esp32 2.0.11 版本即可。如果网速不好也可以下载离线包手动放到~/Library/Arduino15/packages/目录。PlatformIO 的配置更清爽platformio.ini长这样[env:esp32-c3-devkitm-1] platform espressif32 board esp32-c3-devkitm-1 framework arduino board_build.f_cpu 80000000L monitor_speed 115200有不少人问我在 PlatformIO 里怎么选 ESP32-S3 核心板答案是board esp32-s3-devkitc-1然后在配置里加board_build.flash_mode qio和board_build.psram enable即可。ESP32-C3 Super Mini 对应的是esp32-c3-devkitm-1不需要额外设置。烧录失败是新手最常遇到的问题。现象一般是点上传后一直卡在Connecting...端口不停跳变。解决顺序是换一根确定能传数据的 USB 线很多线只能充电进入下载模式按住 BOOT 键不放同时按一下 RST 键再松开 BOOT重新拔插 USB设备管理器里确认出现新的 COM 口再点上传成功后再手动按 RST 运行。ESP32-C3 Super Mini 有个比较坑的地方是它板载的 USB 转串口芯片和一些老式开发板不同自动下载电路不完善经常需要手动进 boot 模式。我用另一块开发板试过之后才明白这不是我焊接的问题是板子本身的限制。3.4 第一版固件结构状态机与主循环第一版固件我建议不要写复杂按模块拆src/ main.cpp // 主循环、状态机 display.cpp // OLED 刷新逻辑 time_keeper.cpp // SNTP PCF8563 buttons.cpp // 按键检测与外部中断 sleep_mgr.cpp // light sleep 与 deep sleep accel.cpp // ADXL345 翻腕检测主循环用状态机来组织enum WatchState { NORMAL, MENU, SLEEP, BOOTING }; WatchState state BOOTING; void loop() { switch (state) { case NORMAL: // 更新显示、处理按键、翻腕亮屏 if (idleTime 10000) enterLightSleep(); break; case MENU: // 菜单导航 break; case SLEEP: break; } }最简单的跑通顺序是先让 OLED 显示“Hello”再显示系统时间再接入按键翻腕最后才做低功耗。我见过太多人一上来就搞低功耗结果被各种唤醒源、定时器、WDT 搅得焦头烂额得不偿失。4. 戴上手腕才暴露的问题实测耗电、误触与稳定性排查4.1 为什么第一版开机就“变砖”了这件事印象太深了。我把所有模块焊好插上 USB电脑没有任何反应连设备管理器里都看不到未知设备。当时心都凉了。排查下来发现是 ESP32-C3 Super Mini 的自动下载电路触发逻辑问题。不是板子坏了而是我接了 OLED 和电池BOOT 引脚上电平被外部电路拉高导致芯片上电时进入了正常启动模式而 USB 串口芯片无法把它拉进下载模式。解决办法有两条要么按住 BOOT 键手动进入下载模式要么把 OLED 和电池断开再烧录。后来我在 PCB 设计里加了独立下载跳线才算根治。所以提醒你如果项目里面同时接了 OLED、电池和 I2C 外设烧录不成功别怀疑硬件坏了先试试断开外设只留 USB。4.2 翻腕亮屏过于灵敏写字、吃饭都会亮第二版固件跑通之后最大的问题变成了翻腕检测极度过敏。我戴在左手只要正常走路摆动胳膊屏幕就有 30% 的概率亮起来。吃饭、打字时更是几乎次次触发。我调了三个参数才解决活动阈值从 0.5g 提高到 0.7g活动持续时间从 40ms 提高到 100ms加一个冷却窗口翻腕亮屏后 20 秒内不再重复触发。第一版使用 0.7g 阈值时正常行走不会触发了但手臂快速摆动能触发冷却窗口直接砍掉了大多数重复触发。最后实测误触率从 30% 降到了 3% 左右这个数字对一个手表来说完全可以接受。4.3 续航惨案500mAh 电池撑了不到半天这是整个项目最痛的教训。第一版做完后充满电戴出门晚上回家就弹出低电量报警。查了一圈罪魁祸首有三个OLED 始终全亮显示实测 18mA开发板上的 USB-UART 芯片芯片静态耗电 3mALDO 稳压模块静态耗电 3mA。三者叠加26mA 的待机电流500mAh 电池当然只能坚持 19 小时。优化方案是OLED 供电由 GPIO10 控制 P-MOSFET休眠时完全断电换了一块不含 USB-UART 的最小核心板把整板待机电流从 8mA 降到 1mA日常 10 秒熄屏进入 light sleep。优化后整机平均电流降到 2mA 左右实测续航 4-5 天这个结果才终于“能戴出门”。4.4 显示闪烁与残影I2C 速率和电源纹波的锅OLED 屏幕在显示秒数变化时偶尔会出现整屏闪烁一下。这不是接触不良而是 I2C 速率太快加上电源纹波大导致驱动 IC 瞬间复位。我先把 Wire 库速率从 400kHz 降到 100kHz闪烁明显减少然后在 OLED VCC 和 GND 之间并了一颗 100uF 电解电容。两者组合后屏闪彻底消失。残影问题指的是同一图标长时间显示后OLED 上会留下淡淡的印记。对策是每 30 秒图标反色一次或者把固定显示的区域颜色做周期反转这在 u8g2 里很容易实现// 倒置显示防止烧屏 if ((millis() / 30000) % 2 0) { u8g2.setDrawColor(2); // XOR 模式 u8g2.drawBox(105, 30, 20, 15); u8g2.setDrawColor(1); }4.5 BLE 消息通知通知不可怕连接才耗电加消息通知功能后我才发现真正的坑不是解析通知数据而是 BLE 连接的功耗。手机和手表保持 BLE 连接时ESP32 要持续处理协议栈电流稳定在 20mA 以上几分钟就能把电池吃掉 1%。我的方案是“按需连接”平时 BLE 完全关闭想要同步消息时在菜单里手动打开蓝牙通知到达后显示 3 秒然后立即断开连接。这个策略牺牲了一点点便利性换来了整体功耗的大幅下降。现在这块表的平均功耗仍然在 2mA 左右主要归功于这个“用才开”的蓝牙策略。5. 半年后我又做了哪些升级从消息通知到运动提醒5.1 久坐提醒与饮水提醒用外部中断定时唤醒因为这个项目跑通之后我已经很熟悉 ESP32 的 light sleep 唤醒机制所以扩展功能非常快。久坐 45 分钟提醒做法就是在esp_sleep_enable_timer_wakeup(45 * 60 * 1000000)之后进入 45 分钟的 light sleep然后唤醒后震动一下、显示“该动一动了”。饮水提醒更简单直接做成每 2 小时触发一次和久坐提醒共用同一个逻辑。这类功能不依赖网络功耗极低真正体现了“手表是搭在手腕上的微电脑”这个定位。5.2 计步ADXL345 阈值中断就够用了我在 ADXL345 上开了活动检测中断配合简单的计数逻辑每触发一次中断就计一步再做一个 5 秒滑动窗口过滤抖动。精度肯定不如专业运动手表但作为一个“大致参考”完全够用。计步数据每小时写一次到内部 RTC 的备份寄存器里断电不丢失。如果你想要更高精度的计步可以换 BMA400 这类自带步数计数的传感器I2C 读取功耗只有几微安还能省掉一颗独立的 MCU。5.3 温湿度显示让表壳内的微气候也有意义后来我又加了一颗 SHT40 温湿度传感器放在表壳背面开口处。它能实时显示体温和室内温度还能根据湿度提示是否需要补水。这个功能大部分时间只是看一眼但它让这块表从一个“时间机器”变成了一个“身体指标参考夹”。有一点注意MOD 要避免把传感器放在表壳内部密封处否则测的是壳内温度而不是体感温度。我开了两个直径 2mm 的透气孔测温可信度立刻上升。5.4 把表变成 HID 遥控器遥控 PPT 和手机快门ESP32-C3 支持 BLE HID所以这块表现在还有一个隐藏功能按一下 Start 键它就变成蓝牙键盘可以遥控 PPT 翻页、远程按手机快门、控制智能家居开关。这个功能本质上和“桌面小电视”是同一套思路——把 ESP32 当做一个迷你外设。做成手表之后手势控制就变得很自然抬腕、按键、翻页三秒搞定一次演示切换。NimBLE HID 的核心代码其实就是建立了一个 HID Device然后把按键映射成 Consumer Control 报告// 使用 NimBLE-Arduino 的 HID Device 示例 NimBLEHIDDevice *hid new NimBLEHIDDevice(hidServer); hid-manufacturer()-setValue(ESP Watch); hid-pnp(0x02, 0x3035, 0x0001, 0x0100); hid-startServices();5.5 关于 ESP32-S3 和“边缘 AI”的胡思乱想做这个项目之后我一度想把主控升级成 ESP32-S3因为 S3 有向量指令能跑轻量语音唤醒甚至可以做关键词识别。理论上这块表可以变成“语音记笔记手表”——说一句话自动转文字存进闪存。但实际操作中功耗问题瞬间浇灭了热情。语音唤醒要求麦克风始终带电DSP 持续跑电流轻松到 50mA 以上这在手表上是不可接受的。所以最后我只保留了一个“一键录音 10 秒并保存”的功能需要用的时候才打开麦克风平时完全断电。这件事给我的启示是在手表这个场景里90% 的智能功能不是被算力限制而是被功耗限制。任何功能都要先问“它值得我多耗多少电”。最后分享一点我的个人体会这块表我戴了半年电池稳定在 3-4 天一充。充电线藏在床头柜的眼镜盒里晚上睡觉前充一会儿就满白天基本不用想电量的事。做这个项目最大的收获不是学会了 u8g2、ADXL345 或者 BLE HID而是真正理解了手表这种设备的本质它不是一个可以无限堆功能的平台而是一个必须在“有用”和“省电”之间反复权衡的微型系统。每一个功能从翻腕亮屏到消息提醒都是在和电池容量博弈。如果你也想做一个属于自己的 ESP32 智能手表我的建议是先别急着画外壳、买表带先把手上的开发板和 OLED 屏跑通一个“显示时间 按键翻腕”的最小系统把这个流程走顺了再做外壳和电池。外壳可以慢慢打磨但核心逻辑通了后面每一步都会轻松很多。最后再分享一个实测技巧调低功耗时不要只看芯片数据手册的“理论待机电流”要直接用万用表串联电池测实测电流。我的经验是功能指标是否符合预期没有比电流表更有发言权的。祝你也能做出自己手腕上的那块“伪智能手表”。