【MAKER系列】程式設計篇- DEFINE 的運用
本篇為『MAKER 系列』系列之程式設計篇子系列第一篇:前置變數宣告的運用。筆者本系列是針對非資訊、電機、電子等 Makers 攥寫的系列,這三、四年來在 Maker 領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。<p>本系列希望貢獻筆者一些經驗,讓非資訊、電機、電子等 Makers 可以學到一些程式開發的技巧、原理、法則與穩固的技術,因本系列文章主要讀者為初學者,內容程度為基礎入門程度,深入之處不足,但請高手們給筆者賜教,也請讀者關注本系列。</p> <h2>Arduino 的 Hello World</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>)。&nbsp;</p> <p>如下圖所示,這個實驗我們需要用到的實驗硬體有下圖.(a)的 Arduino Mega 2560與下圖.(b) USB 下載線:</p> <p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/372262/original/df5883f9be7a38f72a84ab856e0dc7c0.jpg?1479361071" alt="" /><br />▲圖1 LED 測試所需材料表</p> <p>讀者可以參考下圖所示之LED測試連接電路圖,進行電路組立。</p> <p style="text-align: center;"><img src="https://cdn2-techbang.pixcdn.tw/system/images/372263/original/408145af844d89ae3fb3ce803d01f0ba.jpg?1479361072" alt="" /></p> <p style="text-align: center;">▲圖2 LED 測試連接電路圖</p> <p style="text-align: left;">讀者也可以參考下表之腳位說明,進行電路組立。</p> <p style="text-align: left;"><img style="display: block; margin-left: auto; margin-right: auto;" src="https://cdn2-techbang.pixcdn.tw/system/images/372264/original/68d0edd5086ee2fa40fc8889d81a198a.jpg?1479361072" alt="" /><img style="display: block; margin-left: auto; margin-right: auto;" src="https://cdn1-techbang.pixcdn.tw/system/images/372265/original/33b7efff9743024ac804f24e826745dd.jpg?1479361073" alt="" /></p> <p>讀者開啟 Arduino IDE 開發環境後,如下圖所示,請用範例:Blink,打開之後,如下圖所示:</p> <p style="text-align: center;"><img src="https://cdn1-techbang.pixcdn.tw/system/images/372266/original/fe5cf5e94199fdc12abb9393fb099b2a.jpg?1479361073" alt="" /><br />▲圖3 開啟 Blink 範例</p> <p style="text-align: left;">我們攥寫一段程式,如下表所示之 Blink 範例程式,開發板接上 LED 燈之後,將程式編譯完成後,上傳到開發板進行測試。</p> <blockquote> <h3>表2 Blink 範例程式</h3> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="572" valign="top"> <p class="a">Blink 範例程式(Blink)<strong>&nbsp;</strong></p> </td> </tr> <tr> <td width="572" valign="top"> <p class="a">/*</p> <p class="a">&nbsp; Blink</p> <p class="a">&nbsp; Turns on an LED on for one second, then off for one second, repeatedly.</p> <p class="a">&nbsp;</p> <p class="a">&nbsp; Most Arduinos have an on-board LED you can control. On the Uno and</p> <p class="a">&nbsp; Leonardo, it is attached to digital pin 13. If you're unsure what</p> <p class="a">&nbsp; pin the on-board LED is connected to on your Arduino model, check</p> <p class="a">&nbsp; the documentation at http://www.arduino.cc</p> <p class="a">&nbsp;</p> <p class="a">&nbsp; This example code is in the public domain.</p> <p class="a">&nbsp;</p> <p class="a">&nbsp; modified 8 May 2014</p> <p class="a">&nbsp; by Scott Fitzgerald</p> <p class="a">&nbsp;*/</p> <p class="a">&nbsp;</p> <p class="a">&nbsp;</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 13 as an output.</p> <p class="a">&nbsp; pinMode(13, OUTPUT);&nbsp;&nbsp;&nbsp; //定義D13為輸出腳位</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; digitalWrite(13, HIGH);&nbsp;&nbsp; // 將腳位D13設定為高電位&nbsp; turn the LED on (HIGH is the voltage level)</p> <p class="a">&nbsp; delay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //休息1秒 wait for a second&nbsp;</p> <p class="a">&nbsp; digitalWrite(13, LOW);&nbsp;&nbsp;&nbsp; // 將腳位D13設定為低電位&nbsp; turn the LED off by making the voltage LOW</p> <p class="a">&nbsp; delay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 休息1秒 wait for a second</p> <p class="a">}</p> </td> </tr> </tbody> </table> </blockquote> <p style="text-align: center;">程式下載:<a href="https://github.com/brucetsao/arduino_Programming_Trick">https://github.com/brucetsao/arduino_Programming_Trick</a></p> <p style="text-align: left;">讀者也可以在作者 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>,看到本次實驗-Blink 範例程式結果畫面。</p> <p style="text-align: left;">當然、如下圖所示,我們可以看到 Blink 範例程式結果畫面,</p> <p style="text-align: center;"><img src="https://cdn2-techbang.pixcdn.tw/system/images/372267/original/7fe1df182c9ac0fedd309b99c35eb443.jpg?1479361074" alt="" /></p> <p style="text-align: center;"><img src="https://cdn2-techbang.pixcdn.tw/system/images/372268/original/dab2d3de520d5b1bc837c43c2f1fde3d.jpg?1479361075" alt="" /><br />▲圖4 Blink 範例程式結果畫面</p> <p style="text-align: center;">下一頁還有教學唷!</p> <p style="text-align: center;"><!-- pagebreak --></p> <h2 class="23421">如果 LED 腳位變動</h2> <p>如果,我們在 Blink 程式中,如果腳位變換,將數位腳位13變動到數位腳位8,讀者可參考下圖所示之 LED 測試連接電路圖(腳位八),進行電路組立。</p> <p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/372269/original/6060b0c22ba8e238ca45114a3293aed9.jpg?1479361075" alt="" /><br />▲圖5 LED 測試連接電路圖(腳位八)</p> <p style="text-align: left;">讀者也可以參考下表之腳位說明,進行電路組立。</p> <h3>表3 LED 測試接腳表</h3> <p style="text-align: center;"><img src="https://cdn2-techbang.pixcdn.tw/system/images/372270/original/510a6b1a22d0c1a42bb56044e7dabbba.jpg?1479361075" alt="" /></p> <p style="text-align: center;"><img src="https://cdn1-techbang.pixcdn.tw/system/images/372271/original/9d71191d9ecf3e924393ec8399dfec2d.jpg?1479361076" alt="" /></p> <p style="text-align: left;">讀者回頭看上表所示之 Blink 範例程式(Blink),我們發現,關於 D13這個腳位,出現在行數20、行數25、行數27,共三處,此時我們僅將 D13這個腳位改變到D8這個腳位,小小簡單的 Blink 範例程式(Blink),就需要修改三處,那更複雜的程式豈不更多,如果一處沒有修改到,豈不是變成臭蟲(Bugs)或隱藏性的臭蟲(Bugs)。</p> <p style="text-align: left;">所以我們使用了『#define』這個指令,來替代D13,把程式開頭處加入:</p> <blockquote> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="557" valign="top"> <p>#define Blink_Led_Pin 8</p> </td> </tr> </tbody> </table> </blockquote> <p>之後所有用到 D13的地方,都修改為『Blink_Led_Pin』,轉成如下表所示之 Blink_使用 DEFINE 範例程式,將程式編譯完成後,上傳到開發板進行測試。</p> <blockquote> <h3>表4 Blink_使用 DEFINE 範例程式</h3> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="572" valign="top"> <p class="a">Blink_使用 DEFINE 範例程式(Blink_D8)</p> </td> </tr> <tr> <td width="572" valign="top"> <p class="a">#define Blink_Led_Pin 8</p> <p class="a">&nbsp;</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; pinMode(Blink_Led_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</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; digitalWrite(Blink_Led_Pin, HIGH);&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為高電位&nbsp; turn the LED on (HIGH is the voltage level)</p> <p class="a">&nbsp; delay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //休息1秒 wait for a second&nbsp;</p> <p class="a">&nbsp; digitalWrite(Blink_Led_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p> <p class="a">&nbsp; delay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 休息1秒 wait for a second</p> <p class="a">}</p> </td> </tr> </tbody> </table> <p style="text-align: center;">程式下載:<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=f_Bkc_MPkCg&amp;feature=youtu.be" target="_blank">https://www.youtube.com/watch?v=f_Bkc_MPkCg&amp;feature=youtu.be</a>,看到本次實驗- Blink_使用 DEFINE 範例程式(Blink_D8)結果畫面。</p> <p style="text-align: left;">當然、如下圖所示,我們可以看到 Blink_使用 DEFINE 範例程式(Blink_D8)結果畫面,</p> <p style="text-align: center;"><img src="https://cdn1-techbang.pixcdn.tw/system/images/372272/original/cf707e96ba7e81c9464d9309293e8e04.jpg?1479361526" alt="" /></p> <p style="text-align: center;"><img src="https://cdn1-techbang.pixcdn.tw/system/images/372273/original/31647878f5478391c70cce7bce28c95a.jpg?1479361526" alt="" /><br />▲圖6 Blink_使用 DEFINE 範例程式(Blink_D8)結果畫面</p> <p style="text-align: center;">下一頁還有更多教學唷 !!</p> <p style="text-align: center;"><!-- pagebreak --></p> <h2 class="23421">使用 INCLUDE 之後 LED 腳位變動</h2> <p>所以我們使用了『#define』這個指令,來替代 D13,把程式開頭處加入:</p> <blockquote> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="557" valign="top"> <p>#define Blink_Led_Pin 8</p> </td> </tr> </tbody> </table> </blockquote> <p>之後所有用到 D13的地方,都修改為『Blink_Led_Pin』,如果我們在 Blink 這樣的程式中,如果再度腳位變換,將數位腳位13變動到數位腳位3,讀者只需變動 led 腳位,再將下列程式將『Blink_Led_Pin 8』 改為『Blink_Led_Pin 3』進行程式改寫。</p> <blockquote> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="557" valign="top"> <p>#define Blink_Led_Pin 3</p> </td> </tr> </tbody> </table> </blockquote> <p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/372274/original/28a1a190d53d99f5dc696f4c16d86908.jpg?1479361527" alt="" /><br />▲圖7 LED 測試連接電路圖(腳位三)</p> <p style="text-align: left;">只需將『Blink_Led_Pin 8』 改為『Blink_Led_Pin 3』進行程式改寫,其他地方都不需要改寫,將程式編譯完成後,上傳到開發板進行測試。</p> <blockquote> <h3 style="text-align: left;">表5 Blink_使用 DEFINE 範例程式一</h3> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="572" valign="top"> <p class="a">Blink_使用DEFINE範例程式一(Blink_D3)</p> </td> </tr> <tr> <td width="572" valign="top"> <p class="a">#define Blink_Led_Pin 3</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; pinMode(Blink_Led_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p> <p class="a">}</p> <p class="a">// the loop function runs over and over again forever</p> <p class="a">void loop() {</p> <p class="a">&nbsp; digitalWrite(Blink_Led_Pin, HIGH); &nbsp;&nbsp;// 將腳位Blink_Led_Pin設定為高電位&nbsp; turn the LED on (HIGH is the voltage level)</p> <p class="a">&nbsp; delay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //休息1秒 wait for a second&nbsp;</p> <p class="a">&nbsp; digitalWrite(Blink_Led_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p> <p class="a">&nbsp; delay(1000);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 休息1秒 wait for a second</p> <p class="a">}</p> </td> </tr> </tbody> </table> <p style="text-align: center;">程式下載:<br /><a href="https://github.com/brucetsao/arduino_Programming_Trick">https://github.com/brucetsao/arduino_Programming_Trick</a></p> </blockquote> <p style="text-align: left;">讀者也可以在作者 YouTube 頻道(<a href="https://www.youtube.com/user/UltimaBruce">https://www.youtube.com/user/UltimaBruce</a> )中,在網址<a href="https://www.youtube.com/watch?v=3AO1_Q39gEo&amp;feature=youtu.be" target="_blank">https://www.youtube.com/watch?v=3AO1_Q39gEo&amp;feature=youtu.be</a> ,看到本次實驗- Blink_使用 DEFINE 範例程式一(Blink_D3)結果畫面。</p> <p style="text-align: left;">當然、如下圖所示,我們可以看到 Blink_使用 DEFINE 範例程式一(Blink_D3)結果畫面,</p> <p style="text-align: center;"><img src="https://cdn1-techbang.pixcdn.tw/system/images/372275/original/8db6e89edd27e4bfbed26603109538eb.jpg?1479361527" alt="" /></p> <p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/372276/original/60d729df185740b0541e5fb0ac5db229.jpg?1479361528" alt="" /><br />▲圖8 Blink_使用 DEFINE 範例程式一(Blink_D3)結果畫面</p> <h2 style="text-align: left;">使用 INCLUDE 之後好處</h2> <p>所以我們使用了『#define』這個指令,宣告腳位變數要使用的所有腳位,並再用到相關腳位時候,所有腳位都用腳位變數來替代,如此,不僅更方便,而且臭蟲(Bugs)會更少,這是又是我們再攥寫 Arduino 程式時,常常使用的一個技巧。希望讀者閱讀本文之後,可以學到這個技巧,並可以熟用這個技巧,在往後將會把程式寫得更加穩定,系統更加龐大,複雜與功能強大,但臭蟲(Bugs)會更少。</p> <p style="text-align: center;">最後一頁有後續及筆者介紹唷 !</p> <p style="text-align: center;"><!-- pagebreak --></p> <h2 style="text-align: left;">後續</h2> <p>篇為『MAKER系列』系列之程式設計篇子系列第一篇:前置變數宣告的運用。筆者本系列是針對非資訊、電機、電子等Makers攥寫的系列,這三、四年來在Maker領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。</p> <p>後續筆者還會繼續發表『MAKER系列』系列的文章,在未來我們可以創造出更優質,更具未來性的物聯網(Internet of Thing:IOT)產品開發相關技術。</p> <p>敬請期待更多的文章。</p> <blockquote> <h3>筆者介紹</h3> <p><strong>曹永忠 (Yung-Chung Tsao)</strong>:目前為自由作家,專注於軟體工程、軟體開發與設計、物件導向程式設計、物聯網系統開發、Arduino 開發、嵌入式系統開發,商品攝影及人像攝影。長期投入資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。</p> <p><img src="https://cdn2-techbang.pixcdn.tw/system/images/372277/original/bdf05bbc857a8a5d62e4813aaef86f81.jpeg?1479361529" alt="" /></p> <p>Email:<a href="mailto:[email protected]">[email protected]<br /></a>Line ID:dr.brucetsao <br />Arduino部落格:<a href="http://taiwanarduino.blogspot.tw/">http://taiwanarduino.blogspot.tw/<br /></a>臉書社群(Arduino.Taiwan):<br /><a href="https://www.facebook.com/groups/Arduino.Taiwan/">https://www.facebook.com/groups/Arduino.Taiwan/<br /></a>Youtube:<a href="https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ">https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ</a></p> <h2>參考文獻:&nbsp;</h2> <p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2016a). <em>Arduino</em><em>程式教學(</em><em>基本語法篇):Arduino Programming (Language &amp; Syntax)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p> <p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2016b). <em>Arduino</em><em>程序教学(</em><em>基本语法篇) :Arduino Programming (Language &amp; Syntax)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> </blockquote> <p>&nbsp;</p> <p style="text-align: left;">&nbsp;</p><a href="http://www.facebook.com/TKbang">加入T客邦Facebook粉絲團</a><img src="http://feeds.feedburner.com/~r/techbang/~4/f7i2IBRZUb4" height="1" width="1" alt=""/>