本篇為『MAKER 系列』系列之程式設計篇子系列第二篇:多腳位定義的技巧(上篇)。筆者本系列是針對非資訊、電機、電子等 Makers 攥寫的系列,這三、四年來在 Maker 領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。<p>文 / 曹永忠、郭晉魁、吳佳駿、許智誠、蔡英德</p>
<p>在 Arduino 開發版程式設計之中,同時使用多個 GPIO 非常常見,但是 GPIO 腳位的變動更是頻繁,一旦 GPIO 腳位變動,相對應的程式必須要相對變更,然而使用 GPIO 腳位的程式碼散佈在程式碼到處都是,一旦 GPIO 腳位變動,許多程式碼沒有全部變更,則產生許多隱藏性的臭蟲(Bugs)。本文內容希望透過筆者的經驗,一步一步分享筆者解決這樣問題的經驗,透過這樣練習,讓讀者可以養成正確有效的寫作習慣,避免往後無所謂的臭蟲(Bugs)產生。本系列希望貢獻筆者一些經驗,讓非資訊、電機、電子等 Makers 可以學到一些程式開發的技巧、原理、法則與穩固的技術,因本系列文章主要讀者為初學者,內容程度為基礎入門程度,深入之處不足,但請高手們給筆者賜教,也請讀者關注本系列。</p>
<h3>流水燈</h3>
<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 Mega2560、下圖.(b) USB 下載線、下圖.(c) Led 燈泡、下圖.(d) 220 歐姆電阻:</p>
<p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/375230/original/34fcaf404cd6173168d0d134134a8862.jpg?1481164847" alt="" /><br />▲圖 1 LED 測試所需材料表</p>
<p style="text-align: left;">讀者可以參考下圖所示之 LED 測試連接電路圖,進行流水燈電路組立。</p>
<p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/375231/original/bc689af9e46304a258bd4194cdd95acf.jpg?1481164847" alt="" /><br />▲圖 2 流水燈連接電路圖</p>
<p style="text-align: left;">讀者也可以參考下表之腳位說明,進行電路組立。</p>
<p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/375232/original/d75afc135ae51196ecc5b0c9e62fc609.jpg?1481164848" alt="" /><br /><img src="https://cdn2-techbang.pixcdn.tw/system/images/375233/original/bdb162363cefcc9a7b92372d8fe1486f.jpg?1481164848" alt="" /><br />▲表 1 LED 測試接腳表</p>
<p style="text-align: center;">下一頁有程式的撰寫哦 ~</p>
<p style="text-align: center;"><!-- pagebreak --></p>
<p style="text-align: left;">讀者開啟 Arduino IDE 開發環境後,我們攥寫一段程式,如下表所示之流水燈範例程式,開發板接上八組 LED 燈之後,將程式編譯完成後,上傳到開發板進行測試。</p>
<blockquote>
<h3 style="text-align: left;">表 2 流水燈範例程式</h3>
</blockquote>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="572" valign="top">
<blockquote>
<p class="a">流水燈範例程式(Water_light)</p>
</blockquote>
</td>
</tr>
<tr>
<td width="572" valign="top">
<blockquote>
<p class="a">#define Led1_Pin 4</p>
<p class="a">#define Led2_Pin 5</p>
<p class="a">#define Led3_Pin 6</p>
<p class="a">#define Led4_Pin 7</p>
<p class="a">#define Led5_Pin 8</p>
<p class="a">#define Led6_Pin 9</p>
<p class="a">#define Led7_Pin 10</p>
<p class="a">#define Led8_Pin 11</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(Led1_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p class="a">&nbsp; pinMode(Led2_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p class="a">&nbsp; pinMode(Led3_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p class="a">&nbsp; pinMode(Led4_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p class="a">&nbsp; pinMode(Led5_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p class="a">&nbsp; pinMode(Led6_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p class="a">&nbsp; pinMode(Led7_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p class="a">&nbsp; pinMode(Led8_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p class="a">&nbsp; digitalWrite(Led1_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led2_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led3_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led4_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led5_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led6_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led7_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led8_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</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; // Step 0</p>
<p class="a">&nbsp; digitalWrite(Led1_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led2_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led3_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led4_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led5_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led6_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led7_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led8_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&nbsp;</p>
<p class="a">&nbsp; // Step 1</p>
<p class="a">&nbsp; digitalWrite(Led1_Pin, HIGH);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led2_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led3_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led4_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led5_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led6_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led7_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led8_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&nbsp;</p>
<p class="a">&nbsp;&nbsp;&nbsp; // Step 2</p>
<p class="a">&nbsp; digitalWrite(Led1_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led2_Pin, HIGH);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led3_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led4_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led5_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led6_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led7_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led8_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&nbsp;</p>
<p class="a">&nbsp;&nbsp;&nbsp; // Step 3</p>
<p class="a">&nbsp; digitalWrite(Led1_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led2_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led3_Pin, HIGH);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led4_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led5_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led6_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led7_Pin, LOW);&nbsp; &nbsp;&nbsp;// 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led8_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&nbsp;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Step 4</p>
<p class="a">&nbsp; digitalWrite(Led1_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led2_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led3_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led4_Pin, HIGH);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led5_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led6_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led7_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led8_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&nbsp;</p>
<p class="a">&nbsp;&nbsp;&nbsp; // Step 5</p>
<p class="a">&nbsp; digitalWrite(Led1_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led2_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led3_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led4_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led5_Pin, HIGH);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led6_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led7_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led8_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&nbsp;</p>
<p class="a">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;// Step 6</p>
<p class="a">&nbsp; digitalWrite(Led1_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led2_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led3_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led4_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led5_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led6_Pin, HIGH);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led7_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led8_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&nbsp;</p>
<p class="a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Step 7</p>
<p class="a">&nbsp; digitalWrite(Led1_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led2_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led3_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led4_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led5_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led6_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led7_Pin, HIGH);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led8_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&nbsp;</p>
<p class="a">&nbsp;&nbsp;&nbsp; // Step 8</p>
<p class="a">&nbsp; digitalWrite(Led1_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led2_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led3_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led4_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led5_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led6_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led7_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p class="a">&nbsp; digitalWrite(Led8_Pin, HIGH);&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&nbsp;</p>
<p class="a">}</p>
</blockquote>
</td>
</tr>
</tbody>
</table>
<p style="text-align: right;">程式下載:<a href="https://github.com/brucetsao/arduino_Programming_Trick" target="_blank">https://github.com/brucetsao/arduino_Programming_Trick</a></p>
<p style="text-align: left;">讀者也可以在作者 YouTube 頻道(<a href="https://www.youtube.com/user/UltimaBruce" target="_blank">https://www.youtube.com/user/UltimaBruce</a> )中,在網址<a href="https://www.youtube.com/watch?v=3eeIpdJVJoE&amp;feature=youtu.be" target="_blank">https://www.youtube.com/watch?v=3eeIpdJVJoE&amp;feature=youtu.be</a> ,看到本次實驗-流水燈範例程式結果畫面。</p>
<p style="text-align: center;">下一頁還有更多精彩教學喔 !</p>
<p style="text-align: center;"><!-- pagebreak --></p>
<p style="text-align: left;">當然、如下圖所示,我們可以看到流水燈範例程式結果畫面,</p>
<p style="text-align: center;"><img src="https://cdn0-techbang.pixcdn.tw/system/images/375234/original/853e36c915f9c1361ff4fdf5b948ce0d.jpg?1481164849" alt="" /><br />▲圖 3 流水燈範例程式結果畫面</p>
<h3 style="text-align: left;">使用陣列簡化程式</h3>
<p>如下圖所示,我們發現我們使用八個 Leds 燈,而燈號成為連續數字,所以我們如果使用陣列變數來代表腳位,可以更有效管理這些腳位。</p>
<p style="text-align: center;"><img src="https://cdn2-techbang.pixcdn.tw/system/images/375235/original/fd5d3ef46ec5d00ba0abd23888b5c671.jpg?1481164849" alt="" /><br />▲圖 4 流水燈連接電路圖</p>
<p style="text-align: left;">我們在上表:流水燈範例程式,我們用 define 變數來代表腳位,但由於一個腳位一個變數,八個腳位就有八個變數,所以每一個腳位變動都必須要透過變數來重設腳位的高低電位來控制 Led 燈暗或燈亮。在C語言當中,我們常用迴圈指令來簡化處理連續數字或陣列,整個程式會更加簡化(曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德, 2016a, 2016b, 2016c, 2016d, 2016e, 2016f, 2016g, 2016h)。 讀者回頭看上表所示之流水燈範例程式,我們發現,雖然用 define 變數簡化了腳位變動時,只需變更#define 變數後面的值,但是這僅僅簡化了腳位變動後需改變程式內容的地方,但是大量的腳位,還是需要更龐大的處理程式。所以我們使用了『int LedPins[]』這個指令,來替代{4,5,6,7,8,9,10,11}共八個腳位,把程式開頭處加入:</p>
<blockquote>
<p style="text-align: left;">int LedPins[] = {4,5,6,7,8,9,10,11} ;</p>
</blockquote>
<p style="text-align: left;">我們再將下表腳位定義與下表腳位定義,使用迴圈的技術。</p>
<h3 style="text-align: left;">表 3 腳位定義</h3>
<p>pinMode(Led1_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p>&nbsp; pinMode(Led2_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p>&nbsp; pinMode(Led3_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p>&nbsp; pinMode(Led4_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p>&nbsp; pinMode(Led5_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p>&nbsp; pinMode(Led6_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p>&nbsp; pinMode(Led7_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p>&nbsp; pinMode(Led8_Pin, OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<h3>表 4 腳位初始化</h3>
<p>digitalWrite(Led1_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p>&nbsp; digitalWrite(Led2_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p>&nbsp; digitalWrite(Led3_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p>&nbsp; digitalWrite(Led4_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p>&nbsp; digitalWrite(Led5_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p>&nbsp; digitalWrite(Led6_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p>&nbsp; digitalWrite(Led7_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p>&nbsp; digitalWrite(Led8_Pin, LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p>我們透過 for(i)迴圈,來將下列設定程式包括進去</p>
<p>pinMode(LedPins[i], OUTPUT);&nbsp;&nbsp;&nbsp; //定義Blink_Led_Pin為輸出腳位</p>
<p>digitalWrite(LedPins[i], LOW);&nbsp;&nbsp;&nbsp; // 將腳位Blink_Led_Pin設定為低電位&nbsp; turn the LED off by making the voltage LOW</p>
<p>所以程式就成下列程式:</p>
<p>for(int i=0; i &lt;8 ; i++)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&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>&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>我們發現,十六行的程式簡化成四行,依樣達到相同效果。</p>
<p>我們將使用陣列與迴圈設定腳位程式,上傳到開發板進行測試。</p>
<blockquote>
<h3>表 5 使用陣列與迴圈設定腳位程式</h3>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="572" valign="top">
<p class="a">使用陣列與迴圈設定腳位程式(Water_light_Array_for_Setup)</p>
</td>
</tr>
<tr>
<td width="572" valign="top">
<p class="a">int LedPins[] = {4,5,6,7,8,9,10,11} ;</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; 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;</p>
<p class="a">}</p>
</td>
</tr>
</tbody>
</table>
<blockquote>程式下載:<a href="https://github.com/brucetsao/arduino_Programming_Trick" target="_blank">https://github.com/brucetsao/arduino_Programming_Trick</a></blockquote>
</blockquote>
<p style="text-align: center;">下一頁有作者介紹和後續哦</p>
<p style="text-align: center;"><!-- pagebreak --></p>
<p>本篇為『MAKER 系列』系列之程式設計篇子系列第二篇:多腳位定義的技巧(上篇)。筆者本系列是針對非資訊、電機、電子等 Makers 攥寫的系列,這三、四年來在 Maker 領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。</p>
<p>後續筆者還會繼續發表『MAKER 系列』系列的文章,在未來我們可以創造出更優質,更具未來性的物聯網(Internet of Thing:IOT)產品開發相關技術。</p>
<p>敬請期待更多的文章。</p>
<blockquote>
<h3>作者介紹</h3>
<p><strong>曹永忠 (Yung-Chung Tsao) ,</strong>目前為自由作家暨專業 Maker,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。長期投入創客運動、資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。</p>
<p><img src="https://cdn1-techbang.pixcdn.tw/system/images/375236/original/ab1322354aecec737bb3bdf9ab56389f.jpeg?1481164850" alt="" /></p>
<p>Email:<a href="mailto:[email protected]">[email protected]<br /></a>Line ID:dr.brucetsao<br />臉書社群(Arduino.Taiwan):<a href="https://www.facebook.com/groups/Arduino.Taiwan/">https://www.facebook.com/groups/Arduino.Taiwan/<br /></a>Github網站:<a href="https://github.com/brucetsao/">https://github.com/brucetsao/<br /></a>Youtube:<a href="https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ">https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ</a></p>
<p><strong>郭晉魁 (Jinn-Kwei Guo)</strong>,國立成功大學電機工程研究所通訊組博士,目前任教於崑山科技大學電腦與通訊系,主要研究為智慧家庭與物聯網應用技術,已獲得二十多個相關專利。</p>
<p>Email: <a href="mailto:[email protected]">[email protected]<br /></a>Github開放原始碼網址:<a href="https://github.com/ghostyguo">https://github.com/ghostyguo</a></p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="553" valign="top">
<p><strong>吳佳駿 (Chia-Chun Wu)</strong>,國立中興大學資訊科學與工程學系博士,現任教於國立金門大學工業工程與管理學系專任助理教授,目前兼任國立金門大學計算機與網路中心資訊網路組組長,主要研究為軟體工程與應用、行動裝置程式設計、物件導向程式設計、網路程式設計、動態網頁資料庫、資訊安全與管理。</p>
<p>Email: <a href="mailto:[email protected]">[email protected]</a></p>
</td>
</tr>
</tbody>
</table>
<br />
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="553" valign="top">
<p><strong>許智誠 (Chih-Cheng Hsu)</strong>,美國加州大學洛杉磯分校(UCLA) 資訊工程系博士,曾任職於美國IBM等軟體公司多年,現任教於中央大學資訊管理學系專任副教授,主要研究為軟體工程、設計流程與自動化、數位教學、雲端裝置、多層式網頁系統、系統整合。</p>
<p>Email: <a href="mailto:[email protected]">[email protected]</a></p>
</td>
</tr>
</tbody>
</table>
<br />
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="553" valign="top">
<p><strong>蔡英德 (Yin-Te Tsai)</strong>,國立清華大學資訊科學系博士,目前是靜宜大學資訊傳播工程學系教授、靜宜大學計算機及通訊中心主任,主要研究為演算法設計與分析、生物資訊、軟體開發、視障輔具設計與開發。</p>
<p>Email:<a href="mailto:[email protected]">[email protected]</a></p>
</td>
</tr>
</tbody>
</table>
</blockquote>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="553" valign="top">
<p>&nbsp;</p>
<blockquote>
<h3>參考文獻:&nbsp;</h3>
<p class="EndNoteBibliography">曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2016a). <em>Ameba</em><em>气氛灯程序开发(</em><em>智能家庭篇):Using Ameba to Develop a Hue Light Bulb (Smart Home)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2016b). <em>Ameba</em><em>氣氛燈程式開發(</em><em>智慧家庭篇):Using Ameba to Develop a Hue Light Bulb (Smart Home)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2016c). <em>Ameba</em><em>程式設計(</em><em>基礎篇):Ameba RTL8195AM IOT Programming (Basic Concept &amp; Tricks)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2016d). <em>Ameba</em><em>程式設計(</em><em>進階篇):Ameba RTL8195AM IOT Programming (Advanced Tricks)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2016e). <em>Ameba</em><em>程序设计(</em><em>进阶篇):Ameba RTL8195AM IOT Programming (Advanced Tricks)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2016f). <em>Ameba</em><em>程序设计(</em><em>基础篇):Ameba RTL8195AM IOT Programming (Basic Concept &amp; Tricks)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2016g). <em>Arduino</em><em>程式設計教學(</em><em>基礎篇):Arduino Programming (Writing Style &amp; Skills)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2016h). <em>Arduino</em><em>程序设计教学(</em><em>基础篇):Arduino Programming (Writing Style &amp; Skills)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<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>
</blockquote>
</td>
</tr>
</tbody>
</table>
<blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
</blockquote>
<p style="text-align: left;">&nbsp;</p>
<blockquote>
<p>&nbsp;</p>
</blockquote><a href="http://www.facebook.com/TKbang">加入T客邦Facebook粉絲團</a><img src="http://feeds.feedburner.com/~r/techbang/~4/Y3c9tw_fITk" height="1" width="1" alt=""/>