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:开发板信息

 

 

 

posted @ 2019-11-05 17:47  venkim  阅读(5291)  评论(0编辑  收藏  举报