Arduino控制LED燈(開關控制)


問題:當使用"digitalRead(BUT) == 1"控制LED燈時會出現"digitalWrite(LED, ledState);"的值出現跳動。

原因:因為loop會無限循環,當按下按鈕時會一直輸出1,當松開按鈕時會一直輸出0,所以判斷的時候if(digitalRead(BUT) == 1)判斷條件不穩定(這里不穩定的意思是if(digitalRead(BUT) == 1)會重復執行,造成ledState = !ledState的值一直改變)

#define BUT D2  //定義按鈕的針腳
#define LED D9  //定義LED燈的針腳
boolean ledState = LOW;  // 初始化LED燈的值

void setup() {
  pinMode(BUT, INPUT);  //設置針腳為輸入
  pinMode(LED, OUTPUT);  //設置針腳為輸出
  Serial.begin(115200);  //串口初始化
}

void loop() {
  if(digitalRead(BUT) == 1){
    //Serial.println(digitalRead(BUT)); //值為1
    ledState = !ledState;
    Serial.println(ledState); //ledState值不穩定
    digitalWrite(LED, ledState);
  }else{
    //Serial.println(digitalRead(BUT));//值為0
  }
}

解決1:中間值的方式

原理:使用中間值的方式穩定判斷條件,在if(b1 != butState)的執行體中當按下按鈕時control的值會加1,松開按鈕又會加1,所以當control=2的執行if(control == 2)判斷條件穩定(穩定的意思是if(control == 2)只會執行一次,這樣就會解決ledState = !ledState值不穩定的情況。)

#define BUT D2
#define LED D9
boolean butState = LOW;
boolean ledState = LOW;
byte control = 0;

void setup() {
  pinMode(BUT, INPUT);
  pinMode(LED, OUTPUT);
  Serial.begin(115200);  //串口初始化
}

void loop() {
  // 死循環--未按下按鈕值0 按下按鈕值1
  boolean b1 = digitalRead(BUT);
  if(b1 != butState){
    delay(20);//緩沖震動
    // 只執行一次--未按下按鈕值0 按下按鈕值1
    boolean b2 = digitalRead(BUT);
    if(b2 == b1) {
      // 只執行一次--未按下按鈕值0 按下按鈕值1
      butState = b1;
      // 按一次按鈕執行兩次
      control++;
    }
  }

  if(control == 2){
    control = 0;
    // 默認值0 取反值1
    ledState = !ledState;
    Serial.println(ledState); //ledState值穩定
    digitalWrite(LED, ledState);
  }
}

ps:開發板信息

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM