這一題發問的時間也很久了,連我也忘了當初是哪位同學提出的問題?加上這題不好做工作又忙,只能找時間慢慢處理
這一題不如當初提問同學想的那麼簡單,只要將部落格內關於電子鐘和簡易定時程式相結合就可以解決。根據附加的條件使這題很難處理,有很多細節要克服
鬧鐘題目條件:
1.使用7段LED數字顯示電子鐘時間
2.可設定鬧鈴啟動時間,時間到達時響鈴
3.有貪睡按鈕,每按一次延後5分鐘響鈴,可按3次共延長15分鐘,3次以後貪睡按鈕無作用
4.有解除按鈕,按下後解除響鈴
5.響鈴為每隔1秒間歇響鈴,響鈴時間2分鐘,2分鐘後停止響鈴
6.程式不能使用事件結構
以上條件看似簡單,但有幾個較麻煩的技術問題要處理:
1.跨日期時的時間處理,這包含很多部分:
a.響鈴時間的2分鐘剛好有跨過日期時
b.貪睡按鈕延長的時間跨日期時
c.設定時間剛好在跨日期的時間點(0點0分)上時
2.解除按鈕按下後恢復待機的處理方法:在跨日期時自動恢復待機
3.時間重新設定時如何判斷是否要恢復待機
4.各主要操作功能的順序鎖定:如響鈴沒有動作時,貪睡按鈕和解除按鈕沒有作用,貪睡按鈕按達到3次時自我鎖定,直到恢復待機時覆原
在仔細檢討整個動作流程後,把程式一些主要部分以SubVI方式處理。除了可使程式畫面較簡單外,也可提升程式執行效率
整個程式的編寫可說是置頂文章LabVIEW寫作心得的實踐
首先從SubVI的編寫開始說明:
一.7段LED顯示器解碼:
程式面板分成數值輸入和7個LED元件構成數字的叢集輸出
程式部分則是先把0~9的7個LED變化狀態構成2D陣列,輸入的數值為索引取出相對應的狀態,再將陣列轉成叢集資料形態輸出
二.設定鬧鈴時間:
程式面板完全按照規畫的輸出入接點去排列,左邊全是以輸入為主,輸出全放到右邊。SubVI的接點以這樣排列可避免連線時交錯混亂
程式部分:
修改時間在觸發時會取代設定時間,同時也會取代動作時間,這樣的設定是要在系統重置時,將被貪睡按鈕改過的動作時間復原
同時程式會比較新設定的時間是否大於等於系統時間,是的話就輸出True到觸發OUT,成為待機訊號
三.貪睡時間計算:
程式面板同樣是按照規畫把輸出入接點分左右邊排列,後續SubVI也是同樣處理
程式的重點是待機訊號要True時才能動作,另外貪睡按鈕按滿3次,則程式不動作
另一個重點是先計算(分),當加上的延長時間(分)超過要進位時,則時間(時)進位,當時間(時)超過時(超過跨日點)則時歸0
四.鬧鈴時間比對:
程式面板
程式部分則是在系統時間到達時開始輸出True給鬧鈴啟動訊號,同時開始累積計時,當累積計時達到時,則輸出False給鬧鈴啟動訊號
之所以使用累積計時方式是要避開跨時進位和跨日進位的複雜計算
五.鬧鈴解除訊號:
程式面板
這個SubVI的啟動條件就是鬧鈴啟動訊號為True
程式重點是直接關閉聲音輸出的程式,只有單一動作,為一復原成待機狀態的方法就是待機訊號要True
六.間歇訊號輸出:
程式面板
程式重點是在鬧鈴啟動訊號為True時,以秒為單位交替輸出True和False訊號
再來是整個程式架構部分:
1.操作資料流的初始化:
a.迴圈外左上:主要是設定時間,和判斷系統時間是否小於等於設定時間,若小於等於設定時間則讓待機的訊號True。另外程式有很多資料要傳遞,使用了大量的移位暫存器,在每條移位暫存器資料上附加了簡單文字標明資料用途
b.迴圈外左下:響鈴聲音輸出設定,借用範例程式改造。設定以方波輸出44.1千赫,這樣的設定是要聲音夠吵又不刺耳
2.程式上方往下一開始是把系統時間輸出,透過7段LED顯示器解碼SubVI轉換成電子鐘顯示
3.其次是設定時間輸入,這裡有加上限制條件,確保輸入的數值在合理的範圍內
4.接著設定鬧鈴時間SubVI和貪睡時間計算SubVI串連。設定鬧鈴時間SubVI兼具系統復歸重置的作用,所以在控制輸入端多加了當系統時間等於0時0分時觸發復歸的訊號
設定鬧鈴時間SubVI輸出的訊號同時控制後續的SubVI是否可以待機預備動作
貪睡時間計算SubVI則是受響鈴啟動的訊號控制是否能動作
5.再來鬧鈴時間比對SubVI比對系統時間是否大於等於動作時間,於時間到達時輸出響鈴啟動True訊號,於響鈴2分鐘後輸出響鈴啟動False訊號
6.鬧鈴解除訊號SubVI同樣受響鈴啟動的訊號控制是否能動作,動作時強迫控制聲音輸出的SubVI輸出False訊號
可由設定鬧鈴時間SubVI輸出的訊號控制復歸
7.右邊則是控制電子鐘面板上時分秒之間點的閃爍
8.間歇訊號輸出SubVI則是在收到響鈴啟動True訊號後,以每秒的間隔輸出不連續的True訊號
9.在收到不連續的True訊號時輸出方波聲音
10.整體程式架構如下圖:
程式執行畫面:
留言列表