尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ESP32-C3自制卡西欧风格智能手表:硬件选型、电路设计与低功耗实践
1. 项目缘起与整体设计思路1.1 为什么要做一块“伪”智能手表手上戴着一块卡西欧 F-91W戴了快六年电池换过两次外壳磨得发亮但它依然准时。这种经典数显表的设计语言非常耐看——方正的表壳、简单的液晶、四个按键没有多余的东西。与此同时抽屉里躺着几块吃灰的 ESP32 开发板有 ESP32-WROOM-32 的也有 ESP32-C3 的一直想找个能天天用得上的项目把它们消化掉。于是就有了这个想法把 ESP32 塞进卡西欧风格的表壳里做一块“看起来像卡西欧、实际上是 ESP32”的伪智能手表。它不需要能装 App、不需要能刷视频核心诉求就三条能看时间、能连手机同步、能显示一些自定义信息比如温湿度、消息提醒、电量。说白了就是一块“带联网能力的电子表”。这个定位很关键。很多人做 DIY 手表一上来就想对标 Apple Watch结果项目复杂度爆炸最后烂尾。我的思路是反过来的先把它当成一块电子表做扎实智能功能是加分项不是必需品。这样即使联网部分暂时没调通它依然是一块能用的表。1.2 硬件选型的取舍逻辑选 ESP32 而不是 STM32 或者 51 单片机理由很直接。第一ESP32 自带 Wi-Fi 和蓝牙省掉外挂模块的麻烦和体积第二Arduino 生态成熟库多开发快第三ESP32 支持深度睡眠功耗虽然比不过专用 RTC 芯片但配合合理的唤醒策略撑个几天没问题第四价格便宜一块 ESP32-C3 模组十几块钱做坏了不心疼。具体到型号我最终选了ESP32-C3-MINI-1。原因有三它是 RISC-V 架构单核够用体积小只有 13.2×16.6mm塞进表壳压力小支持 BLE 5.0和手机通信够用。相比之下 ESP32-WROOM-32 体积偏大双核在这个场景下纯属浪费。屏幕方面我用了1.14 寸 ST7789 SPI 屏135×240 分辨率。有人会问为什么不用更省电的段码 LCD 或者墨水屏。段码 LCD 显示内容太死板做不出“智能”的感觉墨水屏刷新太慢看时间体验差。TFT 虽然费电但刷新快、颜色丰富、驱动库成熟权衡下来是最优解。电源部分是这个项目的难点。ESP32 峰值电流能到 500mAWi-Fi 工作时平均也有 100mA 以上。我用了3.7V 500mAh 锂聚合物电池配合TP4056 充电模块和ME6211 LDO 稳压到 3.3V。这里没用 DC-DC 是因为 LDO 纹波小对屏幕和射频干扰小代价是效率低一些但 500mAh 的容量能接受。1.3 整体架构与功能规划整块表的功能分三层。底层是时间基准用 ESP32 内部的 RTC 配合 NTP 校时中间层是显示和交互ST7789 负责画面一个物理按键负责切换页面上层是联网功能通过 BLE 和手机通信接收通知、同步时间、上传传感器数据。表壳我用 3D 打印机打的材料是 PLA。模型是自己用 Fusion 360 画的参考了 F-91W 的尺寸——表壳 38.2×35.2×8.5mm表带接口 18mm。打印精度 0.2mm 层高打完用砂纸打磨喷一层哑光黑漆远看还真有几分卡西欧的味道。提示3D 打印表壳时屏幕开窗要留 0.3mm 的余量否则屏幕装不进去。按键孔建议打成 3.2mm配 3mm 的轻触按键刚好。2. 核心硬件细节与电路设计要点2.1 ESP32-C3 最小系统搭建ESP32-C3 的最小系统比想象中简单但有几个坑必须提前说清楚。首先是EN 引脚必须接一个 10kΩ 上拉电阻到 3.3V再并一个 0.1μF 电容到地否则芯片上电复位不稳定会出现时好时坏的现象。我第一次打板就是漏了这个电容结果十次上电有三次不启动排查了半天。其次是GPIO9 启动模式引脚。ESP32-C3 默认从内部 Flash 启动GPIO9 需要保持高电平。如果你把 GPIO9 用作普通 IO一定要确保上电瞬间它是高电平否则芯片会进入下载模式程序不运行。我的做法是 GPIO9 接一个 10kΩ 上拉到 3.3V同时接一个按键到地这样既能正常启动又能手动进入下载模式。USB 下载电路我用了CH343P比 CH340 体积小支持自动下载。自动下载电路的核心是两个三极管分别控制 EN 和 GPIO9。具体接法是DTR 通过一个 NPN 三极管控制 ENRTS 通过另一个 NPN 控制 GPIO9同时 EN 和 GPIO9 之间要交叉耦合。这个电路网上有标准参考照着抄就行但要注意三极管的基极电阻用 10kΩ集电极电阻用 10kΩ别用大了。电源部分ME6211 的输入输出都要加电容。输入端 10μF输出端 10μF 加 0.1μF这是 LDO 稳定的基本要求。我实测过如果输出端只放 1μFWi-Fi 一开就重启因为瞬态响应跟不上。2.2 ST7789 屏幕的接线与驱动ST7789 用 SPI 驱动接线不复杂但引脚分配有讲究。ESP32-C3 的 SPI 引脚是固定的GPIO6 是 SCKGPIO7 是 MOSI这两个不能改。CS、DC、RST、BLK 可以自由分配我用了 GPIO10、GPIO4、GPIO5、GPIO3。屏幕的背光控制很关键。BLK 引脚直接接 3.3V 的话背光常亮功耗大概 20mA。我把它接到 GPIO3用 PWM 控制亮度白天 100%晚上 30%既省电又护眼。PWM 频率用 5kHz占空比调节实测没有频闪。驱动库我用的是TFT_eSPI比 Adafruit 的快不少而且支持 DMA。配置的时候要改User_Setup.h把驱动改成 ST7789分辨率改成 135×240引脚按实际接线填。这里有个坑ST7789 的 135×240 屏实际显存是 240×320需要设置偏移量。我的屏偏移是_xstart52, _ystart40不同批次可能不一样要自己试。注意TFT_eSPI 的偏移量如果设错画面会偏到一边或者出现花屏。调试时先显示一个全屏红色看边缘有没有黑边再微调偏移值。2.3 电源管理与充电电路电池管理是 DIY 手表最容易翻车的地方。我用的是 TP4056 充电模块但它有个问题充电时如果同时给负载供电充电电流会被负载分走导致充电时间变长甚至充不满。解决办法是在电池和负载之间加一个P 沟道 MOSFET充电时断开负载放电时导通。我用的是 AO3401导通电阻 50mΩ压降可以忽略。电量检测用 ESP32-C3 的 ADC通过一个分压电路读电池电压。分压电阻用 100kΩ 和 100kΩ这样静态电流只有 18μA对电池影响很小。ADC 读数要校准ESP32-C3 的 ADC 线性度一般我用了多点校准在 3.3V、3.7V、4.2V 三个点测出实际值拟合一条曲线误差能控制在 2% 以内。低功耗策略上我做了几件事。第一屏幕背光自动调暗第二Wi-Fi 只在需要同步时开启平时关闭第三用 ESP32-C3 的light sleep模式配合 GPIO 唤醒。实测下来正常使用每分钟刷新一次时间每小时同步一次能撑 3 天左右。如果关掉 Wi-Fi只当电子表用能撑 7 天。3. 软件架构与关键代码实现3.1 开发环境搭建与离线包配置Arduino IDE 对 ESP32-C3 的支持已经比较成熟但国内下载开发板包经常失败。我的做法是手动装离线包。先去 GitHub 下载esp32-3.0.0.zip然后解压到~/Arduino/hardware/espressif/esp32目录下再运行tools/get.exe安装工具链。这样比在线下载稳定得多。如果你用 PlatformIO配置更简单。在platformio.ini里写[env:esp32-c3-devkitm-1] platform espressif32 board esp32-c3-devkitm-1 framework arduino monitor_speed 115200 board_build.flash_mode dioPlatformIO 的好处是库管理方便编译速度也比 Arduino IDE 快。我实测同一个项目PlatformIO 编译 25 秒Arduino IDE 要 50 秒。而且 PlatformIO 支持离线包把.platformio目录拷到另一台电脑就能直接用。提示Windows 下编译 ESP32 慢很大一部分原因是杀毒软件实时扫描。把项目目录和.platformio目录加入杀毒软件白名单编译速度能快一倍。3.2 时间管理与 NTP 校时时间基准用 ESP32 内部的 RTC但内部 RTC 精度一般一天能漂几秒。所以需要定期 NTP 校时。我的策略是开机连 Wi-Fi 校时一次之后每 6 小时校时一次如果连不上 Wi-Fi就用内部 RTC 继续走误差累积到一定程度再提醒用户。NTP 校时代码很简单#include WiFi.h #include time.h void syncTime() { configTime(8 * 3600, 0, ntp.aliyun.com, pool.ntp.org); struct tm timeinfo; if (getLocalTime(timeinfo)) { Serial.println(Time synced); } }这里时区设的是东八区偏移 8×3600 秒。configTime会自动处理夏令时但国内不用夏令时所以第二个参数填 0。显示时间的时候我用getLocalTime每秒读一次然后格式化输出。注意getLocalTime有阻塞风险如果 NTP 没同步上它会等 5 秒才返回。解决办法是先用getLocalTime(timeinfo, 0)非阻塞读如果返回 false 就跳过这次刷新。3.3 BLE 通信与手机端交互BLE 是这个项目的“智能”核心。我用 ESP32-C3 做 BLE 外设手机做中心设备。服务 UUID 自定义特征值分三个一个用来接收手机发来的通知文本一个用来发送传感器数据一个用来同步时间。BLE 初始化代码#include BLEDevice.h #include BLEServer.h #include BLEUtils.h BLEServer *pServer; BLECharacteristic *pNotifyChar; void setupBLE() { BLEDevice::init(CASIO-ESP32); pServer BLEDevice::createServer(); BLEService *pService pServer-createService(SERVICE_UUID); pNotifyChar pService-createCharacteristic( NOTIFY_CHAR_UUID, BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY ); pService-start(); BLEAdvertising *pAdvertising BLEDevice::getAdvertising(); pAdvertising-addServiceUUID(SERVICE_UUID); pAdvertising-start(); }手机端我用的是nRF Connect调试正式用的话可以自己写个 App或者用MIT App Inventor快速搭一个。实测 BLE 连接距离在空旷环境 10 米左右隔一堵墙 5 米够用了。功耗方面BLE 广播时平均电流 15mA连接后 8mA比 Wi-Fi 省很多。所以我的策略是平时只开 BLEWi-Fi 只在需要大流量传输时开。3.4 显示界面与交互逻辑界面设计我做了三个页面主页面显示时间、日期、电量第二页显示温湿度外接 SHT30 传感器第三页显示手机通知。用一个物理按键切换短按翻页长按 2 秒进入配网模式。时间显示用大字体我用了 TFT_eSPI 的drawString配合自定义字体。默认字体太小我加载了一个 48 像素高的数字字体显示效果接近卡西欧的液晶。日期和电量用小字体放在底部。刷新策略上不能每秒全屏重绘那样会闪。我的做法是只重绘变化的区域。比如时间只重绘时分秒那部分背景不动。这样刷新率能到 30fps肉眼看不到闪烁。按键处理用外部中断而不是轮询。ESP32-C3 的 GPIO 都支持中断我把按键接在 GPIO2配置成下降沿触发。中断里只置一个标志位主循环里处理避免在中断里做耗时操作。volatile bool buttonPressed false; void IRAM_ATTR buttonISR() { buttonPressed true; } void setup() { pinMode(2, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(2), buttonISR, FALLING); } void loop() { if (buttonPressed) { buttonPressed false; // 处理按键 } }注意中断服务函数要加IRAM_ATTR否则可能因为 Flash 访问导致崩溃。另外中断里不要用delay和Serial.print。4. 组装调试与常见问题排查4.1 硬件组装顺序与注意事项组装顺序很重要搞错了要拆重来。我的顺序是先焊 ESP32-C3 模组和外围电路测试能下载程序再焊屏幕测试显示正常然后焊电源部分测试充电和放电最后装进表壳。焊接 ESP32-C3 模组时风枪温度设 280℃风速调最低。模组底部有散热焊盘要先在 PCB 上涂锡膏放上模组后用风枪从底部加热看到锡膏融化后轻轻按压确保接触良好。焊完用放大镜检查引脚有没有连锡特别是 GPIO 密集的区域。屏幕的 FPC 排线很脆弱焊接时温度不能超过 300℃时间不超过 3 秒。我建议用烙铁头拖焊不要用风枪风枪容易把排线吹变形。电池焊接要注意极性红线正极黑线负极。TP4056 模块的 B 和 B- 接电池OUT 和 OUT- 接负载。接反了会烧模块我烧过两个都是因为晚上焊的时候没看清。4.2 常见问题速查表问题现象可能原因排查方法解决办法上电不启动EN 引脚电容缺失测 EN 电压加 0.1μF 电容下载失败GPIO9 电平不对测 GPIO9 上电电平加 10kΩ 上拉屏幕花屏偏移量设错显示全屏红色调整 _xstart/_ystartWi-Fi 一开就重启电源瞬态响应差测 3.3V 纹波输出端加 10μF 电容时间走不准内部 RTC 漂移对比 NTP 时间缩短校时间隔BLE 连不上广播间隔太长用 nRF Connect 扫描改广播间隔为 100ms充电充不满负载分流测充电电流加 P 沟道 MOSFET按键不灵敏中断配置错误测 GPIO 电平改下降沿触发4.3 调试过程中的踩坑记录第一个坑是ADC 读数不准。ESP32-C3 的 ADC 在 Wi-Fi 开启时噪声很大读数能跳 0.2V。解决办法是读 10 次取平均而且要在 Wi-Fi 关闭时读。我后来改成每 10 秒读一次读之前先关 Wi-Fi读完再开虽然麻烦但准确。第二个坑是屏幕刷新撕裂。TFT_eSPI 默认不用 DMA刷新大区域时能看到明显的撕裂。开启 DMA 后好很多但要注意 DMA 缓冲区不能太小我设的是 1/4 屏幕大小也就是 135×60×2 字节约 16KB。ESP32-C3 的 RAM 有 400KB够用。第三个坑是BLE 和 Wi-Fi 共存。ESP32-C3 是单核BLE 和 Wi-Fi 同时开的时候射频会冲突导致 BLE 断连。我的解决办法是分时复用需要 Wi-Fi 时先关 BLE传完再开 BLE。虽然切换有 1 秒左右的延迟但稳定性好很多。第四个坑是低功耗模式唤醒后屏幕不亮。light sleep 唤醒后SPI 外设需要重新初始化否则屏幕没反应。我在唤醒后加了一段重新初始化的代码问题解决。4.4 实测功耗与续航优化我用INA219电流传感器测了整机功耗数据如下工作状态电流占比深度睡眠0.8mA60%亮屏显示25mA30%Wi-Fi 传输120mA5%BLE 连接8mA5%按 500mAh 电池算平均电流约 12mA理论续航 41 小时。实际因为电池老化、温度影响能撑 30 小时左右。如果关掉 Wi-Fi只开 BLE平均电流降到 6mA续航能到 80 小时。进一步优化的话可以把屏幕换成夏普 Memory LCD静态显示时几乎不耗电只有刷新时才耗电。但 Memory LCD 贵一块 1.3 寸的要 100 多而且驱动复杂。我暂时没换等哪天想折腾了再说。提示测功耗时万用表要串在电池和负载之间用 mA 档。注意万用表本身有内阻会引入压降测出来的电流偏小。更准的方法是用 INA219 或者 INA226 这类专用芯片。5. 外壳制作与佩戴体验5.1 3D 打印表壳的设计细节表壳模型我改了七版才定稿。第一版太厚戴手上像块砖第二版太薄屏幕装不进去第三版按键位置不对按着别扭。最终版的尺寸是 38.2×35.2×10.5mm比 F-91W 厚 2mm因为要塞电池和 PCB。屏幕开窗是 1.14 寸屏的尺寸26×15mm边缘留 0.5mm 边框。开窗用倒角刀走一圈做出 45 度倒角看起来更精致。按键孔三个直径 3.2mm间距 8mm对应三个功能键。表带接口是 18mm 标准接口可以直接用 F-91W 的表带。我买了一条硅胶表带比原装树脂带舒服而且防水。打印参数层高 0.2mm壁厚 1.2mm填充 20%支撑用树形支撑。打完用 400 目砂纸打磨再喷哑光黑漆最后贴一张卡西欧的 Logo 贴纸远看能以假乱真。5.2 佩戴体验与改进方向戴了半个月整体体验还行但有几个地方要改进。第一厚度还是偏厚穿长袖的时候会卡袖口。下一版打算把电池换成 300mAh 的薄电池厚度能减 2mm。第二按键手感偏硬因为用的是 3mm 轻触按键行程短。换成 4mm 的锅仔片会好一些。第三屏幕在强光下看不清TFT 的通病。下一版考虑加一层防眩光膜或者换半反半透屏。续航方面我现在的用法是白天正常显示晚上 11 点自动进入深度睡眠早上 7 点唤醒。这样一天耗电约 40%两天一充。充电用磁吸触点不用插线方便。这个项目后续还可以扩展。比如加一个MAX30102心率传感器做成心率监测加一个BME280气压计做海拔显示或者加一个SD 卡槽记录运动数据。不过这些都是后话了先把基础功能做扎实再说。5.3 成本核算与物料清单整个项目做下来成本比想象中低。物料清单如下物料型号数量单价主控ESP32-C3-MINI-1112元屏幕ST7789 1.14寸125元电池3.7V 500mAh115元充电模块TP405613元稳压ME621111元传感器SHT3018元PCB嘉立创打样5片10元外壳3D打印15元表带18mm硅胶115元其他电阻电容按键-10元合计约104元一百块出头比买一块卡西欧还便宜。当然时间成本没算进去前后折腾了大概三周每天晚上搞两小时。但这个过程学到的东西比直接买一块表值多了。最后分享一个小技巧PCB 打样的时候把屏幕的 FPC 座和电池座都放在背面正面只留屏幕和按键这样组装的时候正面干净看起来更像成品。另外PCB 颜色选黑色和表壳更搭。
RELATED

