【程式設計篇】加入使用者控制的技巧- 下篇

【程式設計篇】加入使用者控制的技巧- 下篇

本篇為『MAKER系列』系列之程式設計篇子系列第五篇:加入使用者控制的技巧(下篇),乃是加入使用者控制的技巧(上篇)之下集,主要針對在許多I/O腳位控制程序中,可以加入使用者操作來改變原有控制結果。

文\曹永忠、郭晉魁、吳佳駿、許智誠、蔡英德

筆者本系列是針對非資訊、電機、電子等 Makers 攥寫的系列,這三、四年來在 Maker 領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。

在 Arduino 開發版程式設計之中,使用者的控制介入非常頻繁而且重要,所以本章介紹加入使用者按下按鈕來改變 GPIO 的使用非常常見,本文使用按鈕當成使用者與系統的介面,進行互動(曹永忠, 吳佳駿, 許智誠, & 蔡英德, 2016; 曹永忠, 郭晉魁, 吳佳駿, 許智誠, & 蔡英德, 2016a)。

本文內容希望透過筆者的經驗,一步一步分享筆者解決這樣問題的經驗,透過這樣練習,讓讀者可以養成正確有效的寫作習慣,避免往後無所謂的臭蟲(Bugs)產生(曹永忠, 郭晉魁, 吳佳駿, 許智誠, & 蔡英德, 2016b, 2017)。

本系列希望貢獻筆者一些經驗,讓非資訊、電機、電子等 Makers 可以學到一些程式開發的技巧、原理、法則與穩固的技術,因本系列文章主要讀者為初學者,內容程度為基礎入門程度,深入之處不足,但請高手們給筆者賜教,也請讀者關注本系列。

解決按鈕不靈敏問題

在上文中,我們可以發現,雖然我們加入了控制程序,但是由於 Arduino 開發板,其程序是循序式的,所以雖然我們在中間加入了使用者程序,但是在整個程序中,他是屬於循序式的,所以當使用者要求改變程序動作時,還必須等待整個程序完成後,下一輪程序到使用者程序開始時,才可以開始改變動作內容為使用者所需要的內容,這樣對對使用者要求,並非即時。

所以本文要改進這個問題,我們使用硬體插斷來改進這樣問題,讀者也可以參考下表之腳位說明,進行電路組立。

表1 使用者控制 Led 接腳表

【程式設計篇】加入使用者控制的技巧- 下篇
【程式設計篇】加入使用者控制的技巧- 下篇
【程式設計篇】加入使用者控制的技巧- 下篇
【程式設計篇】加入使用者控制的技巧- 下篇

讀者回頭看上表所示之使用者控制 Led 程式一,我們發現,關於D2這個腳位, 連接按鈕模組的 singal 訊號端,當按鈕按下時,會送出低電位,此時我們透過 digitalRead(D2)去讀取值,但是讀取值在 loop()區塊,第一行,必須要將下面亮燈,熄燈的程式完成後,方能執行透過 digitalRead(D2)去讀取值。

這樣問題是
1. 如果按下按鈕時,正在熄燈、亮燈程序中,那按下動作便無法執行到
2. 如果讀取到值,要下次熄燈、亮燈程序後,方能更新反向熄燈、亮燈。

鑒於如此,我們使用硬體插斷方式(曹永忠, 许智诚, & 蔡英德, 2014; 曹永忠, 許智誠, & 蔡英德, 2014a, 2014b, 2014c, 2015a, 2015b, 2015c, 2015d, 2015e, 2015f, 2016a, 2016b),來進行程式改寫:

所以我們使用了『const byte interruptPin = 2;』這個指令,來替代D2的設定腳位變數,把程式開頭處加入:

const byte interruptPin = 2;

我們再 setup()程式區,使用了『硬體插斷』這個技巧,把下表程式開頭處加入 setup()程式區最下方:

 pinMode(interruptPin, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(interruptPin), ButtonisPressed, FALLING );

}

最後我們加入硬體插斷處裡函式:ButtonisPressed()

void ButtonisPressed()

{

   LedDirection  = LedDirection* (-1 );

}

其他地方都類似於使用者控制 Led 程式一的內容,將程式轉成如下表所示之使用者控制 Led 程式二,將程式編譯完成後,上傳到開發板進行測試。

下一頁還有教學哦 !!

曹永忠
作者

曹永忠,國立中央大學資訊管理學系博士,目前在暨南大學電機工程學系兼任助理教授與自由作家,專注於軟體工程、軟體開發與設計、物件導向程式設計......並持續發表作相關專業著作。

使用 Facebook 留言
發表回應
謹慎發言,尊重彼此。按此展開留言規則