Arduino學習筆記④ 經典按鍵實驗

1.前言

    咱們講了數字IO口介紹以及作了流水燈演示(主要用到IO口的輸出功能),這節課咱們講解一下IO口的輸入功能,說到輸入功能,最經典的例子莫過於按鍵實驗。廢話少說,趕忙上車。git

2.實驗材料

  • 按鍵模塊

image

  • LED模塊(這裏屬於共陽極LED模塊)

image

  • Mega2560板子
    注意:這課實驗是基於第三課實驗材料進行的。

3.實驗內容

3.1 按鍵實驗1

實驗內容:
當按住按鍵時點亮LED,當放開按鍵後熄滅LED;算法

實驗代碼:oop

/**
* @Desc 按鍵燈(當按住按鍵時點亮LED,當放開按鍵後熄滅LED)
* @author 單片機菜鳥
* @Date  2016/12/3
* 注意:LED的一端接到5V,另一端接到輸出引腳,低電平亮
*       按鍵是高電平有效
*/
 
#define LED  2
#define KEY  10
 
int buttonState = HIGH;//記錄當前按鍵狀態
 
void setup() {
  //配置2號引腳做爲輸出引腳
   pinMode(LED,OUTPUT);
   digitalWrite(LED,HIGH);//滅掉LED
   //配置10號引腳爲輸入引腳 若是是本身鏈接普通按鍵 pinMode(KEY,INPUT_PULLUP),弱上拉
   pinMode(KEY,INPUT);
}
 
void loop() {
 
  buttonState = digitalRead(KEY);//讀取當前按鍵狀態
  if(buttonState == HIGH){
    //按鍵按下
    digitalWrite(LED,LOW);//點亮LED
  }else{
    //按鍵放開
    digitalWrite(LED,HIGH);//熄滅LED
  }
  
}

3.2 按鍵實驗2

實驗內容:
當點擊一次按鍵時點亮LED,當再次點擊一次按鍵時熄滅LED(就跟家裏燈同樣)學習

實驗代碼:code

/**
* @Desc 按鍵燈(當點擊一次按鍵時點亮LED,當再次點擊一次按鍵時熄滅LED)
* @author 單片機菜鳥
* @Date  2016/12/3
* 注意:LED的一端接到5V,另一端接到輸出引腳,低電平亮
*       按鍵是高電平有效
*/
 
#define LED  2
#define KEY  10
 
int buttonState = HIGH;//記錄當前按鍵狀態
int flag = HIGH;//默認當前滅燈
 
void setup() {
  //配置2號引腳做爲輸出引腳
   pinMode(LED,OUTPUT);
   digitalWrite(LED,flag);//滅掉LED
   //配置10號引腳爲輸入引腳 若是是本身鏈接普通按鍵 pinMode(KEY,INPUT_PULLUP),弱上拉
   pinMode(KEY,INPUT);
}
 
void loop() {
  buttonState = digitalRead(KEY);//讀取當前按鍵狀態
  if(buttonState == HIGH){
    //按鍵按下
    delay(40);//作一個防抖動延時(確保真是按下了按鍵而不是錯誤)
    buttonState = digitalRead(KEY);//再一次讀取按鍵狀態
    if(buttonState==HIGH){
      //再次確認是否真的按下了按鍵,是的話就置反當前燈的狀態
      flag = !flag;
      digitalWrite(LED,flag);
    }
  }
}

個人按鍵模塊的實驗結果是:偶爾能夠,偶爾又不能夠,證實只是簡單防抖動確定是不行的。後面通過查資料用如下防抖動方法:blog

/**
* @Desc 按鍵燈(當點擊一次按鍵時點亮LED,當再次點擊一次按鍵時熄滅LED)
* @author 單片機菜鳥
* @Date  2016/12/3
* 注意:LED的一端接到5V,另一端接到輸出引腳,低電平亮
*       按鍵是高電平有效
*/
 
#define LED  2
#define KEY  10
 
int flag = HIGH;//默認當前滅燈
 
// 定義記錄按鍵當前狀態的變量
int state_btn;
// 定義記錄按鍵最近一次狀態變化的變量,並初始化狀態爲LOW。
int lastButtonState = LOW;
// 定義記錄最近一次抖動的時間變量,並初始化時間爲0毫秒。
long lastDebounceTime = 0;
// 定義延遲抖動的時間變量
long debouncdDelay = 60;
 
void setup() {
  //配置2號引腳做爲輸出引腳
   pinMode(LED,OUTPUT);
   digitalWrite(LED,flag);//滅掉LED
   //配置10號引腳爲輸入引腳 若是是本身鏈接普通按鍵 pinMode(KEY,INPUT_PULLUP),弱上拉
   pinMode(KEY,INPUT);
}
 
void loop() {
  int buttonState = digitalRead(KEY);//讀取當前按鍵狀態
 
  if(buttonState != lastButtonState){
     //若是按鍵發生了變化  則從新設置最近一次抖動的時間
     //方法millis()能夠獲取當前時間,單位統一爲毫秒。
     lastDebounceTime = millis();  
  }
  
  // 判斷按鍵按下狀態時間間隔是否大於延遲抖動的時間長度。
  if(millis()-lastDebounceTime>debouncdDelay){
    // 判斷當前的按鍵狀態是否和以前有所變化
    if(buttonState != state_btn){
       // 若是發生了變化,
       // 則更新按鍵狀態變量。
       state_btn = buttonState;
       if(state_btn == HIGH){
        //再次確認是否真的按下了按鍵,是的話就置反當前燈的狀態
         flag = !flag;
         digitalWrite(LED,flag);
       }
    }
  }
  // 更新按鍵最近一次狀態變化的變量
     lastButtonState = buttonState;
}

    這裏的防抖算法的思路是:
    須要記錄一個最近狀態 lastButtonState (每讀一次引腳狀態就記錄一次),而後在抖動間隔內(60ms)判斷最新狀態,只要間隔內狀態改變,就不斷更新抖動時間的起始點(也就是 lastDebounceTime = millis(); ),直到防抖動知足 millis()-lastDebounceTime>debouncdDelay。以後再判斷一下當前狀態和以前狀態是否改變 buttonState != state_btn (以防用戶按過久了)。it

4.總結

    這節課咱們主要學習數字IO口的輸入功能,總體上還算簡單,主要是注意按鍵防抖動。ast

相關文章
相關標籤/搜索