電子產品上的開關是怎麼設計的?驚嘆號又有什麼有趣的用途呢? 一系列超有趣的按鈕設計小技巧,獻給實力最堅強的你!

們在先前的系列,介紹了宣告、麵包板,還有 if-else 的概念。今天,我們隆重推出按鈕特輯的第一集!我們要介紹兩個超實用的按鈕小專案,讓你在創作的時候,更加得心應手啦。

  首先,回想一下在 Class 5 的課程中,我們在第 7 腳接了一顆按鈕,當按鈕按下去的時候,LED 就會熄滅。不過,這個功能好像有點傻,我比較希望按鈕按下去的時候,LED 被點亮而不是熄滅。所以,我們就要對 Class 5 的程式碼動一點手腳啦!請各位先把下方 Class 5 的程式碼複製下來,貼到 Arduino IDE 裡面。

小專案:按鈕按下讓 LED 熄滅

  我們提供你三種修改程式的方法:第一種,就是把 if 的判斷條件反過來,也就是將條件式裡的 HIGH 改成 LOW。這樣一來,只有當第 7 腳是低電位,也就是按鈕按下去的時候,LED 才會點亮;否則,LED 就會是暗的。當然,你也可以把條件式成立以後,要做的事情「對調」,來得到相同的效果。這是第二種方法。

  除了上面這兩種方法之外,我們要介紹的第三種方法,只需要你修改一個符號!我們先回想一下雙等號 == 的用途:它可以用來比較左右兩邊的敘述是不是對等的,所以原始程式碼的敘述是:如果接腳 7 高電位,我就把 LED 點亮。

  好了!為了應付我們的新功能,我們可以把新的敘述,設計成:如果接腳 7 不是高電位,我就把 LED 點亮。這個「不是」的符號,就是 !=。驚嘆號在許多程式語言中,代表「不」、「否定」或是「相反」的意思,如果將 != 以數學符號來表示,就是 這個符號。因此,把雙等號 == 修改成 !=,同樣可以完成我們要的新功能唷!趕快動手試試看吧!

Boolean 宣告型別

  接著在進入第二個小專案之前,我們要再來談談關於宣告的一些細節。我們知道 int led = 7; 這行宣告式代表的意思是:我要取綽號的「對象」,是一個整數 (integer);綽號叫做 led,而 LED 代表的就是數字 7。那除了整數之外,我還可以宣告別種資料的型態嗎?

  答案是可以的!比如說使用 char,就可以存放單一個字元;使用 double,你就可以儲存包含小數點的數字。這些不同的資料型態,我們在未來需要使用時再跟各位介紹。

  今天,我們要把重點放在這個叫作 boolean 的資料型態上面。boolean 最特別的地方,在於它擁有與「數位訊號」一模一樣的特性:不是高電位,就是低電位。只不過,boolean 儲存高、低電位的方法,是以小寫的 truefalse 來表示。

  在 Arduino 的程式語言當中,true 與 false 所代表的功能,其實跟 HIGH 與 LOW 是一模一樣的,也就是說,任何使用到 HIGH 與 LOW 的指令,你通通都可以用 true 或是 false 來代替,反之亦然。像是 digitalWrite(13, HIGH); 這條指令,我們就可以寫成 digitalWrite(13, true);。

  所以,透過 boolean 來進行「數位狀態」的儲存,我們就可以同時設定多個接腳的輸出狀態。這邊讓我來舉個例子!比如說,我在程式的最一開始先宣告 boolean state = true;,然後,將編號 7, 8, 9, 10 這四隻接腳設定為輸出模式,並且在輸出狀態的地方,通通使用上面宣告的 state 來代替。

  這樣一來,只要 state 宣告的是 true,所有控制的接腳就會以高電位輸出;相反的,如果宣告 state 為 false,所有控制的接腳就會輸出低電位。

