# Arduino 教學 8:去除按鈕彈跳的應用
> 作者:王一哲
> 日期:2017/5/5
## 所需元件
1. 可插入麵包板的按鈕4個
2. 220Ω電阻3個
3. 3mm或5mm LED 3個
4. 麵包板1塊
5. Arduino Uno開發板1塊
6. 麵包板連接線數條
</br>
## 用按鈕控制數值
本裝置的要求:
1. 按下「增加按鈕」使數值 +1,按下「減少按鈕」使數值 -1,按下「重設按鈕」使數值回到預設值0。
2. 使用 Bounce2.h 去除按鈕彈跳的問題,不能持續按著按鈕。
3. 使用開發板內建的上拉電阻,使接線方式更加簡單。
<img height="100%" width="100%" src="https://i.imgur.com/JnEDi5L.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">線路圖</div>
</br>
<img height="100%" width="100%" src="https://i.imgur.com/9KznecI.jpg" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">實際的裝置照片</div>
</br>
<img height="100%" width="100%" src="https://i.imgur.com/z3skmvx.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">序列埠監控視窗截圖</div>
</br>
程式碼如下:
```c=
/* 實驗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);
}
}
```
</br>
## 搶答器
本裝置的要求:
1. 自動判斷「紅燈」、「綠燈」、「黃燈」3個按鈕何者先被按下,點亮對應的LED,之後按下的按鈕不會有作用,直到按下「重設」按鈕時熄滅LED,讓使用者可以再次搶答。
2. 使用 Bounce2.h 去除按鈕彈跳的問題,不能持續按著按鈕。
3. 使用開發板內建的上拉電阻,使接線方式更加簡單。
<img height="100%" width="100%" src="https://i.imgur.com/X1MQWB0.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">線路圖</div>
</br>
<img height="100%" width="100%" src="https://i.imgur.com/Jn3Cp7y.jpg" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">實際的裝置照片</div>
</br>
程式碼如下:
```c=
/* 實驗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();
}
```
</br>
---
###### tags:`Arduino`