有用電腦的人都知道,電腦一旦當機(大陸稱:死機)了,只能按下重新開機鈕Reset,或稱:重置),讓一切重來。
事實上Arduino系統也是這樣,有可能是因為外界的雜訊、電磁干擾,或程式本身的問題,或各種情況等,導致Arduino系統無法如預期正常運作,變成當機,碰到這種情形,也只能靠人工去按下它的重新開機鈕。
不過,不是所有的Arduino應用,都適合人工去按下重新開機鈕,有時候環境很複雜,一天可能當機5、6次,每天去按5、6次,也是很煩人的。
或者,Arduino的應用是在一些外部環境,例如架設在高架道路上,用來偵測與累計超過多少高度的車輛每天有多少輛,若這樣的系統當機了,就得派人去現場按重新開機鈕,人得爬高上去按,每天當一天,每天爬一次。
或者,在工廠輸送帶的生產線上,設置一個用Arduino控制的最終打印器,偵測到產品靠近,就自動替產品外包裝蓋上字樣,確定可以出貨,如果這樣的打印器當機了,就必須停止整條生產線,等待重新開機,才能恢復原有生產程序,這樣影響太大了。
解決方案:看門狗計時器
針對上述這種狀況,其實Arduino的系統晶片內,是有一個看門狗計時器(Watch Dog Timer, WDT),可以解決上述問題的。
看門狗計時器說穿了,就是一個「定時對Arduino系統按下重新開機鈕」的內部裝置,Arduino的看門狗計時器,最長可以設每8秒按一下重新開機,最短可以到15毫秒。
到此各位可能有個疑惑?若系統正常運作,卻被看門狗計時器下令重新開機,這不等於是擾亂運作嗎?
是的,所以,在開發撰寫Arduino控制程式時,必須每隔一段時間,下令清除看門狗計時器的計時值,讓計時器重新累計時間,如此就可以延後看門狗計時器按下重新開機的時間。
因此,若要讓Arduino系統良善運作,不想被看門狗計時器來搗亂,則控制程式每隔一段時間去清計時值,這個時間必須短於看門口計時器的週期時間,否則就真的會被看門狗計時器給干擾運作,這必須在寫程式時好好考慮一下,甚至需要一段時間的測試驗證,以便微調看門狗的計時週期時間,或者是微調控制程式清除計時值的週期時間。
尤其要考慮控制程式,主程式外加副程式(函式)等的運作週期,最久時間會是多長,必須事先掌握,以此來調整看門狗計時器的時間,如果清除計時值的指令是放在主程式,但實際執行時,卻碰到系統一直在副程式內執行,久久不能回返,就會導致看門狗計時器自行重新開機。
反之若把清除指令用於副程式,但卻很久沒去執行副程式,一樣會遭到看門狗發出的重新開機。當然,保險點就是時時去清除它,但太過頻繁也會增加系統運作的負荷與功耗。
最後,看門狗計時器的功效,基本上不在Arduino的核心函式庫內,但在avr-gcc編譯器內還是有的,且Arduino的Bootloader不支援,若真的要用,得用建議的ISP下載器去直接下載程式才行。以下是程式撰寫時,如何使用看門狗計時器的一些範例程式:
其中timeout要填入常數,有10個週期時間可選,如WDTO_2S、WDTO_8S等,TO即Timeout的意思,2S等於2秒週期,8S等於8秒週期。有機會各位也摸索嘗試。
- Ollama官方模型分類觀察 - 2025/06/13
- COMPUTEX Taipei 2025量子技術展示觀察 - 2025/05/29
- Arduino Cloud Editor加入大語言模型幫手功能 - 2025/05/28
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!