
1. 项目缘起与整体设计思路1.1 为什么要做一块“伪”智能手表手头有一块吃灰的卡西欧F-91W表带断了表壳也花得不成样子但表盘那块LCD和外壳结构还在。扔了可惜戴出去又嫌旧。正好抽屉里翻出一块ESP32-C3开发板体积小、功耗低、自带蓝牙和Wi-Fi于是动了念头能不能把这块老表壳掏空塞进ESP32做一块能显示时间、能连手机、能看温湿度的“伪智能手表”说它是“伪”智能是因为它不具备真正智能手表的完整生态——不能装App、不能接打电话、屏幕也不是彩屏。但它能做的事其实不少通过蓝牙与手机同步时间、显示自定义信息、读取板载温湿度传感器数据、甚至可以通过外部中断实现抬腕亮屏。核心逻辑很简单用ESP32替代原装石英机芯用一块小尺寸LCD或OLED替代原装段码屏保留卡西欧的外壳和按键手感做成一块“看起来像卡西欧、用起来有点智能”的腕上设备。这个项目适合谁适合手里有闲置ESP32、对单片机开发有一定基础、喜欢折腾硬件改造的玩家。如果你刚接触Arduino也能跟着做因为核心代码并不复杂难点主要在结构改造和电源管理上。整个项目不需要3D打印机也不需要定制PCB用现成的模块和手工工具就能完成。1.2 硬件选型背后的取舍逻辑选ESP32-C3而不是经典ESP32理由有三。第一是体积C3的QFN封装芯片面积比ESP32小一圈开发板也普遍更窄塞进表壳更容易。第二是功耗C3支持更精细的电源管理在轻度使用场景下平均电流可以压到10mA以内配合小容量锂电池能撑一天以上。第三是价格C3模组现在单价已经降到十元以内坏了也不心疼。屏幕方面原装F-91W的段码LCD没法直接驱动因为它的引脚定义和驱动波形都是定制的。我试过用ESP32的LCD外设去推结果对比度惨不忍睹。后来换成0.96寸SSD1306 OLEDI2C接口只需要两根信号线分辨率128x64显示时间、日期、温湿度绰绰有余。虽然尺寸比原装屏小一点但用黑色亚克力板做个边框遮住缝隙视觉效果可以接受。电源部分是最需要动脑筋的。原装表壳内部空间极其有限我量了一下电池仓大概能塞进一块20mm x 30mm x 5mm的软包锂电池容量约300mAh。ESP32-C3在Wi-Fi开启时峰值电流能到300mA以上蓝牙广播时平均电流约20mA深度睡眠可以降到5μA。为了续航我决定平时关闭Wi-Fi只用蓝牙与手机通信屏幕默认熄灭靠按键或抬腕唤醒。提示锂电池必须带保护板否则过放会鼓包甚至起火。我一开始图省事用了一块没保护板的电芯结果有一次忘了充电电池直接胀到把表壳撑裂了。1.3 结构改造的可行性评估卡西欧F-91W的表壳是ABS塑料壁厚约1.5mm内部有加强筋和按键孔。改造时需要用美工刀和电磨笔把内部凸起全部削平只保留外壳轮廓和按键柱。按键柱是塑料圆柱原本用来顶住机芯上的微动开关改造后可以保留用来顶住我贴在侧面的轻触按键。表镜是亚克力材质透光率一般但胜在耐刮。OLED屏幕贴在表镜内侧用黑色双面胶固定屏幕边缘用黑色热缩管或电工胶带遮光防止漏光影响观感。表带沿用原装的树脂带虽然旧但还能用实在不行就换一条20mm的尼龙表带风格更搭。整个改造过程不需要焊接精密芯片只需要把ESP32开发板、OLED、电池、按键、充电模块用细硅胶线连起来。焊接时注意用低温焊锡避免烫坏塑料件。我用的是一把30W尖头烙铁温度调到300度左右焊点尽量小走线尽量短防止合壳时压断。2. 核心细节解析与实操要点2.1 ESP32-C3的引脚分配与功能映射ESP32-C3开发板引出的可用GPIO不多我用的这款板子只引出了11个引脚其中还有几个是 strapping 引脚上电时电平状态会影响启动模式。经过反复测试我确定了以下分配方案功能GPIO说明OLED SDAGPIO5I2C数据线接4.7k上拉电阻OLED SCLGPIO6I2C时钟线接4.7k上拉电阻按键1功能键GPIO3低电平触发内部上拉按键2电源键GPIO4低电平触发内部上拉温湿度传感器GPIO7单总线协议接DHT11振动马达GPIO10高电平驱动串100Ω限流充电检测GPIO1高电平表示正在充电GPIO3和GPIO4都是RTC GPIO支持深度睡眠唤醒。我把按键1配置为外部中断唤醒源按下时触发中断ESP32从深度睡眠中醒来点亮屏幕并刷新数据。按键2用于手动开关机长按3秒进入深度睡眠。注意GPIO2是strapping引脚上电时必须为高电平否则会进入下载模式。我一开始把振动马达接在GPIO2上结果每次上电都进不了正常运行模式排查了半天才发现是马达驱动电路把电平拉低了。2.2 外部中断实战抬腕亮屏的实现抬腕亮屏听起来很高级其实原理很简单用一颗滚珠开关或加速度传感器检测手腕姿态变化当检测到特定方向的加速度突变时触发外部中断唤醒ESP32。我手头没有MPU6050就用了一颗SW-200D滚珠开关成本几毛钱效果出乎意料地好。SW-200D内部有一颗小钢珠当开关倾斜到一定角度时钢珠滚动接通两个触点。我把开关焊接在ESP32的GPIO3和GND之间配置GPIO3为下降沿触发中断同时启用内部上拉。当手腕抬起时开关瞬间导通GPIO3被拉低触发中断。代码层面需要先配置中断pinMode(3, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(3), wakeUpHandler, FALLING);中断服务函数里只做一件事设置一个标志位。主循环检测到标志位后点亮屏幕刷新时间然后启动一个定时器5秒后自动熄屏。volatile bool wakeFlag false; void IRAM_ATTR wakeUpHandler() { wakeFlag true; }这里有个坑中断服务函数必须放在IRAM中否则在深度睡眠唤醒后可能无法执行。用IRAM_ATTR修饰函数即可。另外中断里不能做耗时操作比如刷新屏幕、读传感器这些都要放到主循环里做。实测下来滚珠开关的触发率大概在80%左右有时候手腕抬得快了不触发抬得慢了也不触发。后来我调整了开关的安装角度让它对水平方向的加速度更敏感触发率提升到95%以上。如果你追求更稳定的体验建议换成MPU6050用I2C读取加速度数据通过阈值判断抬腕动作但功耗会高一些。2.3 电源管理与续航优化续航是这类小设备的核心痛点。我实测了几种配置下的电流工作模式平均电流300mAh电池预估续航Wi-Fi开启屏幕常亮120mA2.5小时蓝牙广播屏幕熄灭18mA16小时蓝牙连接屏幕熄灭12mA25小时深度睡眠RTC唤醒0.8mA15天显然深度睡眠是续航的关键。我的策略是平时让ESP32处于深度睡眠只保留RTC和外部中断。按键或滚珠开关触发中断后ESP32唤醒初始化蓝牙和屏幕显示时间然后启动一个60秒的定时器。如果60秒内没有操作自动回到深度睡眠。深度睡眠的代码很简单esp_deep_sleep_enable_gpio_wakeup(GPIO_NUM_3, ESP_GPIO_WAKEUP_GPIO_LOW); esp_deep_sleep_start();但这里有个细节深度睡眠唤醒后程序会从头开始执行相当于重启。所以所有状态都需要保存在RTC内存中比如当前时间、闹钟设置等。我用RTC_DATA_ATTR修饰全局变量让它们在深度睡眠期间保持。RTC_DATA_ATTR int bootCount 0; RTC_DATA_ATTR time_t lastTime 0;蓝牙同步时间后把时间戳写入RTC内存。唤醒后先读取RTC内存中的时间加上深度睡眠的时长估算当前时间。虽然精度不如RTC芯片但误差在可接受范围内每天差几秒而已。实操心得ESP32-C3的深度睡眠电流实测约0.5mA比手册标称的5μA高不少。后来发现是开发板上的LDO静态电流太大换成HT7333后降到0.1mA以下。如果你也遇到睡眠电流偏大的问题先检查电源芯片。3. 实操过程与核心环节实现3.1 表壳拆解与内部空间改造拆解卡西欧F-91W需要一把小号十字螺丝刀和一把美工刀。先卸下背面四颗螺丝取下后盖注意不要弄丢防水胶圈。然后取出机芯机芯是通过几个塑料卡扣固定的用美工刀轻轻撬开即可。取出机芯后你会看到表壳内部有若干加强筋和按键柱这些都需要削平。用电磨笔配球形铣刀把内部凸起全部磨掉只保留外壳轮廓和四个螺丝柱。磨的时候注意不要磨穿外壳尤其是按键孔附近壁厚只有1mm左右。磨完后用细砂纸打磨平整清理碎屑。接下来处理表镜。原装表镜是用双面胶粘在表壳上的用热风枪吹到60度左右用吸盘轻轻拉起。如果表镜碎了可以买一块0.5mm厚的亚克力板自己裁。我把OLED屏幕贴在表镜内侧用黑色双面胶固定屏幕四周用黑色电工胶带遮光。按键部分原装按键是塑料柱顶住机芯上的微动开关。我保留了按键柱但在表壳内部对应位置贴了两个6x6mm的轻触按键按键柱正好能顶到按键帽。实测手感偏硬但能用。3.2 电路连接与焊接要点所有模块都用细硅胶线连接线径0.3mm左右柔软且耐弯折。焊接顺序很重要先焊OLED和传感器再焊按键和马达最后焊电池和充电模块。每焊完一个模块先上电测试确认没问题再焊下一个。OLED的I2C线需要上拉电阻我直接在OLED模块背面焊了两个4.7k电阻一端接SDA/SCL一端接VCC。DHT11的数据线也需要上拉用了一个10k电阻。振动马达串了一个100Ω电阻防止电流过大烧GPIO。充电模块用的是TP4056带保护板输入5V输出接锂电池。充电时红色LED亮充满转绿。我把充电口改成Type-C用一块小的Type-C母座焊接在表壳侧面用热熔胶固定。注意焊接锂电池时烙铁温度不要超过350度焊接时间不要超过3秒否则可能损坏电池内部结构。我一般先用砂纸打磨电极涂上焊锡膏然后快速点焊。3.3 固件烧录与离线包配置Arduino IDE对ESP32-C3的支持需要安装离线包。我用的版本是2.0.11下载地址在乐鑫官方文档里能找到。安装方法打开Arduino IDE文件-首选项-附加开发板管理器网址填入离线包的本地路径然后在开发板管理器中搜索esp32点击安装。如果网络环境不好离线包是最稳妥的选择。我试过在线安装下了三次都断在中途后来直接下载了200MB的离线包解压到Arduino的hardware目录下重启IDE就能识别。烧录时需要注意ESP32-C3进入下载模式需要拉低GPIO9并复位。我的开发板上有自动下载电路用USB线直接插上就能烧。如果没有自动下载电路需要手动按住BOOT键点一下RST键再松开BOOT键。烧录参数Flash Mode选DIOFlash Size选4MB上传速度921600。如果烧录失败降低到115200再试。我遇到过几次烧录失败都是因为USB线质量太差换了一根带屏蔽的线就好了。3.4 时间同步与蓝牙通信时间同步通过蓝牙实现。ESP32作为BLE外设手机作为中心设备连接后手机发送当前时间戳ESP32接收后写入RTC内存。我用的是ArduinoBLE库代码量不大。BLEService timeService(1805); BLECharacteristic timeChar(2A2B, BLERead | BLEWrite, 8); void setupBLE() { BLE.begin(); BLE.setLocalName(CASIO-ESP32); BLE.setAdvertisedService(timeService); timeService.addCharacteristic(timeChar); BLE.addService(timeService); BLE.advertise(); }手机端用nRF Connect发送8字节的时间戳ESP32收到后解析并更新显示。实测同步一次耗时约2秒功耗约0.5mAh可以接受。除了时间同步我还加了一个自定义特征值用来推送通知。手机发送字符串ESP32收到后在屏幕上滚动显示。虽然屏幕小但看个微信提醒还是够用的。4. 常见问题与排查技巧实录4.1 烧录失败与下载模式排查烧录失败是新手最容易遇到的问题。常见原因有三个一是USB线质量差只能充电不能传数据二是驱动没装好设备管理器里显示未知设备三是没进入下载模式。排查步骤先换一根已知能传数据的USB线然后在设备管理器里看有没有COM口。如果没有安装CH340或CP2102驱动。如果COM口有了但烧录还是失败检查开发板上的BOOT和RST按键手动进入下载模式。我遇到过一种特殊情况开发板上的自动下载电路用了两个三极管但其中一个焊反了导致无法自动下载。后来我直接飞线短接问题解决。如果你买的是廉价开发板建议先检查一遍焊接质量。4.2 屏幕不亮或花屏的处理OLED不亮先查供电。用万用表量VCC和GND之间有没有3.3V。如果没有检查LDO输出和电池电压。如果有电但不亮检查I2C地址。SSD1306默认地址是0x3C有些模块是0x3D。用I2C扫描程序确认地址。花屏通常是I2C线太长或上拉电阻不合适。我一开始用20cm的杜邦线花屏严重换成10cm硅胶线后正常。上拉电阻用4.7k比较稳太小会增加功耗太大波形上升沿变缓。还有一种情况是屏幕初始化失败显示一堆乱码。这通常是复位时序不对在display.begin()之前加一个delay(100)让屏幕完成上电复位。4.3 电池续航不达预期的优化续航短先量电流。如果待机电流超过1mA说明有模块没进入睡眠。逐个排查OLED是否关闭显示蓝牙是否停止广播传感器是否断电我的做法是在深度睡眠前把所有外设的电源都切断。OLED的VCC接一个MOS管由GPIO控制通断。DHT11的VCC也接MOS管。这样睡眠时只有ESP32在耗电电流降到0.1mA以下。另外LDO的选择很关键。开发板自带的LDO静态电流可能高达1mA换成HT7333或XC6206后静态电流降到几十微安。别小看这一毫安300mAh电池差出好几天续航。4.4 按键抖动与误触发机械按键都有抖动按下时电平会在几毫秒内跳变多次。如果不做消抖一次按下可能触发多次中断。硬件消抖可以在按键两端并联一个0.1μF电容软件消抖可以在中断里加一个时间戳判断。volatile unsigned long lastPress 0; void IRAM_ATTR wakeUpHandler() { unsigned long now millis(); if (now - lastPress 200) { wakeFlag true; lastPress now; } }滚珠开关的抖动更严重因为它不是机械触点而是钢珠滚动。我试过加电容效果一般。后来改成在中断里连续采样三次如果三次都是低电平才认为是有效触发。这样误触发率大大降低。问题现象可能原因解决方法烧录失败USB线差/驱动未装/未进下载模式换线/装驱动/手动进下载屏幕不亮供电异常/I2C地址错量电压/扫描地址花屏线太长/上拉不合适缩短线/换4.7k上拉续航短外设未断电/LDO静态电流大加MOS管/换LDO按键误触发抖动/中断未消抖加电容/软件消抖5. 外壳组装与最终调试5.1 合壳前的最终检查合壳之前务必做一次完整的功能测试。把电池充到4.2V烧录最终固件测试以下项目按键唤醒是否正常、屏幕显示是否清晰、蓝牙连接是否稳定、充电是否正常、深度睡眠电流是否达标。我习惯用一块万用表串联在电池和主板之间实时监测电流。正常工作时电流在10-20mA之间波动熄屏后降到1mA以下深度睡眠后降到0.1mA。如果某个环节电流异常先排查再合壳否则合壳后拆开很麻烦。合壳时注意走线所有线缆要顺着表壳内壁走不要压在电池或屏幕上方。我用的是0.3mm硅胶线柔软度好可以弯折成任意形状。电池用双面胶固定在表壳底部屏幕用黑色双面胶固定在表镜内侧。5.2 防水与日常佩戴原装F-91W有30米防水但改造后防水性能肯定下降。我没有做专业防水处理只是在后盖胶圈上涂了一层硅脂合壳时拧紧螺丝。日常佩戴避免游泳和洗澡洗手时注意不要冲水。表带沿用原装的树脂带虽然旧但还能用。如果你觉得不好看可以换一条20mm的尼龙编织带风格更搭而且透气。我换了一条军绿色尼龙带戴起来比原装舒服。5.3 后续可扩展的方向这块“伪”智能手表目前只实现了时间显示、温湿度、蓝牙通知和抬腕亮屏。后续还可以加不少功能比如用ESP32-C3的Wi-Fi做NTP对时每天凌晨自动同步一次加一颗气压计做高度测量加一颗心率传感器做健康监测。不过加功能意味着加功耗续航会进一步缩短。我的建议是先把手头功能做稳定再考虑扩展。毕竟这是一块戴在手上的设备稳定比功能多更重要。最后分享一个小技巧如果你觉得OLED屏幕太小可以换成1.3寸的SH1106分辨率一样但可视面积大一圈。不过SH1106的驱动和SSD1306略有不同需要改一下库的初始化参数。我试过显示效果确实好一些但表壳需要磨得更薄难度更大。整个项目做下来最大的感受是改造老物件比从头做一个新东西更有意思。卡西欧F-91W的设计本身就很经典保留它的外壳和按键换上ESP32的大脑就像给一位老朋友装上了新灵魂。虽然它不能打电话、不能刷视频但每次抬腕看到自己写的固件在跑那种满足感是买一块成品智能手表给不了的。