【程式設計篇】加入使用者控制的技巧-上篇
本篇為『MAKER 系列』系列之程式設計篇子系列第四篇:加入使用者控制的技巧(上篇),針對在許多 I/O 腳位控制程序中,可以加入使用者操作來改變原有控制結果。<p>Arduino 開發版程式設計之中,使用者的控制介入非常頻繁而且重要,所以本章介紹加入使用者按下按鈕來改變 GPIO 的使用非常常見,本文使用按鈕當成使用者與系統的介面,進行互動(曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德, 2016; 曹永忠, 郭晉魁, 吳佳駿, 許智誠, &amp; 蔡英德, 2016a)。</p> <p>本文內容希望透過筆者的經驗,一步一步分享筆者解決這樣問題的經驗,透過這樣練習,讓讀者可以養成正確有效的寫作習慣,避免往後無所謂的臭蟲(Bugs)產生(曹永忠, 郭晉魁, 吳佳駿, 許智誠, &amp; 蔡英德, 2016b, 2017)。</p> <p>本系列希望貢獻筆者一些經驗,讓非資訊、電機、電子等 Makers 可以學到一些程式開發的技巧、原理、法則與穩固的技術,因本系列文章主要讀者為初學者,內容程度為基礎入門程度,深入之處不足,但請高手們給筆者賜教,也請讀者關注本系列。</p> <h2>控制流水燈方向</h2> <p>首先,裝好 Arduino 之後,不會安裝的讀者,請參閱筆者拙作『Arduino 程式教學(基本語法篇):Arduino Programming (Language &amp; Syntax)』(曹永忠, 許智誠, &amp; 蔡英德, 2016a, 2016b),先行安裝 Arduino IDE 開發環境(軟體下載請到:<a href="https://www.arduino.cc/en/Main/Software" target="_blank">https://www.arduino.cc/en/Main/Software</a>)。</p> <p>如下圖所示,這個實驗我們需要用到的實驗硬體有下圖.(a)的Arduino Mega 2560、下圖.(b) USB 下載線、下圖.(c) Led燈泡、下圖.(d) 220歐姆電阻與下圖.(e) 按鈕模組:</p> <p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/382314/original/a4ba2e694408004c0bdf8e8bc578e595.jpg?1486609658" alt="" /><br />▲圖1 使用者控制 Led 所需材料表</p> <p style="text-align: left;">讀者可以參考下圖所示之使用者控制 Led 電路圖,進行電路組立。</p> <p style="text-align: center;"><img src="https://cdn1-techbang.pixcdn.tw/system/images/382315/original/42e513b352fd2830f2a16d7f3659a490.jpg?1486609658" alt="" /><br /><br />▲圖2 使用者控制 Led 電路圖</p> <p style="text-align: left;">讀者也可以參考下表之腳位說明,進行電路組立。</p> <p style="text-align: center;"><span style="text-decoration: underline;"><strong>表1 使用者控制 Led 接腳表</strong></span><br /><img src="https://cdn0-techbang.pixcdn.tw/system/images/382316/original/4eaf95e85ed9ced649768fbf9b341786.jpg?1486609659" alt="" /><br /><img src="https://cdn2-techbang.pixcdn.tw/system/images/382317/original/7a668267b83d161263c1511cc980bffd.jpg?1486609659" alt="" /><br /><img src="https://cdn1-techbang.pixcdn.tw/system/images/382318/original/f171f6e3b7f621644190fbc0548dc03d.jpg?1486609660" alt="" /><br /><img src="https://cdn1-techbang.pixcdn.tw/system/images/382319/original/6cda2b6a0dc0395c5d4ed9058dfae264.jpg?1486609660" alt="" /></p> <p style="text-align: center;">下一頁還有更多精彩教學內容 ~</p> <p style="text-align: center;"><!-- pagebreak --></p> <p style="text-align: left;">我們攥寫一段程式,如下表所示之使用者控制 Led 程式一,開發板接上 LED 燈之後,將程式編譯完成後,上傳到開發板進行測試。&nbsp;</p> <blockquote> <p><span style="text-decoration: underline;"><strong>表2 使用者控制 Led 程式一</strong></span></p> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="572" valign="top"> <p class="a">使用者控制Led程式一(Water_light_with_Button)</p> </td> </tr> <tr> <td width="572" valign="top"> <p class="a">#define ButtonPin 2</p> <p class="a">int LedDirection = 1 ;</p> <p class="a">int LedPins[] = {4,5,6,7,8,9,10,11} ;</p> <p class="a">int NowLedOn = 0 ;</p> <p class="a">// the setup function runs once when you press reset or power the board</p> <p class="a">void setup() {</p> <p class="a">&nbsp; // initialize digital pin Blink_Led_Pin as an output.</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp; pinMode(ButtonPin,INPUT) ;</p> <p class="a">&nbsp;&nbsp;&nbsp; for(int i=0; i &lt;8 ; i++)</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pinMode(LedPins[i], OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digitalWrite(LedPins[i], LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p> <p class="a">&nbsp;</p> <p class="a">}</p> <p class="a">&nbsp;</p> <p class="a">// the loop function runs over and over again forever</p> <p class="a">void loop() {</p> <p class="a">&nbsp;&nbsp;&nbsp; int btnValue = digitalRead(ButtonPin) ;</p> <p class="a">&nbsp;&nbsp;&nbsp; if (!btnValue)</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LedDirection&nbsp; = LedDirection* (-1 );</p> <p class="a">&nbsp;&nbsp; //&nbsp; if</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i =0 ; i &lt; 8; i++)</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (NowLedOn == i)</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digitalWrite(LedPins[i], HIGH);&nbsp;&nbsp; // turn on Led</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digitalWrite(LedPins[i], LOW);&nbsp;&nbsp;&nbsp; // turn off Led</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p> <p class="a">&nbsp;</p> <p class="a">&nbsp;</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (LedDirection == 1)</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NowLedOn ++ ;&nbsp;&nbsp; //right side move</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NowLedOn -- ;&nbsp;&nbsp;&nbsp;&nbsp; //left side move</p> <p class="a">&nbsp;</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp; if (NowLedOn &gt;=8)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // check right side</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NowLedOn= 0 ;</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp; if (NowLedOn &lt; 0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // check left side</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NowLedOn= 7 ;</p> <p class="a">&nbsp;</p> <p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delay(1000) ;&nbsp;&nbsp;</p> <p class="a">}</p> </td> </tr> </tbody> </table> <p style="text-align: left;">程式下載:<br /><a href="https://github.com/brucetsao/arduino_Programming_Trick">https://github.com/brucetsao/arduino_Programming_Trick</a></p> </blockquote> <p>讀者也可以在作者 YouTube 頻道(<a href="https://www.youtube.com/user/UltimaBruce">https://www.youtube.com/user/UltimaBruce</a> )中,在網址<a href="https://www.youtube.com/watch?v=NnwL-hBWnBc&amp;feature=youtu.be" target="_blank">https://www.youtube.com/watch?v=NnwL-hBWnBc&amp;feature=youtu.be</a> ,看到本次實驗-使用者控制 Led 程式一。</p> <p>當然、如下圖所示,我們可以看到使用者控制 Led 程式一結果畫面,</p> <p style="text-align: center;"><img src="https://cdn1-techbang.pixcdn.tw/system/images/382320/original/2b5bebbb3569edf6a735287fe94ed8f2.jpg?1486609661" alt="" /><br />▲圖3 使用者控制 Led 程式一結果畫面</p> <p style="text-align: center;">最後一頁是作者的相關介紹唷 !</p> <p style="text-align: center;"><!-- pagebreak --></p> <h2 class="23421">後續</h2> <p>本篇為『MAKER 系列』系列之程式設計篇子系列第四篇:加入使用者控制的技巧(上篇),針對在許多 I/O 腳位控制程序中,可以加入使用者操作來改變原有控制結果。相信讀者會對程序中加入使用者控制程序的寫作概念,有更進一步的了解與體認。</p> <p>筆者本系列是針對非資訊、電機、電子等 Makers 攥寫的系列,這三、四年來在 Maker 領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。</p> <p>後續筆者還會繼續發表『MAKER 系列』系列的文章,在未來我們可以創造出更優質,更具未來性的物聯網(Internet of Thing:IOT)產品開發相關技術。</p> <p>敬請期待更多的文章。</p> <h2>作者介紹</h2> <p><span style="text-decoration: underline;"><strong>曹永忠 (Yung-Chung Tsao) </strong></span>,目前為自由作家暨專業Maker,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。長期投入創客運動、資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。<br />Email:[email protected]<br />Line ID:dr.brucetsao</p> <p><img src="https://cdn0-techbang.pixcdn.tw/system/images/382323/original/bd4b3604844a9d568e447a2219944a3a.jpeg?1486610899" alt="" /><br />臉書社群(Arduino.Taiwan):<a href="https://www.facebook.com/groups/Arduino.Taiwan/" target="_blank">https://www.facebook.com/groups/Arduino.Taiwan/</a><br />Github網站:<a href="https://github.com/brucetsao/" target="_blank">https://github.com/brucetsao/</a><br />Youtube:<a href="https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ" target="_blank">https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ</a></p> <p><span style="text-decoration: underline;"><strong>郭晉魁 (Jinn-Kwei Guo)</strong></span>,國立成功大學電機工程研究所通訊組博士,目前任教於崑山科技大學電腦與通訊系,主要研究為智慧家庭與物聯網應用技術,已獲得二十多個相關專利。<br />Email: [email protected]<br />Github開放原始碼網址:<a href="https://github.com/ghostyguo" target="_blank">https://github.com/ghostyguo</a></p> <p><span style="text-decoration: underline;"><strong>吳佳駿 (Chia-Chun Wu)</strong></span>,國立中興大學資訊科學與工程學系博士,現任教於國立金門大學工業工程與管理學系專任助理教授,目前兼任國立金門大學計算機與網路中心資訊網路組組長,主要研究為軟體工程與應用、行動裝置程式設計、物件導向程式設計、網路程式設計、動態網頁資料庫、資訊安全與管理。<br />Email: [email protected]</p> <p><span style="text-decoration: underline;"><strong>許智誠 (Chih-Cheng Hsu)</strong></span>,美國加州大學洛杉磯分校(UCLA) 資訊工程系博士,曾任職於美國IBM等軟體公司多年,現任教於中央大學資訊管理學系專任副教授,主要研究為軟體工程、設計流程與自動化、數位教學、雲端裝置、多層式網頁系統、系統整合。<br />Email: [email protected]</p> <p><span style="text-decoration: underline;"><strong>蔡英德 (Yin-Te Tsai)</strong></span>,國立清華大學資訊科學系博士,目前是靜宜大學資訊傳播工程學系教授、靜宜大學計算機及通訊中心主任,主要研究為演算法設計與分析、生物資訊、軟體開發、視障輔具設計與開發。<br />Email:[email protected]</p> <h2><span style="font-size: 16px;"><br /></span>參考文獻</h2> <p>曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2016). Arduino程式設計教學(基礎篇):Arduino Programming (Writing Style &amp; Skills) (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p> <p>曹永忠, 許智誠, &amp; 蔡英德. (2016a). Arduino程式教學(基本語法篇):Arduino Programming (Language &amp; Syntax) (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p> <p>曹永忠, 許智誠, &amp; 蔡英德. (2016b). Arduino程序教学(基本语法篇) :Arduino Programming (Language &amp; Syntax) (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p> <p>曹永忠, 郭晉魁, 吳佳駿, 許智誠, &amp; 蔡英德. (2016a). Arduino程序设计教学(基础篇):Arduino Programming (Writing Style &amp; Skills) (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p> <p>曹永忠, 郭晉魁, 吳佳駿, 許智誠, &amp; 蔡英德. (2016b). MAKER系列-程式設計篇:多腳位定義的技巧(上篇). 智慧家庭. Retrieved from <br /><a href="http://www.techbang.com/posts/48026-program-review-pin-definition-part-one" target="_blank">http://www.techbang.com/posts/48026-program-review-pin-definition-part-one</a></p> <p>曹永忠, 郭晉魁, 吳佳駿, 許智誠, &amp; 蔡英德. (2017). MAKER系列-程式設計篇:多腳位定義的技巧(下篇). 智慧家庭.</p><a href="http://www.facebook.com/TKbang">加入T客邦Facebook粉絲團</a><img src="http://feeds.feedburner.com/~r/techbang/~4/Gc6Hwgv50M4" height="1" width="1" alt=""/>