2017年12月4日 星期一

去除按鈕彈跳的應用

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



所需元件



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


用按鈕控制數值



本裝置的要求:
  1. 按下「增加按鈕」使數值 +1,按下「減少按鈕」使數值 -1,按下「重設按鈕」使數值回到預設值0。
  2. 使用 Bounce2.h 去除按鈕彈跳的問題,不能持續按著按鈕。
  3. 使用開發板內建的上拉電阻,使接線方式更加簡單。
線路圖

實際的裝置照片

序列埠監控視窗截圖


程式碼如下:
#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. 使用開發板內建的上拉電阻,使接線方式更加簡單。

線路圖

實際的裝置照片


程式碼如下:
/* 實驗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();
}



HackMD 版本連結:https://hackmd.io/@yizhewang/ryPEJ6a4E

沒有留言:

張貼留言