本篇為『MAKER系列』系列之程式設計篇子系列第五篇:加入使用者控制的技巧(下篇),乃是加入使用者控制的技巧(上篇)之下集,主要針對在許多I/O腳位控制程序中,可以加入使用者操作來改變原有控制結果。<p>文\曹永忠、郭晉魁、吳佳駿、許智誠、蔡英德</p>
<p>筆者本系列是針對非資訊、電機、電子等 Makers 攥寫的系列,這三、四年來在 Maker 領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。</p>
<p>在 Arduino 開發版程式設計之中,使用者的控制介入非常頻繁而且重要,所以本章介紹加入使用者按下按鈕來改變 GPIO 的使用非常常見,本文使用按鈕當成使用者與系統的介面,進行互動(曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德, 2016; 曹永忠, 郭晉魁, 吳佳駿, 許智誠, &amp; 蔡英德, 2016a)。</p>
<p>本文內容希望透過筆者的經驗,一步一步分享筆者解決這樣問題的經驗,透過這樣練習,讓讀者可以養成正確有效的寫作習慣,避免往後無所謂的臭蟲(Bugs)產生(曹永忠, 郭晉魁, 吳佳駿, 許智誠, &amp; 蔡英德, 2016b, 2017)。</p>
<p>本系列希望貢獻筆者一些經驗,讓非資訊、電機、電子等 Makers 可以學到一些程式開發的技巧、原理、法則與穩固的技術,因本系列文章主要讀者為初學者,內容程度為基礎入門程度,深入之處不足,但請高手們給筆者賜教,也請讀者關注本系列。</p>
<h3>解決按鈕不靈敏問題</h3>
<p>在上文中,我們可以發現,雖然我們加入了控制程序,但是由於 Arduino 開發板,其程序是循序式的,所以雖然我們在中間加入了使用者程序,但是在整個程序中,他是屬於循序式的,所以當使用者要求改變程序動作時,還必須等待整個程序完成後,下一輪程序到使用者程序開始時,才可以開始改變動作內容為使用者所需要的內容,這樣對對使用者要求,並非即時。</p>
<p>所以本文要改進這個問題,我們使用硬體插斷來改進這樣問題,讀者也可以參考下表之腳位說明,進行電路組立。</p>
<p style="text-align: center;"><span style="text-decoration: underline;"><strong>表1 使用者控制 Led 接腳表</strong></span></p>
<p style="text-align: center;"><span style="text-decoration: underline;"><strong><img src="https://cdn2-techbang.pixcdn.tw/system/images/385084/original/e7b04fdb50d943694146fad9f781ada2.jpg?1488772928" alt="" /><br /><img src="https://cdn1-techbang.pixcdn.tw/system/images/385085/original/d435cc09a17409fc1401837530068a94.jpg?1488772929" alt="" /><br /><img src="https://cdn0-techbang.pixcdn.tw/system/images/385086/original/5eb11fca588818f4ba4552605e39f8c9.jpg?1488772930" alt="" /><br /><img src="https://cdn2-techbang.pixcdn.tw/system/images/385087/original/f15816783e5c6a76738ced874b23614f.jpg?1488772930" alt="" /></strong></span></p>
<p style="text-align: left;">讀者回頭看上表所示之使用者控制 Led 程式一,我們發現,關於D2這個腳位, 連接按鈕模組的 singal 訊號端,當按鈕按下時,會送出低電位,此時我們透過 digitalRead(D2)去讀取值,但是讀取值在 loop()區塊,第一行,必須要將下面亮燈,熄燈的程式完成後,方能執行透過 digitalRead(D2)去讀取值。</p>
<p style="text-align: left;">這樣問題是<br />1. 如果按下按鈕時,正在熄燈、亮燈程序中,那按下動作便無法執行到<br />2. 如果讀取到值,要下次熄燈、亮燈程序後,方能更新反向熄燈、亮燈。</p>
<p style="text-align: left;">鑒於如此,我們使用硬體插斷方式(曹永忠, 许智诚, &amp; 蔡英德, 2014; 曹永忠, 許智誠, &amp; 蔡英德, 2014a, 2014b, 2014c, 2015a, 2015b, 2015c, 2015d, 2015e, 2015f, 2016a, 2016b),來進行程式改寫:</p>
<p style="text-align: left;">所以我們使用了『const byte interruptPin = 2;』這個指令,來替代D2的設定腳位變數,把程式開頭處加入:</p>
<blockquote>
<p style="text-align: left;">const byte interruptPin = 2;</p>
</blockquote>
<p style="text-align: left;">我們再 setup()程式區,使用了『硬體插斷』這個技巧,把下表程式開頭處加入 setup()程式區最下方:</p>
<blockquote>
<p>&nbsp;pinMode(interruptPin, INPUT_PULLUP);</p>
<p>&nbsp; attachInterrupt(digitalPinToInterrupt(interruptPin), ButtonisPressed, FALLING );</p>
<blockquote>}</blockquote>
</blockquote>
<p>最後我們加入硬體插斷處裡函式:ButtonisPressed()</p>
<blockquote>
<p>void ButtonisPressed()</p>
<p>{</p>
<p>&nbsp;&nbsp; LedDirection&nbsp; = LedDirection* (-1 );</p>
<blockquote>}</blockquote>
</blockquote>
<p>其他地方都類似於使用者控制 Led 程式一的內容,將程式轉成如下表所示之使用者控制 Led 程式二,將程式編譯完成後,上傳到開發板進行測試。</p>
<p style="text-align: center;">下一頁還有教學哦 !!</p>
<p style="text-align: center;"><!-- pagebreak --></p>
<p style="text-align: center;">表2 使用者控制 Led 程式二</p>
<blockquote>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="572" valign="top">
<p class="a">使用者控制Led程式二(Water_light_Button_int)</p>
</td>
</tr>
<tr>
<td width="572" valign="top">
<p class="a">const byte interruptPin = 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; // 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; pinMode(interruptPin, INPUT_PULLUP);</p>
<p class="a">&nbsp; attachInterrupt(digitalPinToInterrupt(interruptPin), ButtonisPressed, FALLING );</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;&nbsp; // int btnValue = digitalRead(ButtonPin) ;</p>
<p class="a">&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delay(1000) ;&nbsp;&nbsp;</p>
<p class="a">}</p>
<p class="a">void ButtonisPressed()</p>
<p class="a">{</p>
<p class="a">&nbsp;&nbsp; LedDirection&nbsp; = LedDirection* (-1 );</p>
<p class="a">}</p>
</td>
</tr>
</tbody>
</table>
<blockquote>程式下載:<br /><a href="https://github.com/brucetsao/arduino_Programming_Trick">https://github.com/brucetsao/arduino_Programming_Trick</a></blockquote>
</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=Kbj_DLyvOa8&amp;feature=youtu.be" target="_blank">https://www.youtube.com/watch?v=Kbj_DLyvOa8&amp;feature=youtu.be</a> ,看到本次實驗-使用者控制 Led 程式二結果畫面。</p>
<p>當然、如下圖所示,我們可以看到使用者控制Led程式二結果畫面,。</p>
<p style="text-align: center;"><img src="https://cdn1-techbang.pixcdn.tw/system/images/385088/original/f1e1e3f72e1dd70f7be76da1cc0fb278.jpg?1488772931" alt="" /><br />圖1 使用者控制 Led 程式二結果畫面</p>
<h3 class="23421">使用硬體插斷的好處</h3>
<p>我們使用了『硬體插斷』這個技巧,並把實體按鈕的訊號輸出當成硬體插斷的觸發,透過硬體插斷執行函式來產生方向變數的變更,加快了使用者快速、有效的反應,並這樣的技巧,讓程式更加簡潔、方便。</p>
<p>硬體插斷這個技巧,這是又是我們再攥寫 Arduino 程式時,常常使用的一個技巧。希望讀者閱讀本文之後,可以學到這個技巧,並可以熟用這個技巧,在往後將會把程式寫得更加穩定,系統更加龐大,複雜與功能強大,但臭蟲(Bugs)會更少。</p>
<h3 class="23421">後續</h3>
<p>本篇為『MAKER 系列』系列之程式設計篇子系列第五篇:加入使用者控制的技巧(下篇),針對在許多 I/O 腳位控制程序中,使用者操作使用硬體插斷來改變原有控制結果。相信讀者會對程序中加入使用者控制程序的寫作概念,有更進一步的了解與體認。</p>
<p>筆者本系列是針對非資訊、電機、電子等 Makers 攥寫的系列,這三、四年來在 Maker 領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。</p>
<p>後續筆者還會繼續發表『MAKER 系列』系列的文章,在未來我們可以創造出更優質,更具未來性的物聯網(Internet of Thing:IOT)產品開發相關技術。</p>
<p>敬請期待更多的文章。</p>
<p style="text-align: center;">最後一頁是作者的介紹哦~</p>
<p style="text-align: center;"><!-- pagebreak --></p>
<h2 style="text-align: left;">作者介紹</h2>
<p>曹永忠 (Yung-Chung Tsao) ,目前為自由作家暨專業Maker,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。長期投入創客運動、資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。</p>
<p><img src="https://cdn0-techbang.pixcdn.tw/system/images/385089/original/89c113328c91c17bd828fea9c0d518ff.jpeg?1488772931" alt="" /><br /><span style="text-decoration: underline;"><strong>Email</strong></span>:[email protected]<br /><span style="text-decoration: underline;"><strong>Line ID</strong></span>:dr.brucetsao<br /><span style="text-decoration: underline;"><strong>臉書社群(Arduino.Taiwan)</strong></span>:<a href="https://www.facebook.com/groups/Arduino.Taiwan/Github" target="_blank">https://www.facebook.com/groups/Arduino.Taiwan/Github</a><br /><span style="text-decoration: underline;"><strong>網站</strong></span>:<a href="https://github.com/brucetsao/" target="_blank">https://github.com/brucetsao/</a><br /><span style="text-decoration: underline;"><strong>Youtube</strong></span>:<a href="https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ" target="_blank">https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ</a></p>
<p>郭晉魁 (Jinn-Kwei Guo),國立成功大學電機工程研究所通訊組博士,目前任教於崑山科技大學電腦與通訊系,主要研究為智慧家庭與物聯網應用技術,已獲得二十多個相關專利。<br /><span style="text-decoration: underline;"><strong>Email</strong></span>: [email protected]<br /><span style="text-decoration: underline;"><strong>Github</strong><strong>開放原始碼網址</strong></span>:<a href="https://github.com/ghostyguo" target="_blank">https://github.com/ghostyguo</a></p>
<p>吳佳駿 (Chia-Chun Wu),國立中興大學資訊科學與工程學系博士,現任教於國立金門大學工業工程與管理學系專任助理教授,目前兼任國立金門大學計算機與網路中心資訊網路組組長,主要研究為軟體工程與應用、行動裝置程式設計、物件導向程式設計、網路程式設計、動態網頁資料庫、資訊安全與管理。<br /><span style="text-decoration: underline;"><strong>Email</strong></span>: [email protected]</p>
<p>許智誠 (Chih-Cheng Hsu),美國加州大學洛杉磯分校(UCLA) 資訊工程系博士,曾任職於美國IBM等軟體公司多年,現任教於中央大學資訊管理學系專任副教授,主要研究為軟體工程、設計流程與自動化、數位教學、雲端裝置、多層式網頁系統、系統整合。<br /><span style="text-decoration: underline;"><strong>Email</strong></span>: [email protected]</p>
<p>蔡英德 (Yin-Te Tsai),國立清華大學資訊科學系博士,目前是靜宜大學資訊傳播工程學系教授、靜宜大學計算機及通訊中心主任,主要研究為演算法設計與分析、生物資訊、軟體開發、視障輔具設計與開發。<br /><span style="text-decoration: underline;"><strong>Email</strong></span>:[email protected]</p>
<h2 style="text-align: left;">參考文獻:</h2>
<blockquote>
<p class="EndNoteBibliography">曹永忠, 许智诚, &amp; 蔡英德. (2014). <em>Arduino </em><em>光立体魔术方块开发: Using Arduino to Develop a 4* 4 Led Cube based on Persistence of Vision</em>. 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2016). <em>Arduino</em><em>程式設計教學(</em><em>基礎篇):Arduino Programming (Writing Style &amp; Skills)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2014a). <em>Arduino </em><em>光立體魔術方塊開發:The Development of a 4 * 4 Led Cube based on Persistence of Vision</em> (初版 ed.). 台灣、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2014b). <em>Arduino </em><em>拉霸游戏机开发: Using Arduino to Develop a Slot Game Machine</em>: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2014c). <em>Arduino </em><em>拉霸遊戲機開發: Using Arduino to Develop a Slot Game Machine</em>: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015a). <em>Arduino</em><em>手机互动编程设计基础篇:Using Arduino to Develop the Interactive Games with Mobile Phone via the Bluetooth</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015b). <em>Arduino</em><em>手機互動程式設計基礎篇:Using Arduino to Develop the Interactive Games with Mobile Phone via the Bluetooth</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015c). <em>Arduino</em><em>程式教學(</em><em>入門篇):Arduino Programming (Basic Skills &amp; Tricks)</em> (初版 ed.). 台湾、彰化: 渥玛数位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015d). <em>Arduino</em><em>程式教學(</em><em>常用模組篇):Arduino Programming (37 Sensor Modules)</em> (初版 ed.). 台湾、彰化: 渥玛数位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015e). <em>Arduino</em><em>编程教学(</em><em>无线通讯篇):Arduino Programming (Wireless Communication)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 許智誠, &amp; 蔡英德. (2015f). <em>Arduino</em><em>编程教学(</em><em>常用模块篇):Arduino Programming (37 Sensor Modules) </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 class="EndNoteBibliography">曹永忠, 郭晉魁, 吳佳駿, 許智誠, &amp; 蔡英德. (2016a). <em>Arduino</em><em>程序设计教学(</em><em>基础篇):Arduino Programming (Writing Style &amp; Skills)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p class="EndNoteBibliography">曹永忠, 郭晉魁, 吳佳駿, 許智誠, &amp; 蔡英德. (2016b). MAKER系列-程式設計篇:多腳位定義的技巧(上篇). <em>智慧家庭.</em>&nbsp; Retrieved from <a href="http://www.techbang.com/posts/48026-program-review-pin-definition-part-one">http://www.techbang.com/posts/48026-program-review-pin-definition-part-one</a></p>
曹永忠, 郭晉魁, 吳佳駿, 許智誠, &amp; 蔡英德. (2017). MAKER系列-程式設計篇:多腳位定義的技巧(下篇). <em>智慧家庭.</em>
<p>&nbsp;</p>
</blockquote>
<p style="text-align: center;">&nbsp;</p>
<p style="text-align: left;">&nbsp;</p>
<p style="text-align: center;">&nbsp;</p>
<p>&nbsp;</p>
<blockquote>
<p>&nbsp;</p>
<p style="text-align: left;">&nbsp;</p>
</blockquote><a href="http://www.facebook.com/TKbang">加入T客邦Facebook粉絲團</a><img src="http://feeds.feedburner.com/~r/techbang/~4/Ons9uXzPVFU" height="1" width="1" alt=""/>