尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESP32翻页钟控制器:让Cifra 5走时精准又安静

ESP32翻页钟控制器:让Cifra 5走时精准又安静 1. 为什么我要给 Cifra 5 翻页钟专门做一个控制器大概半年前我收了一台成色还不错的 Cifra 5 翻页钟——就是意大利 Solari 在 1965 年设计的那款后来很多地方也把它叫 Digit5 或者直接叫 flip clock。这玩意儿的机械结构到今天看依然很妙一个同步电机带减速轮每分钟推动一次卡片翻转分钟数字像书本翻页一样“啪”地落下来。但现实问题很快就来了。原版电机的额定电压是 110V我在 220V 市电下必须外接变压器这倒不是大事。真正头疼的是翻页钟内部那个同步电机的持续运转方式是“通电就一直转”只要不断电它就永远在一分钟一圈的逻辑里走。问题是市电频率一波动、电机摩擦一变大、齿轮间隙一磨损它的翻页时间点就会漂移。经常出现手机已经到 10:32:50 了它还停在 10:31再过十几秒才“啪”地翻过去。这个偏差本身不急但强迫症真的受不了。更要命的是我在网上看到很多玩家对这个钟的印象是“噪音大”“电机发烫”“时间不准”。其实这些都不是设计缺陷而是原版电机被长期通电运转加上电容老化、齿轮缺油导致的连锁反应。解决方案并不是去换一个一模一样的老电机而是把“持续运转”这个底层逻辑彻底改掉用一套微型控制器按需驱动电机每次只让它在需要翻页的时候转一下翻到位就断电。这样一来电机寿命、发热、噪音、时间精度四个问题一次性全解决。于是就有了这个项目为 Cifra 5以及市面上大多数同结构的 Digit5 仿品做一个独立的翻转控制器。它不做任何破坏性改造不动钟壳、不动卡纸、不动原版机械结构只在电机供电线上串联一个控制模块再装一套位置检测和校时按钮。控制器本身可以用 ESP32、ESP8266 甚至最普通的 Arduino Uno 来做成本控制在百元以内效果却比原版稳定得多。这篇就完整记录一下我从硬件选型、机械位置检测、软件状态机到实际调试踩坑的整个过程。如果你手里也有一台类似的机械翻页钟想让它重新走得稳、走得安静这篇文章可以直接照着抄。2. 先搞清楚原版翻页钟的“翻页机制”控制器才有设计依据很多人拿到 Cifra 5 的第一反应是它内部是不是像石英钟一样有一个步进电机一步一停还真不是。它的核心是一个不带减速控制的交流同步电机通电后以固定转速一直转后面靠一套齿轮减速和凸轮机构把连续旋转变成“每分钟一次”的间歇动作。理解这个机制对整个控制方案的设计至关重要。2.1 机械翻转链条从同步电机到分钟卡片标准的 Cifra 5 / Digit5 翻页结构大致是这么个链条同步电机输出轴转速通常是 250-600 rpm视电机型号和电源频率而定第一级蜗轮蜗杆减速把转速降到几十 rpm然后是几组圆柱齿轮减速最终输出到一根“分钟轴”分钟轴上带一个凸轮或者拨爪每转过一圈拨动一次翻页卡片组卡片组里每一页都是双面印刷数字拨动一次就掉落一页显示的数字就加 1 分钟这里最关键的细节是整套机构内部并没有“零点检测”或者“数字定位”概念它只依赖凸轮和齿轮的相对相位。也就是说如果你给电机断电让它在任意位置停下来下次再通电凸轮并不一定正好停在“上一轮翻页结束”的位置。运气好时它启动后能接着正确往下走运气不好时凸轮离下一次拨动已经很近电机启动瞬间的抖动就可能触发半次翻页导致卡片卡在一半。这一点直接决定了我做控制器时的两个核心设计目标一必须增加独立的位置检测让控制器知道当前凸轮停在哪个区间二控制策略要保证电机每次通电后能够“至少完成一次完整的翻页周期再断电”不能半途切断。2.2 位置检测霍尔、干簧管还是光耦既然要检测机械位置方案就非常多了。我最初想过用光电对射管拿一个码盘装在分钟轴上通过透光/遮光来判断角度。但这个方案对安装精度要求高码盘要自己 3D 打印或者剪不干胶贴在转动件上还怕偏心。后来实测下来最稳的是配置一个干簧管加一颗小磁铁。具体做法在分钟轴的旋转件不随卡片转动的那个齿轮臂上粘一颗直径 3mm 的钕磁铁在钟壳的固定支架上焊一个干簧管。每当凸轮旋转到“翻页结束、下一次拨动开始”的相位位置磁铁正好扫过干簧管干簧管内部的触点会非常短暂地吸合一次。把这个信号送给控制器控制器就知道现在应该处于安全停机点。干簧管和霍尔相比优点是它不需要供电两个引脚就像个开关接上拉电阻直接读数字量就行Arduino 和 ESP32 的 GPIO 都支持。缺点是它存在机械触点寿命问题但翻页钟每分钟动作一次一天 1440 次一年也就五六十万次一般的干簧管额定寿命百万次级别用三五年没问题。霍尔传感器 A3144 我也试过它是无触点寿命更长远但它有三个脚接线上稍微麻烦一点而且它本身是锁存型开关在同一个小角度下会因为磁铁移动方向不同而产生不同的阈值行为需要对输出做消抖和边沿判断。所以我最终推荐入门玩家首选干簧管玩得熟了想一劳永逸再上霍尔。2.3 电机驱动交流电机的断电时序必须果断原版电机是交流同步电机不可能用单片机直接推。市面上最容易买到的方案是继电器、固态继电器SSR、双向可控硅模块这三类。它们之间差别挺大我后来做了个简单的对比驱动方式优点缺点我的判断电磁继电器5V/12V 线圈便宜接线简单通断彻底触点寿命有限切换瞬间有火花动作声音“咔哒”响应急可用不推荐长期用固态继电器 SSR无触点寿命长过零关断电机冲击小有漏电流小电流电机需要并联电阻价格稍高推荐首选双向可控硅 MOC3021 光耦成本最低触发灵活需要过零检测电路否则容易砸坏机械件适合有经验的玩家我最后用的是 SSR具体型号是 5A 量级的交流固态继电器控制端 3-15V DC 都能驱动负载端直接接 110V 电机。还有一点要注意SSR 关断之后会有毫安级的漏电流对于小功率电机来说这个漏电流不足以让它转起来但会形成一种“轻轻嗡嗡”的错觉有些敏感的人会在深夜里听到。解决办法是在电机两端并联一个 100kΩ/1W 左右的电阻把漏电流旁路掉实测效果很明显。3. 控制器硬件框架不做破坏式改装独立供电独立控制这一节来聊聊整体硬件结构。我做的控制器不是一个放在钟壳里的内嵌贴片而是一个独立的小盒子通过一根两芯线串入电机的供电回路。好处是哪天想恢复原版状态拔掉控制盒把电机直接接回变压器就行。原版机械结构完全不被动。3.1 整机电气拓扑主控、电机、位置检测、校时按钮控制器的硬件拓扑我画在自己笔记本上的文字描述给你电源输入12V DC 适配器进控制板后分成两路。一路通过 AMS1117-3.3或 5V给主控板供电另一路给一个隔离 DC-DC 模块或者直接用一个小继电器/SSR 控制交流侧。交流侧我单独用了一个 110V 转隔离变压器给电机供电这样低压控制部分只处理 12V 和 3.3V高压电机线路不进入控制板安全性高很多。主控板ESP32 DevKitC。为什么不用 Arduino Uno因为 Uno 没有 WiFi没法直接 NTP 对时我还想后期做 Web 页面看状态、手动校时ESP32 刚合适。电机驱动SSR 固态继电器的控制端接到 ESP32 的一个 GPIO我用的 GPIO16输出端串联在 110V 电机回路里。干簧管位置检测一端接 3.3V另一端接 GPIO17同时 GPIO17 接一个 10kΩ 下拉电阻到 GND。磁铁扫过时触点吸合GPIO 拉到高电平。再开一个 100nF 电容做硬件去抖。三个按键一个“手动翻页”、一个“快进 10 分钟”、一个“复位到整点”。分别接 GPIO14、GPIO27、GPIO26配上拉后直接做中断触发。ESP32 的 ADC 我没用到因为翻页钟不需要测光测温这些外部变量。它的蓝牙我也没用全程只走 WiFi 的 NTP 和 HTTP 服务。3.2 让电机“转一下”而不是“一直转”断电相位的控制逻辑这里说一个我最初忽略、后来花了大力气解决的问题交流同步电机的“断电后惯性相位”。同步电机断电后不会立刻停下由于转子和减速齿轮组的惯性它还会继续转动一小段有时候可能还要转半圈以上才完全停。如果你在“翻页刚完成”的时候就立刻断电实际上电机还会惯性往前蹭一点凸轮可能正好蹭到下一次翻页的临界位置。这样下次启动时凸轮位置就不确定翻页时序就乱了。所以我在软件里设计了“停机补偿窗口”干簧管检测到磁铁扫过之后电机继续运行 0.6 秒再断电。这 0.6 秒是按照我手头这台机器的减速比和电机惯性实测出来的。不同机器可能不同但总体在一个范围内可以用一个带保存的配置值来调整。这样一来磁铁扫过后机械系统就已经走过最危险的临界区电机断电极小概率还是会继续惯性移动但因为它已经过了“翻页刚完成”的相位进入到下一个完整的 1/60 圈的“安全区”就算惯性移动 20 度、30 度也绝对拖不出一张卡片。实际调试时我给控制器加了一个小功能每次翻页动作完成后用电量统计记录电机累计运行时间方便观察是否有某次翻页异常比如电机运行了超过 3 秒还没检测到干簧管信号那大概率是卡纸或者磁铁脱落了这个时候控制器会立刻断电并发出蜂鸣蜂鸣器接在 GPIO25避免齿轮长时间堵转烧电机。3.3 供电与电气安全别在这里省翻页钟原版电机是 110V 的如果你所在地区是 220V 市电请务必外接变压器。我在控制盒内部用了一个小的环形变压器初级 220V次级 110V功率 10W 就够原版电机一般也就 2-3W。千万别把头伸进去直接拿 220V 试电机一个是转速会翻倍另一个是线圈烧得很快。4. 固件核心逻辑状态机、NTP 对时和快翻算法硬件装好了真正让这台翻页钟像“活过来”的是固件。这套固件的核心不是简单的“每分钟翻一次”而是一个严格的有限状态机。如果没有状态机你会发现各种小问题翻页翻到一半重启会导致卡片悬在半空、分钟进位和秒进位不同步、校时按快了会发生连续翻页但干簧管信号丢失。4.1 状态机设计与语义我设计了五个状态用枚举变量保存IDLE待机态。电机断电干簧管信号正常系统已经准备好。在这个状态下最重要的任务是检查“当前时间”的秒数一旦秒数到达翻页阈值比如 00 秒就转换到 FLIP 状态。FLIP翻页中。电机通电开始等待干簧管的边沿信号。如果超过 4 秒还没等到说明异常进入 ERROR 状态。COAST等待停机补偿。干簧管已经检测到磁铁扫过这时继续通电 0.6 秒让凸轮走过危险区然后断电。SETTLE稳定等待。断电后机械结构还有一个短暂的惯性抖动此时不能立刻进入 IDLE等 1 秒再归位 IDLE。ERROR异常态。暂停翻页蜂鸣报警等待人工重启或者 WiFi 远程复位。这套状态机最核心的理念是永远不在不确定的机械位置放弃电机控制权。要么明确知道处于翻页周期内要么明确已经通过干簧管确认了安全相位绝对不能“猜”。4.2 NTP 对时与微调策略时间源我用的是 NTP每 6 小时同步一次获取 UTC 时间后加上 UTC 偏移我这边是 8。光拿到正确时间还不算完还需要考虑翻页钟的翻转时机。理想的翻转动作应该发生在“分钟进位的那一瞬间”但机械翻页不是瞬间完成的从电机启动到卡片翻转到位大概要 1.2-1.6 秒。所以我的策略是在秒数到达 00 的瞬间启动电机而不是等秒数已经走到 00 之后再启动。如果你在秒数 00 时才给它通电那么电机从启动到凸轮拨动卡片中间有至少几百毫秒的机械延迟最终显示的新分钟数会比实际时间慢一秒左右。看着不严重但如果你想做分钟翻转的“准时感”这 1 秒误差很扎眼。方案是我在代码里加了一个MINUTE_FLIP_ADVANCE_MS 1200的宏意思是当前时间的秒数到达 60 秒的前 1.2 秒也就是说当秒数在 58.8 时控制器就提前启动翻页动作。这样在标准时间指向下一分钟的瞬间卡片正好翻到位。但是这个提前量并不能直接从 NTP 时间戳里得到毫秒级精度因为 NTP 同步间隔期间本地时钟会有漂移。因此我在代码里用millis()记录参考时间点把 NTP 时间换算成本地单调时钟的基准再根据基准计算“下一次翻页需要在多少毫秒后执行”。这样即使 WiFi 断了好几个小时本地时钟的老化率也只有几十 ppm取决于 ESP32 内置晶振的质量一天误差在 1 秒以内断电重启后重新 NTP 对齐就行。4.3 手动校时和“快翻到指定时间”的逻辑机械翻页钟不像电子钟它没有“分钟窗口”可以随便设。你设定一个目标时间后系统需要从当前位置快速翻到目标分钟。快翻的本质就是“反复执行完整翻页周期”但这里有个坑如果连续快速翻页干簧管的磁铁每次扫过的方向可能不同因为凸轮是连续旋转的信号会变成一个 50% 占空比的方波处理不好就会漏判。我参考了市面上几个开源控制器项目的思路最后用一个比较旧的但很有效的方案不要依赖每次干簧管的边沿而是统计两次边沿之间的时间差作为预估的翻页周期。当目标时间很远时用固定步进速率——比如每 800ms 触发一次翻页——连续执行目标次数。每翻一页系统都要检查一次干簧管是否在合理的时间窗口内出现过边沿如果连续 3 次没有就认为机械卡死立刻停止。实际测试中从 10:32 快翻到 23:18总共 526 页耗时约 8 分钟比原版电机通电后自己连续转要慢一些原版大约 6.5 分钟但胜在每一步都有确认不会翻飞。还有一种边界情况是手动快翻时跨过整点原本 Cifra 5 还有小时翻页结构快速翻分钟时小时盘也会跟着联动卡片负荷较大这时候我会在软件里自动把每次翻页间隔从 800ms 拉长到 1200ms给机械结构一个喘息。4.4 Web 控制面板方便远程操作ESP32 自带 WiFi可以起一个极简 HTTP 服务。我在固件里实现了一个只有几个接口的小页面查看当前显示时间、控制器状态、NTP 同步时间、最近一次翻页耗时设置手动翻页、快进 10 分钟、快退 10 分钟设置 UTC 偏移量和停机补偿窗口时长自动切换“自动模式”和“手动模式”这些功能一开始我以为只是便利工具后来发现实际使用中极有用。比如半夜听到翻页钟“啪”一声不够干脆我可以不用拆钟直接打开 Web 页面调整停机补偿时间改大 0.1 秒再观察几次。整个调试过程不必拿着螺丝刀蹲在墙边。5. 固件关键代码片段从 ESP32 到继电器的每一步这一节直接贴代码。给的代码不是完整工程但核心逻辑都齐了你在 Arduino IDE 或者 PlatformIO 里都能直接编译。完整工程我还放在自己服务器上后续有空会开源。5.1 引脚定义和状态机骨架#include WiFi.h #include time.h #include ESP32WebServer.h #define PIN_SSR 16 // 固态继电器控制端 #define PIN_REED 17 // 干簧管信号 #define PIN_BUZZER 25 // 蜂鸣器 #define PIN_BTN_FLIP 14 // 手动翻页 #define PIN_BTN_FAST 27 // 快进10分钟 #define PIN_BTN_RESET 26 // 复位整点 typedef enum { ST_IDLE, ST_FLIP, ST_COAST, ST_SETTLE, ST_ERROR } flip_state_t; flip_state_t state ST_IDLE; bool reedTriggered false; unsigned long flipStartMs 0; unsigned long coastStartMs 0; unsigned long lastNtpSync 0; int nextFlipOffsetMs 0; // 距离下一次翻页的毫秒数 // 配置 int coastCompMs 600; // 停机补偿窗口 int flipAdvanceMs 1200; // 提前启动量 int utcOffsetSec 8 * 3600; // UTC85.2 干簧管中断与翻页状态机主循环干簧管信号我用中断来处理但中断函数里只置标志位具体判断在loop()中做。这样一个中断处理得很干净不会因为Serial输出或者 Web 请求阻塞而漏掉边沿。void IRAM_ATTR onReedEdge() { static unsigned long lastInterrupt 0; unsigned long now millis(); if (now - lastInterrupt 50) { // 简单软件去抖 return; } lastInterrupt now; reedTriggered true; } void setup() { pinMode(PIN_SSR, OUTPUT); pinMode(PIN_REED, INPUT_PULLDOWN); pinMode(PIN_BUZZER, OUTPUT); pinMode(PIN_BTN_FLIP, INPUT_PULLUP); pinMode(PIN_BTN_FAST, INPUT_PULLUP); pinMode(PIN_BTN_RESET, INPUT_PULLUP); attachInterrupt(PIN_REED, onReedEdge, RISING); WiFi.mode(WIFI_STA); WiFi.begin(your-ssid, your-password); configTime(utcOffsetSec, 0, pool.ntp.org, time.nist.gov); state ST_IDLE; } void loop() { handleButtons(); switch (state) { case ST_IDLE: // 读取当前时间计算下一次翻页的触发点 if (isTimeSyncValid() !isFastForwarding) { int target 60 - ((second(getLocalTime()) * 1000 millis() % 1000) / 1000) * 1000; // 更简单的实现每秒检查一次 if (second(getLocalTime()) 58 millis() - flipStartMs 1000) { if (!flipStartedThisMinute) { startFlip(); } } } break; case ST_FLIP: // 等待干簧管信号如果超时进入错误态 if (reedTriggered) { reedTriggered false; // 进入停机补偿 coastStartMs millis(); state ST_COAST; } else if (millis() - flipStartMs 4000) { state ST_ERROR; digitalWrite(PIN_BUZZER, HIGH); } break; case ST_COAST: // 通电继续运行 coastCompMs 毫秒然后断电 if (millis() - coastStartMs coastCompMs) { digitalWrite(PIN_SSR, LOW); // 电机断电 settleStartMs millis(); state ST_SETTLE; } break; case ST_SETTLE: if (millis() - settleStartMs 1000) { state ST_IDLE; flipStartedThisMinute false; } break; case ST_ERROR: // 错误态等待 Web 或按键复位 break; } }这里第二段的target计算写得比较粗糙实际使用时我建议直接把nextFlipOffsetMs定义为“从当前单调毫秒时刻开始还差多久到下一次翻页”然后用一个定时器中断或者loop()里的millis()比较来触发。上面的简单实现能跑通但确实有 1-2ms 的抖动对翻页机械来说无所谓但对计时强迫症来说可以优化。5.3 手动快翻算法我实现了一个比较直接的快翻函数参数是目标分钟数。它需要先读取当前显示分钟数你可以从 NTP 获得也可以读干簧管累计的翻页次数推导然后计算差值。如果差值小于 120 分钟就一页一页翻每次翻完都等待干簧管确认如果差值很大就进入连续快翻模式。void fastForwardTo(int targetMinute) { int currentMinute getDisplayedMinute(); // 这个值可以通过记录每次翻页来维护 int diff (targetMinute - currentMinute 1440) % 1440; if (diff 0) return; int safeDiff diff; int intervalMs (diff 180) ? 1200 : 800; // 距离远时放慢间隔保护小时联动 digitalWrite(PIN_SSR, HIGH); // 先通电让机械系统进入运转状态 delay(200); for (int i 0; i safeDiff; i) { // 等待干簧管信号 unsigned long waitStart millis(); bool ok false; while (millis() - waitStart 2000) { if (reedTriggered) { reedTriggered false; ok true; break; } delay(5); } if (!ok) { digitalWrite(PIN_SSR, LOW); state ST_ERROR; return; } // 停机补偿防止惯性造成连续翻页 delay(coastCompMs 100); } digitalWrite(PIN_SSR, LOW); }这版代码的精髓在于“每翻一页都等干簧管确认”所以快翻的可靠性非常高。但要注意那段coastCompMs 100的延迟是必须的你不能在干簧管刚触发完就立刻进入下一次翻页否则机械机构还没离开危险相位下一次通电会带着惯性叠加两次动作卡片可能连续翻两页。5.4 WiFi 断线后的降级策略如果家里 WiFi 断了或者 NTP 服务器连不上不能让翻页钟就停摆。我做的策略是首次上电必须连接到 WiFi 才能进入自动模式否则就在 ERROR 状态等待。但如果自动模式运行一段时间后 WiFi 断开控制器会继续用本地时钟跑只是每次翻页时把ndT_SYNC_FLAG置为过期并在 Web 页面上显示“使用本地时钟最近未同步”。本地时钟漂移了一天几秒的情况下做一个机械翻页钟完全没问题。唯独跨日切换的时候要小心因为 Cifra 5 没有日期轮跨日只是正常翻到 00:00不做额外处理。6. 改装之后实测效果与几个必须知道的坑最后一部分说点实际体验和踩过的坑。这一节应该是最有价值的因为这些经验在说明书上不会写。6.1 翻页声音不再“哗啦哗啦”而是“啪——咔”原版电机持续运转时就算齿轮减速到底你依然会听到一种非常细碎的机械磨损声尤其夜深人静时会很明显。改造后用电机按需启动平时整个钟是完全安静的。到达整分钟时会有一个约 1 秒的短暂电机声随后是卡片“啪”地落下的声音紧接着是“咔”一声机械到位声。整个过程大概 1.5-2 秒然后就完全安静了。我实测过噪音数据离钟 1 米远手机分贝计显示的峰值从原来的约 42dB 降到了约 35dB。这 7dB 的差别对睡眠敏感的人来说能明显感知。6.2 坑一原版电机断电后的“幽灵旋转”我刚开始做第一个版本时用电磁继电器控制电机。继电器断开后我发现翻页钟偶尔还是会自己翻一页后来查了很久才确认电机虽然断电了但继电器断开瞬间电机线圈上存储的磁场能量会通过继电器触点的电弧释放形成短暂的“额外转动”带动凸轮又拨了一次卡片。这个现象在原版机械结构里几乎无法从外部察觉但用控制器的逻辑角度看就是“断命令发出去之后干簧管又触发了一次”。解决方式有两个一是改成 SSR 加 RC 吸收彻底消灭弧光放电二是软件上做逻辑冗余断电后连续检测两次干簧管信号只有在间距超过 1 秒时才视为一次完整翻页。我两个都做了现在基本没再出现幽灵翻页。6.3 坑二磁铁会吸附铁屑翻页钟内部不是全封闭的时间久了会在齿轮油里混入铁粉。磁铁贴在转轴上可能会把铁屑吸过来导致磁力减弱、干簧管检测不到。这个问题的根治方法是仔细清理钟内所有磁性杂质特别是在齿轮润滑脂附近最好用无磁性的塑料片把磁铁包一层只留感应面。6.4 坑三不同的 Digit5 仿品相位完全不同Cifra 5 原版和不同厂家的 Digit5 仿品虽然外观一样但内部齿轮减速比和凸轮安装相位有很大差别。我在一台老仿品上测试时干簧管的磁铁安装位置差了很多导致翻转周期估算全部错误快翻会出现“翻两页停一页”的情况。最直接的解决办法是拿到机器后不要直接改软件参数先手动转动分钟轴观察凸轮从“翻页开始”到“翻页结束”对应的一整圈在哪里再确定磁铁贴在哪。我在主程序里留了一个“相位标定模式”按住复位键 5 秒上电系统会通电让电机转一整圈干簧管每触发一次就打印一个角度值。跑两分钟后从串口数据里就能清楚看出安全停机点的相位范围然后把对应的停机补偿时间写进配置文件。6.5 整点联动调整Cifra 5 在整点时会触发小时卡片翻转这个动作负荷比普通分钟翻页大。如果发现整点时控制器的翻页时间明显变长很可能是因为小时卡片组的弹簧阻力变大。不要急着加大电机通电时间容易烧坏电机线圈。正确做法是先拆开小时卡片组清理卡片边缘毛刺再在弹簧转轴上少量涂一点塑料专用润滑脂。这个动作完成后整点翻页时间和普通分钟几乎一致。7. 留给自己和后来者的一句话从机械翻页钟的维修与改装角度看Cifra 5 是一台非常值得动手的老物件。我在做完这个控制器之后最大的感受是这已经不是单纯“把时间调准”的问题而是让一台上世纪中叶的机械设计真正融入到现代日常里——它安静、准时、可以控电半夜翻身时只会发出轻微的声音放在床头也不再是一种困扰。如果你也打算给类似的翻页钟加控制器我的建议是把第一版做成“最小可运行”的状态不要一上来就加入 WiFi、NTP、Web 面板这些花哨功能。先用一个干簧管、一个继电器和一块 Arduino把“通电解锁转翻页、干簧管确认后再断电”这一核心循环跑通。这个循环稳定了再在这个基础上叠加时间同步和快翻功能。等全套稳定之后你的翻页钟基本就再也不会因为机械和时间错位让你头疼了。
返回列表