Try   HackMD

Arduino 教學 8:去除按鈕彈跳的應用

作者:王一哲
日期:2017/5/5

所需元件

  1. 可插入麵包板的按鈕4個
  2. 220Ω電阻3個
  3. 3mm或5mm LED 3個
  4. 麵包板1塊
  5. Arduino Uno開發板1塊
  6. 麵包板連接線數條

用按鈕控制數值

本裝置的要求:

  1. 按下「增加按鈕」使數值 +1,按下「減少按鈕」使數值 -1,按下「重設按鈕」使數值回到預設值0。
  2. 使用 Bounce2.h 去除按鈕彈跳的問題,不能持續按著按鈕。
  3. 使用開發板內建的上拉電阻,使接線方式更加簡單。
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
線路圖

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
實際的裝置照片

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
序列埠監控視窗截圖

程式碼如下:

/* 實驗5-6:去除開關彈跳應用"用按鈕調整數值" * * 使用Bounce2.h * * 每按一下亮、暗變換一次 * * 函式庫:http://playground.arduino.cc/Code/Bounce * * 參考資料:葉難(2014)。Arduino輕鬆入門 * * 日期:Apr. 5, 2017 * * 作者:王一哲 */ #include <Bounce2.h> #define ADDPIN 2 //定義增加按鈕接腳 #define DECPIN 3 //定義減少按鈕接腳 #define RESETPIN 4 //定義重置按鈕接腳 #define DELAYTIME 50 //定義延遲時間 #define BAUDRATE 9600 //定義鮑率 Bounce bouncerAdd = Bounce(ADDPIN, DELAYTIME); Bounce bouncerDec = Bounce(DECPIN, DELAYTIME); Bounce bouncerReset = Bounce(RESETPIN, DELAYTIME); int num = 0; void setup() { Serial.begin(BAUDRATE); pinMode(ADDPIN, INPUT_PULLUP); //定義增加按鈕接腳為輸入並啟用開發板內建的上拉電阻 pinMode(DECPIN, INPUT_PULLUP); //定義減少按鈕接腳為輸入並啟用開發板內建的上拉電阻 pinMode(RESETPIN, INPUT_PULLUP); //定義重設按鈕接腳為輸入並啟用開發板內建的上拉電阻 Serial.println("Start!"); } // 讀取按鍵狀態,增加、減少或重設數值 void loop() { if (bouncerAdd.update() == true && bouncerAdd.read() == LOW) { num++; Serial.print("num = "); Serial.println(num); } if (bouncerDec.update() == true && bouncerDec.read() == LOW) { num--; Serial.print("num = "); Serial.println(num); } if (bouncerReset.update() == true && bouncerReset.read() == LOW) { num = 0; Serial.print("num = "); Serial.println(num); } }

搶答器

本裝置的要求:

  1. 自動判斷「紅燈」、「綠燈」、「黃燈」3個按鈕何者先被按下,點亮對應的LED,之後按下的按鈕不會有作用,直到按下「重設」按鈕時熄滅LED,讓使用者可以再次搶答。
  2. 使用 Bounce2.h 去除按鈕彈跳的問題,不能持續按著按鈕。
  3. 使用開發板內建的上拉電阻,使接線方式更加簡單。
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
線路圖

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
實際的裝置照片

程式碼如下:

/* 實驗5-7:去除開關彈跳應用"搶答器" * * 使用Bounce2.h * * 每按一下亮、暗變換一次 * * 函式庫:http://playground.arduino.cc/Code/Bounce * * 參考資料:葉難(2014)。Arduino輕鬆入門 * * 日期:Mar. 29, 2017 * * 作者:王一哲 */ #include <Bounce2.h> #define GREENLED 2 //定義綠色LED接腳 #define YELLOWLED 3 //定義黃色LED接腳 #define REDLED 4 //定義紅色LED接腳 #define GREENPIN 5 //定義綠色LED按鈕接腳 #define YELLOWPIN 6 //定義黃色LED按鈕接腳 #define REDPIN 7 //定義紅色LED按鈕接腳 #define RESETPIN 8 //定義重設按鈕接腳 #define DELAYTIME 50 //定義延遲時間 #define BAUDRATE 9600 //定義鮑率 Bounce bouncerGreen = Bounce(GREENPIN, DELAYTIME); Bounce bouncerYellow = Bounce(YELLOWPIN, DELAYTIME); Bounce bouncerRed = Bounce(REDPIN, DELAYTIME); Bounce bouncerReset = Bounce(RESETPIN, DELAYTIME); void setup() { Serial.begin(BAUDRATE); pinMode(GREENLED, OUTPUT); //定義綠色LED接腳為輸出 pinMode(YELLOWLED, OUTPUT); //定義黃色LED接腳為輸出 pinMode(REDLED, OUTPUT); //定義紅色LED接腳為輸出 pinMode(GREENPIN, INPUT_PULLUP); //定義綠色LED按鈕接腳為輸入並啟用開發板內建的上拉電阻 pinMode(YELLOWPIN, INPUT_PULLUP); //定義黃色LED按鈕接腳為輸入並啟用開發板內建的上拉電阻 pinMode(REDPIN, INPUT_PULLUP); //定義紅色LED按鈕接腳為輸入並啟用開發板內建的上拉電阻 pinMode(RESETPIN, INPUT_PULLUP); //定義重設按鈕接腳為輸入並啟用開發板內建的上拉電阻 digitalWrite(GREENLED, LOW); digitalWrite(YELLOWLED, LOW); digitalWrite(REDLED, LOW); } // 重設 void resetLED() { digitalWrite(GREENLED, LOW); digitalWrite(YELLOWLED, LOW); digitalWrite(REDLED, LOW); } // 只亮綠燈,直到按下重設按鈕,使用內建上拉電阻,按下時為LOW void greenYes() { // while (!(bouncerReset.update() == true && bouncerReset.read() == LOW)) { while (digitalRead(RESETPIN) == HIGH) { digitalWrite(GREENLED, HIGH); digitalWrite(YELLOWLED, LOW); digitalWrite(REDLED, LOW); } resetLED(); } // 只亮黃燈,直到按下重設按鈕,使用內建上拉電阻,按下時為LOW void yellowYes() { // while (!(bouncerReset.update() == true && bouncerReset.read() == LOW)) { while (digitalRead(RESETPIN) == HIGH) { digitalWrite(GREENLED, LOW); digitalWrite(YELLOWLED, HIGH); digitalWrite(REDLED, LOW); } resetLED(); } // 只亮紅燈,直到按下重設按鈕,使用內建上拉電阻,按下時為LOW void redYes() { // while (!(bouncerReset.update() == true && bouncerReset.read() == LOW)) { while (digitalRead(RESETPIN) == HIGH) { digitalWrite(GREENLED, LOW); digitalWrite(YELLOWLED, LOW); digitalWrite(REDLED, HIGH); } resetLED(); } // 讀取按鍵狀態,決定點亮的LED void loop() { if (bouncerGreen.update() == true && bouncerGreen.read() == LOW) greenYes(); if (bouncerYellow.update() == true && bouncerYellow.read() == LOW) yellowYes(); if (bouncerRed.update() == true && bouncerRed.read() == LOW) redYes(); }


tags:Arduino