反相(NOT)概念

  現在我們要給各位一個挑戰題!我一樣要使用 boolean state = true; 這行宣告,同時控制這 4 隻接腳的輸出狀態;不過,我想讓所有偶數接腳的狀態與奇數接腳的狀態相反,要怎麼完成這個功能呢?最直覺的做法,就是在偶數接腳的「輸出狀態」加上一個東西,讓它與 state 所宣告的狀態相反。欸?相反!還記得我們剛才提到,驚嘆號 ! 就有代表「否定」或是「相反」的意思嗎?

  要是我們把驚嘆號放在 state 的前面,它就會擁有「相反」的效果,把高電位變成低電位、或是把低電位變成高電位。挑戰題完成!根據這段程式碼,我們還可以推測,如果你將 state 宣告的 true 改成 false,這四隻接腳的狀態也會同時改變。

小專案:按下按鈕切換 LED 亮滅

  說來說去,我們究竟為什麼要一直強調「相反」的概念呢?因為接下來的第二個小專案,我們就要設計一個相當實用的按鈕開關!每次只要我按下按鈕,LED 的亮滅狀態就會改變

  這個程式其實非常簡單,我們先在 setup() 裡宣告第 13 腳為輸出接腳,並且預設為低電位。這樣一來,與第 13 腳相連的這顆 LED 就會先停留在熄滅的狀態。接下來,我們要在第 7 腳連接一顆按鈕,並將按鈕的另一端接地,作為 LED 的開關。所以,在程式當中,我們就得將接腳 7 設定為輸入模式,並啟動上拉電阻功能。

  而在 loop() 當中,我們可以先把「判斷按鈕是否被按下去」的 if-else 敘述放上去:如果按鈕被按下,便會進入 if 的大括號中,執行裡面的工作。以上的前置作業,我們都曾經在同一系列的課程裡解說過了,如果有任何覺得陌生的地方,請一定要回去複習一下唷!

  現在,來到今天課程的重點了!我們先在程式的最一開始,宣告一個 boolean 型態的 state,預設為低電位。稍後我們就要用它來指示 LED 的輸出狀態。我們知道當按鈕按下去的時候,LED 的狀態就必須相反一次,所以,運用剛才介紹的「相反」技巧,我可以用 state = !state; 這行敘述,把原本的 state 進行反相以後,重新儲存回 state,以獲得相反的新狀態。

  把狀態相反以後,我們就可以把 state 當作 LED 的輸出狀態。整個專案的核心功能就完成啦!理論上,只要我按下按鈕,state 的狀態就會相反一次,同時改變 LED 的狀態。

  但不知道您還有沒有印象,我們在 Class 2 曾經提到 Arduino 就像一台瘋狂催著油門的車,如果沒有在適當時機加上 delay() 讓程式煞車的話,當你按下按鈕,就算只有 0.01 秒的時間,程式都會瘋狂地重複執行「改變 LED 狀態」的這些工作,你甚至無法預期當你放開按鈕的時候,LED 會是處在哪種狀態。

  所以在我們完成「改變 LED 狀態」的工作之後,還必須加上一個大約是 200 毫秒的 delay(),讓我們的手指按下按鈕後,有 200 毫秒的時間可以放開按鈕,使 LED 的狀態
只會改變一次

  我們稱這個機制為「Debounce」,也就是「防彈跳」的意思。加上了這個機制,我們才正式完成了這個作品!這是一個超重要的小專案,能讓你了解許多電子產品的開關設計概念,你還可以透過 delay() 時間的修改,找到最適合你的防彈跳時間,請一定要動手試試看唷!

ONE LAST THING

  雖然使用 delay() 可以防止 LED 狀態的彈跳,但它也有許多不可避免的缺點。比如說,如果 delay() 時間太短,在你放開按鈕之前,LED 的狀態還是會跳來跳去;如果 delay() 時間太長,你可能得多花點時間等待,才能再一次切換 LED 的狀態。

  下一堂課程,也就是按鈕特輯 Part. 2,我們要介紹一個叫做「旗標 (Flag)」的技巧,讓你的 LED 狀態想換就換,按鈕想按多久就按多久。另外,我們還會使用一個「障礙物感測模組」,來製作簡單的互動遊戲,千萬不要錯過下一集精彩的內容唷!這一集的 Arduino SpeedUp 就到這裡囉!我們下次見,掰掰!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *