發表文章

目前顯示的是 1月, 2020的文章

A001 番外篇 如何處理需要等很久的外部呼叫

圖片
A001 番外篇  如何處理需要等很久的外部呼叫         有個FB朋友私我,問我說,要呼叫一個DS18B20 溫度計,但是精度要很高的話,會被哪個感測器拉住很長的時間,導致按鈕的掃描繪被嚴重延遲那要怎麼做? 其實Arduino 很多的Lib 的Example 在設計的時候都是以你只要跑一個功能來設計的,這樣使用的人會比較好了解怎麼去使用那個Lib. 但是如果使用者要同時呼叫很多不同的Lib 的時候就會有撞牆的問題。 以上述的DS18D20 溫度感測器來說,Loop 裡面如果週期性的要取得溫度,然後更新,同時還要接收使用者的按鈕輸入時,就很容易遇到在讀取溫度的時候,按鈕沒法按的問題,為何?? 因為 DS18B20 進行轉換溫度的時候 ,不能即時回應,要等待一陣子才行。 這就會像這樣,你去餐廳點餐。餐點要現做,於是你點餐後只能在那邊等老闆煮好。。 所以你就只能在那邊等,哪裡也不能去。。。。。 但是,如果您在點完餐之後,稍微了解一下老闆多久之後可以煮好,那從點餐到煮好的這段時間,您就可以跑去做你自己的事情了!! 所以這樣怎麼實做最簡單,假設外部的設備需要10 秒才能回應,是否就要停止運作10秒等它呢? 這裡使用 simpleTimer 這個好玩的Lib 來做解釋。 假設我們要點一個LED 燈,十秒之後要滅掉,一般最暴力的大概就是這樣 loop(){ digitalWrite(LED_PIN, HIGH); delay(100000); digitalWrite(LED_PIN, LOW); } 不過這樣做,所有的時間都花在delay 上面了,啥事也不能做,所以簡單的調用一下SimpleTimer 的 setTimeout(unsigned long d, timer_callback f) 就可以簡單的處理這種需要等待很久時間後才需要進行下一個動作的呼叫。 簡單的範例程式碼如下 ,大致來說就是,程式設定一個定時鬧鐘,鬧鐘到了就去做我們規定的事情。 下面的範例是設定一個10 秒後會自動把LED關掉的鬧鐘。所以使用者只要把燈開起來之後,10秒後鬧鐘就會自己起來把LED 給關了。 在Loop() 中,因為要讓鬧...