Arduino #8 - 否定?彈跳?按鈕特輯Part.1

文章推薦指數: 80 %
投票人數:10人

您好,最近想做一個按鈕計數器功能,但是發現板子根本不受我控制,用了葉難老師提供的簡單判斷按鈕有無被按下的程式發現它根本就是隨機跳0與1,接線已經確認沒有鬆脫,連 ... 電子產品上的開關是怎麼設計的?驚嘆號又有什麼有趣的用途呢? 一系列超有趣的按鈕設計小技巧,獻給實力最堅強的你! 我們在先前的系列,介紹了宣告、麵包板,還有if-else的概念。

今天,我們隆重推出按鈕特輯的第一集!我們要介紹兩個超實用的按鈕小專案,讓你在創作的時候,更加得心應手啦。

  首先,回想一下在Class5的課程中,我們在第7腳接了一顆按鈕,當按鈕按下去的時候,LED就會熄滅。

不過,這個功能好像有點傻,我比較希望按鈕按下去的時候,LED被點亮而不是熄滅。

所以,我們就要對Class5的程式碼動一點手腳啦!請各位先把下方Class5的程式碼複製下來,貼到ArduinoIDE裡面。

小專案:按鈕按下讓LED熄滅   我們提供你三種修改程式的方法:第一種,就是把if的判斷條件反過來,也就是將條件式裡的HIGH改成LOW。

這樣一來,只有當第7腳是低電位,也就是按鈕按下去的時候,LED才會點亮;否則,LED就會是暗的。

當然,你也可以把條件式成立以後,要做的事情「對調」,來得到相同的效果。

這是第二種方法。

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

  好了!為了應付我們的新功能,我們可以把新的敘述,設計成:如果接腳7不是高電位,我就把LED點亮。

這個「不是」的符號,就是!=。

驚嘆號在許多程式語言中,代表「不」、「否定」或是「相反」的意思,如果將!=以數學符號來表示,就是≠這個符號。

因此,把雙等號==修改成!=,同樣可以完成我們要的新功能唷!趕快動手試試看吧! Boolean宣告型別   接著在進入第二個小專案之前,我們要再來談談關於宣告的一些細節。

我們知道intled=7;這行宣告式代表的意思是:我要取綽號的「對象」,是一個整數(integer);綽號叫做led,而LED代表的就是數字7。

那除了整數之外,我還可以宣告別種資料的型態嗎?   答案是可以的!比如說使用char,就可以存放單一個字元;使用double,你就可以儲存包含小數點的數字。

這些不同的資料型態,我們在未來需要使用時再跟各位介紹。

  今天,我們要把重點放在這個叫作boolean的資料型態上面。

boolean最特別的地方,在於它擁有與「數位訊號」一模一樣的特性:不是高電位,就是低電位。

只不過,boolean儲存高、低電位的方法,是以小寫的true與false來表示。

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

像是digitalWrite(13,HIGH);這條指令,我們就可以寫成digitalWrite(13,true);。

  所以,透過boolean來進行數位狀態的儲存,我們就可以同時設定多個接腳的輸出狀態。

這邊讓我來舉個例子!比如說,我在程式的最一開始先宣告booleanstate=true;,然後,將編號7,8,9,10這四隻接腳設定為輸出模式,並且在輸出狀態的地方,通通使用上面宣告的state來代替。

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

反相(NOT)概念   現在我們要給各位一個挑戰題!我一樣要使用booleanstate=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的狀態。

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

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

  我們稱這個機制為「Debounce」,也就是「防彈跳」的意思。

加上了這個機制,我們才正式完成了這個作品!這是一個超重要的小專案,能讓你了解許多電子產品的開關設計概念,你還可以透過delay()時間的修改,找到最適合你的防彈跳時間,請一定要動手試試看唷! ONELASTTHING   雖然使用delay()可以防止LED狀態的彈跳,但它也有許多不可避免的缺點。

