bt-5-1

按鍵是最常見的Arduino輸入裝置,可以提供最簡單的按下與放開兩種選擇,經由程式的編寫就能派上用場了。

Arduino實驗套件中最常見的按鈕,就是這款按鍵和鍵帽分開的這款,規格是12x12x7.3mm,4支腳剛好可以插進麵包板中,使用起來算是蠻方便的。

bt-8

按鍵雖然間單,但是運作上還是有些地方要注意的哦!

bt-1

圖中大家會發現,A、B是在同一邊,C、D在另一側。請注意!我們如果要得到按下、放開的效果,請選用A、B或C、D來接線,因為如果你選用了A、D或是B、C,就得不到按鍵的效果了,因為它們永遠都是接通的,也就是說,你就算不按按鍵,它還是處於按下的情況,這點大家必須注意哦!

一般習慣上,都會把按鍵插在麵包板中間,跨過分隔上下的溝槽。

bt-9

我們先幫按鍵接好線路,以不寫程式的情況,讓按鍵按下後,LED就亮,放開LED也就暗了。

bt-4

這個線路圖應該不難理解,按鍵的A腳,我們接到Uno上的GND,B腳接到LED的負極,而LED的正極接到Uno上的5V,這樣型成一個迴路。當按鍵按下時,整個迴路是通的,LED也就亮了,當按鍵放開,隔開了迴路,LED也就滅了。

接著我們試著用程式去偵測按鍵是否按下,再控制LED燈。線路自然也要改變。

bt-3-1

我們透過PIN 7去讀取按鍵的狀態,而用PIN 3來控制LED。但是大家發現怎麼多了一個電阻,從5V接到了按鍵的A腳?這是因為Pin腳如果是在空接時,也就是說沒有連接到任何電路的情況,這時如果用digitalRead()去讀取這個Pin,極可能會受到環境雜訊的影響,有時讀取到HIGH、有時卻讀取到了LOW,這就是所謂的Floating狀態。

為了解決這個問題,我們會加一個電阻,如果是從VCC端過來,稱為Pull-Up(上拉電阻),如果是從GND接過來,就叫Pull-Down(下拉電阻)。兩種方式都可以的,只是一般建議用Pull-Up(上拉電阻),這裡我們也是用Pull-Up(上拉電阻)來測試。

至於這個電阻要用多大的呢?一般建議是10K~20K歐姆都可以,這裡我們用的是10K的。

程式我們這樣寫:

const int BUTTON_PIN = 7;  // 按鍵的接腳
const int LED_PIN =  3;   // LED燈的接腳

int buttonState = 0;   // 按鈕的狀態

void setup() {
  pinMode(LED_PIN, OUTPUT);   //設定LED的PIN腳為輸出
  pinMode(BUTTON_PIN, INPUT); //設定按鈕的接腳為輸入,因為我們要讀取它的狀態
}

void loop() {
  buttonState = digitalRead(BUTTON_PIN);  //讀取按鍵的狀態

  if(buttonState == LOW){          //如果按鍵按了
    digitalWrite(LED_PIN, HIGH);   //LED就亮了 
  }else{                           //如果按鍵是未按下
    digitalWrite(LED_PIN, LOW);    //LED就不亮
  }
}

關於LED的部份,之前就有專章介紹過,我們就不再說明;而按鍵我們是透過Pin 7來讀取它的狀態。讀取的方式就是用digitalRead()這個函式。

但請注意一點,因為我們是選擇用Pull-Up(上拉電阻),所以按鍵的狀態在未按下時,會讀取到HIGH,按下了才會讀到LOW,這點一定要注意的!

只要你的線有接對,可以試試LED是不是可以被我們控制了呢?

bt-5

其實呢?這個上拉電阻是可以不用接的,哈,你是不是想打傑森了呢?不是啦,因為上面的作法是基本的,還是必須講的哦!但Arduino Uno板上面每一個Pin腳都有內建了20K歐姆的上拉電阻,所以只要程式改一下,我們可以直接利用Uno的這個電阻,我們就不用自己加電阻囉!

bt-2

const int BUTTON_PIN = 7;  // 按鍵的接腳
const int LED_PIN =  3;   // LED燈的接腳

int buttonState = 0;   // 按鈕的狀態

void setup() {
  pinMode(LED_PIN, OUTPUT);   //設定LED的PIN腳為輸出
  pinMode(BUTTON_PIN, INPUT_PULLUP); //設定按鈕的接腳為輸入,因為我們要讀取它的狀態
}

void loop() {
  buttonState = digitalRead(BUTTON_PIN);  //讀取按鍵的狀態

  if(buttonState == LOW){          //如果按鍵按了
    digitalWrite(LED_PIN, HIGH);   //LED就亮了 
  }else{                           //如果按鍵是未按下
    digitalWrite(LED_PIN, LOW);    //LED就不亮
  }
}

其實你會發現,我們只改了一行:

pinMode(BUTTON_PIN, INPUT_PULLUP);

我們把原本的INPUT,改成了INPUT_PULLUP,這就是告訴Uno板,我們這個Pin腳不只是要做為輸入,而且還要用到內建的上拉電阻了!

但是要注意一點,Pin 13例外哦,它已經被接了一顆LED和電阻,所以不適用INPUT_PULLUP!

bt-6

這樣大家是不是完全了解按鍵的運用了呢^^