相关推荐

低成本轮腿机器人DIY:从选型到LQR控制全解析

低成本轮腿机器人DIY:从选型到LQR控制全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/29 19:18:19
基于STM32与巴法云的独居老人监护终端设计

基于STM32与巴法云的独居老人监护终端设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/29 19:18:19
工业级电源路径保护方案:TPS259483AYWPR与PIC18F4680协同设计

工业级电源路径保护方案:TPS259483AYWPR与PIC18F4680协同设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/29 19:18:19
MORE NEWS

更多资讯

📰

平均数与中位数:工资分布偏斜下的数据分析与分位数应用

做数据分析这些年,被问得最多的一类问题是:“这个数看着挺高的,为什么大家体感完全不一样?”十次里有八次,问题出在同一个地方——拿平均数当成了全部人的代表值。尤其在看工资分布这类明显偏斜的数据时,平…

📰

ponytail方法论:一种面向可操作性的工程化极简实践

1. 项目概述:从“ponytail”这个词开始,我们到底在聊什么?“ponytail”这个词最近在多个平台的搜索趋势里突然抬头,不是因为某部老电影重映,也不是某位明星扎了个新发型——它正悄然脱离字面意义,在中文互联…

📰

Excel两个表并排显示:分屏、同步滚动与冻结窗格实操指南

1. 先把"并排"这件事拆开看:三种并排,九成人搞混1.1 你以为的并排,和软件实际做的并排先说结论:在Excel里说"两个表并排显示",实际对应的是三件完全不同的事,选错了方法,你…

📰

电路阻抗解析:从RC/RLC频响到阻抗匹配与测量

做硬件这行,绕不开一个词——阻抗。刚入行那会儿,我把它当成"电阻的高级说法",直到有一次调试一个分压采样电路,直流算得严丝合缝,上电后波形却软塌塌地塌下去一角,换了三个电阻、两块板子&#…

📰

AI编译器与MLIR技术:深度学习模型部署优化指南

1. 现代AI编译器技术全景解析 在深度学习模型部署领域,我们正面临着一个关键矛盾:算法迭代速度与硬件碎片化程度都在指数级增长。PyTorch和TensorFlow等框架训练的模型需要适配从云端GPU集群到边缘端ARM芯片等各类硬件平台,传统手工优化方式已…

📰

系统动力学建模知识地图:反馈结构、仿真流程与复习清单

简介:这份PPT课件面向管理学、系统工程与经济学等专业的学习者,以及需要处理复杂反馈问题的研究与决策人员,系统梳理系统动力学的学科脉络与分析方法,帮助读者建立从因果环路到仿真建模的整体认知。内容以Forrester的工业动力学、…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