在工農業自動化控制系統中,即時時鐘(RTC)是一個非常重要的功能。
例如農業的指定時段自動澆水,每天8:00-9:00之間自動打開電磁閥澆水;
此功能需要控制器有RTC時鐘,以及日曆來決定執行輸出來控制電磁閥的開/關;
RTC時鐘的一個重要特點是控制器在斷電後繼續由電池供電,這就要求RTC模組的供電與處理器其他部分的供電分開,並且工作電流要很低,才能保證斷電後時鐘有足夠長的時間維持時間。
以STM32F103處理器為例,該處理器有一個獨立的VBAT引腳用於RTC模組功能,RTC模組的工作電流約為2uA左右,如果使用5mAh可充電紐扣電池供電,時脈保持時間可以達到208天.
另外,RTC時鐘還需要低頻32.768k晶振來提供時鐘,以達到低功耗的目的,被動晶振一般可以達到30ppm左右的精度,一年的時間誤差在15左右分鐘。
主動晶振一般可以達到5ppm左右的精確度;每年時間誤差約2分鐘;
ESP8266沒有這樣的RTC模組,如果透過I2C介面外接RTC晶片,會增加產品的成本,無法達到30元左右的售價。
但是ESP8266的優點是易於連接互聯網,可以透過互聯網自動校準時間。
因此,我透過軟體設計了一個RTC時鐘模組,正常的做法是寫萬年曆的程式碼,計算秒,處理分、時、日的四捨五入以及閏年,月份和一系列問題;
ESP8266 提供了 mktime 和 localtime 兩個函數,可以實現日曆和時間戳記的相互轉換。
這兩個函數的使用只需要計算秒數,然後轉換為日曆即可,而星期幾則可以透過Caille公式由年月日計算出來;
雲端伺服器的TCP伺服器程式碼中,當收到控制器發送的心跳訊息時,伺服器會解析出訊息中控制器目前的時間值並與伺服器的時間進行比較,當差值超過某個值,然後伺服器發送命令設定時間並校準控制器的時間。
在控制器的程式碼中,兩個變數V225和V226用於記錄校準時間的狀態,其中V225在控制器上電後清零,並在伺服器發出校準時間命令時設定為1接收並執行修改時間的操作;
V226上電後清零,並在1s tik內累加到最大值,只有當控制器被伺服器校準後,才會重新清零並繼續累積。
使用者可以在執行某些動作之前使用腳本編程來判斷變數V225是否為1,以確保控制器時鐘準確以進行自動化控制;
還可以判斷V226超過一定值,執行輸出,控制聲光警報設備,以便在控制器無法取得正確時間時,即時報警提醒。
另一個想法是,有些控制器無法連網自動校正時間,可以將時間戳記保存在FLASH中,控制器斷電重啟後從FLASH中讀取保存的時間戳繼續計時,這樣控制器重啟時不會將時間重設為預設值,由於儲存的時間戳記之間的時間間隔加上斷電時間而導致的斷電。
問題是FLASH的擦除次數有限制,模組內建的FLASH只能擦除1000次左右。
如果時間戳以 1 小時為間隔保存,則 1000 次擦除將使控制器持續約 41 天。
這顯然是不可接受的。
以上是基於ESP6的簡易可程式控制器自動雲端校準的RTC設計的詳細內容。更多資訊請關注PHP中文網其他相關文章!