比如說,如果delay()時間太短,在你放開按鈕之前,LED的狀態還是會跳來跳去;如果delay()時間太長,你可能得多花點時間等待,才能再一次切換LED的狀態。

  下一堂課程,也就是按鈕特輯Part.2,我們要介紹一個叫做「旗標(Flag)」的技巧,讓你的LED狀態想換就換,按鈕想按多久就按多久。

另外,我們還會使用一個「障礙物感測模組」,來製作簡單的互動遊戲,千萬不要錯過下一集精彩的內容唷!這一集的ArduinoSpeedUp就到這裡囉!我們下次見,掰掰! PreviousPostArduino#7–程式宣告?取個綽號吧!NextPostArduino#9–邏輯?旗標?按鈕特輯Part.2 3Repliesto“Arduino#8–否定?彈跳?按鈕特輯Part.1” 土豆 Reply 77月2020,上午1:51 您好,最近想做一個按鈕計數器功能,但是發現板子根本不受我控制,用了葉難老師提供的簡單判斷按鈕有無被按下的程式發現它根本就是隨機跳0與1,接線已經確認沒有鬆脫,連板子都買第二塊了還是這樣,也搜尋不到其他人遇到類似問題,想請教是不是我連遇兩台機皇,有什麼辦法可以檢測板子的可靠度嗎? LazyTomato Reply 237月2020,上午12:30 您可以嘗試更換杜邦線、按鈕、麵包板等相關配件試試看,有時候杜邦線品質不佳,或是麵包板生鏽嚴重都會造成接觸不良的問題。

土豆 Reply 247月2020,下午9:37 感謝,沒有想到真的是杜邦線的問題 發佈留言取消回覆發佈留言必須填寫的電子郵件地址不會公開。

必填欄位標示為*留言顯示名稱* 電子郵件地址* 個人網站網址 在瀏覽器中儲存顯示名稱、電子郵件地址及個人網站網址,以供下次發佈留言時使用。

SUBSCRIBE訂閱頻道 學習何須大費周章? 揮別枯燥教材,Arduino基礎最佳原創教材帶你實作玩練習!COURSES課程總覽LICENSE內容授權LazyTomatoLab之著作係採用創用CC姓名標示-非商業性-相同方式分享4.0國際授權條款授權,並嚴格禁止任何公司與團體販售本工作室之創作。

HitentertosearchorESCtoclose SearchPage ThebeautyofthisthemeisthatisbuiltwithModules.Everytimeyoucanactiveordis-activeanymodulethatyouwouldnotneedanymore! AwesomeWordPressThemewithlatesttechnologies. MayWeSuggest? #115200baud#Arduino#Arduino宣告#Arduino範例#Arduino雜訊#Arduino介紹#Arduino應用#Arduino教學#Arduino程式#Arduino語法#baudrate#breadboard#C++#case#Coding#else#for#forloop#for循環#for迴圈#IDE#if#ifelse#LED#LED使用#LED教學#Maker#Project#SerialMonitor#switch#switchcase#while#whileloop#while循環#while迴圈#上手#上拉電阻#不同#互動#介紹#保留字#傳送#元件#初學者#創客#升冪#反相#四則運算#基礎知識#字串#字元#宣告#專案#工具#差別#序列埠#序列埠監控視窗#循環#快速#快速上手#應用#懶人包#技巧#指令#指南#按鈕#控制#攝氏#教學#教程#杜邦線#模組#比較#比較運算子#沒有行結尾#流程#無窮迴圈#無限循環#環境建置#硬體#程式#程式宣告#符號#範例#範例程式#紅外線#紅外線模組#練習#總覽#習慣#自造者#華氏#觀念#語法#課程總覽#迴圈#速成#遊戲#選擇性敘述#邏輯#邏輯運算#閃爍#開關#防彈跳#降冪#雜訊#電學#電阻#電阻教學#電阻顏色#霹靂燈#風扇#風扇模組#鮑率#麵包板#麵包板教學#麵包板使用#麵包板教學



請為這篇文章評分?