要怎麼讓 Arduino 學會思考,還有辦法做決定勒? 今天就讓判斷性敘述 if-else 來達成我們的心願吧!
上一堂課程,我們完成了「第一個」動手做的小專案。今天我們要介紹 if-else 判斷式,還有更多更多有趣的應用練習唷!
首先,我們來複習工作接腳的兩個特異功能:第一個特異功能,是輸入、輸出模式的設定,使用 pinMode() 指令;第二個特異功能,則是高、低電位的設定,使用 digitalWrite() 這個指令。現在,我們要先給你看第三個特異功能所使用的指令!它長這個樣子:digitalRead(),裡面只放一個工作接腳的編號。
有沒有發現它跟第二個特異功能,也就是設定高、低電位的指令長得很像,只不過是把原本代表「填寫」、「寫入」的 write 換成了 read。既然 digitalWrite() 可以「設定」一個接腳的高低電位,那 digitalRead() 應該就是可以「讀取」接腳電位的指令囉?
沒錯!我們要介紹工作接腳的第三個特異功能,就是每個工作接腳,都可以「讀取」自己的高、低電位狀態。也就是說,我們可以透過這個指令,得知某一個工作接腳是被送入代表高電位的 5 伏特,或是送入代表低電位的 0 伏特。
也因為 digitalRead() 是讀取工作接腳送入的電壓,所以若我想知道工作接腳 7 現在的電位狀態,我就可以先使用 pinMode(7, INPUT); 指令,告訴 Arduino 第 7 腳要輸入東西,然後使用 digitalRead(7); 讀取這隻接腳的電位狀態。
電源接腳介紹
在這個情況下,負責提供高、低電位的角色就非常重要了!還記得在 Class 2 的課程裡 介紹工作接腳的時候,我們刻意把「電源接腳」給忽略嗎?這一組特殊的接腳,提供了我們幾個重要的電壓來源,包含今天會用到的一個 5V(5 伏特),還有兩個以 GND 來表示的 0V(0 伏特)。你可以想像這一排電源接腳,它們唯一的功能就是提供自己所標示的電壓,沒有辦法作為輸入功能的接腳,也不能用指令來控制。
所以,如果我把 5V 的電壓連接到剛才示範的接腳 7 上面,我們就能透過 digitalRead(7); 這個指令,得知第 7 腳處於高電位的狀態;相反地,如果把 GND,也就是 0V 連接到第 7 腳,digitalRead(7); 就會回傳低電位的狀態。
if else 判斷敘述
我們今天的目標,就是要透過第 7 腳高、低電位的改變,來設計一個可以控制 LED 亮或滅的電燈開關。它的運作方法是:工作接腳 7 如果被送入高電位,由第 13 腳控制的 LED 就會點亮;相反的,如果第 7 腳被送入低電位,就把 LED 熄滅。
可是,Arduino 要怎麼知道,如果發生了「某件事」,就要做「某個動作」呢?這時候,我們就需要一個叫做 if-else 的「選擇性敘述」,來完成這個任務啦!選擇性敘述最厲害的地方,就是可以讓 Arduino 有做決定的能力,根據不一樣的條件,執行不同的工作。
if-else 的完整結構如上圖,分別由 if、很多很多個 else if ,還有 else 關鍵字所組成。除了最後一個 else 之外,其餘每個關鍵字的後面,都接了一組括號。因為程式是由上往下執行的,所以如果第一個括號裡的敘述是「成立的」,Arduino 就會自動執行它附屬大括號裡面的程式,然後跳過其他 if-else 結構裡的東西。
但如果第一個括號裡的敘述「不成立」,那 Arduino 就會跳過它附屬的大括號,從第二個小括號裡的內容開始比較,一直到其中一個小括號又符合了「成立」的條件,才執行它附屬大括號裡的內容,同時跳過後面的 if-else 結構。如果今天真的很不巧,所有小括號中的敘述都無法成立,程式就只好走到 else 的大括號當中,執行裡面的程式。舉個例子:
假設今天番茄參加考試,考了 87 分。這樣的話,第一組小括號的條件就不成立了,因為這個分數並沒有高於或等於 90 分,所以程式會跳過它,繼續比較 else if 裡的條件。這時候,程式發現 87 分符合第二個小括號的條件,所以就進去執行大括號的內容,也就是獲得 B 這個等級,然後忽略剩下的 if-else 程式碼。
那如果今天番茄考了 15 分,程式會怎麼運作呢?
首先,第一個條件,不符合,跳過;第二個條件,也不符合,跳過;第三?不符合;第四?不符合。恩…沒辦法,只能做 else 裡面的事情,那就是獲得 X 這個等級囉!
小專案:用電位控制 LED 亮滅
值得注意的是,當有很多條件需要判斷時,你可以不斷擴充 else if 的數量;相反的,如果只有「一個」條件需要判斷,你也可以只留下 if 跟 else,而不需要 else if 。比如像這次的小專案,就只有第 7 腳到底是高電位還是低電位的判斷條件,這種二分法的結構,只需要 if 跟 else 就可以處理了。
現在讓我們把小專案的功能,放到 if-else 的架構當中!看到下面這段程式可以知道,當工作接腳 7 被送入高電位的時候,第一個敘述成立,我們就能把 LED 點亮;相反的,如果第 7 腳是低電位,程式就會略過第一組大括號,直接去執行 else 大括號裡的內容,把 LED 熄滅。
現在,讓我們把中文的敘述,換成對應的指令。這段可以用第 7 腳高、低電位控制 LED 開或關的程式碼,就這樣完成了。欸?判斷條件中竟然一次出現兩個等號,這是什麼意思呢?
其實這個雙等號,我們稱它叫做「比較運算子」,通常是用來比較兩邊的敘述是不是對等的。比如剛才這行指令,他的目的就是在比較「digitalRead(7)」這個指令回傳的結果,跟代表高電位的「HIGH」是不是一樣的。
如果第 7 腳是高電位,那這個敘述的比較結果,就是「成立的」;反之,就是「不成立的」。這是初學者在實作時很容易忽略的小細節,一定要特別注意有沒有少打一個等號喔!
完成小專案
最後,讓我們把小專案的程式完成!在 setup() 區塊中,為了搭配 digitalRead() 指令,我們要先設定第 7 腳為輸入模式;而操控 LED 的 13 腳則為輸出模式。然後,我們要讓 Arduino 不停地判斷第 7 腳的電位狀態,這樣才能隨時根據電位的改變,控制 LED 的亮或滅。所以在 loop() 當中,放入剛才寫好的 if-else 程式碼,今天的專案就完成囉!
燒錄程式以後,你就可以用一條「公對公」的杜邦線,也就是兩端都是針腳的杜邦線,一邊連接到工作接腳 7,另一邊則連接到寫著 5V 的電源接腳上面,LED 就亮了;再試試看把 5V 那端,換到 GND 上面,LED 是不是就熄滅了呢?趕快來動手試試看吧!這個專案完成以後,有很多朋友告訴我:奇怪,當我把電源那端的杜邦線懸空的時候,LED 會自己亂閃耶?別擔心,這是正常的現象!我們在下一次的練習 ,就會告訴各位 LED 亂閃的原因,還會教大家一個小技巧,可以輕鬆解決這個問題唷!還有,總覺得用杜邦線接來接去很麻煩呢!所以,同樣在下一堂課程,我們要為各位介紹電子實驗的神器:「麵包板」,然後直接用按鈕來當作開關,超清爽的對吧?
趕快訂閱 LazyTomato Lab,隨時追蹤最新的精彩課程!這一集的 Arduino SpeedUp 課程在這裡告一個段落!我們下次見,掰掰!