此專案使用 WEMOS D1 Mini ESP8266 模組和 Arduino 程式,連接到 NTP(網路時間協定)伺服器,以自動擷取並在便宜的石英指針時鐘上顯示本地時間。ESP8266 每 15 分鐘重新連接一次 NTP 伺服器,以保持時鐘的準確性。時鐘也會自動調整夏令時間。

我使用的是在當地 Walmart 購買的石英機芯指針時鐘,價格為 3.88 美元。無論您選擇使用哪種指針時鐘,其石英機芯都需要修改,以便能由 ESP8266 模組控制。打開機芯(大多數都可以直接卡合,無需任何緊固件),將 Lavet 步進馬達的內部線圈與其石英振盪器斷開連接,然後將電線焊接到線圈的每個引線上,以便與 ESP8266 連接。如果您在網路上搜尋,會找到其他人的做法。操作線圈時請小心。線圈的電線通常比頭髮還細,且極易損壞。

程式碼 AnalogClock.ino 應該(我希望)足夠清晰,但在此簡要總結其運作方式。每秒十次,ESP8266 會將指針時鐘顯示的時間與從 NTP 伺服器擷取的實際時間進行比較。如果指針時鐘落後於實際時間,ESP8266 會向前移動時鐘的秒針,直到時鐘與實際時間一致。如果指針時鐘顯示的時間超前於實際時間,ESP8266 會直接等待,直到實際時間追上指針時鐘,因為它無法將時鐘的指針向後移動。

ESP8266 透過產生正負交替的雙極脈衝到時鐘的 Lavet 馬達線圈來移動指針時鐘的秒針。由於時鐘機芯的差異,您可能需要增加或減少程式碼中的「PULSETIME」常數幾毫秒,以使您的機芯能夠可靠地步進。根據實驗,我發現 30 毫秒對我的機芯效果最好。

使用這些便宜的指針時鐘進行此類專案的最大問題是,時鐘不提供任何類型的回饋來指示指針的位置。因此,如果控制時鐘的 ESP8266 斷電,ESP8266 會「忘記」指針的位置。為了解決這個問題,時針、分針和秒針的位置儲存在 Microchip 47L04 Serial EERAM(4Kbit SRAM 帶 EEPROM 備份)中,並在指針位置改變時每秒更新。如果斷電,ESP8266 在重新供電時可以從 EERAM 擷取指針的最後位置。

程式碼首次運行時,使用者將被導向由 ESP8266 提供的一個簡單網頁(見下文),用於告知它指針的初始位置。從那時起,ESP8266 將使用儲存在 EERAM 中的數據來「記住」指針的位置。