繁体   English   中英

如何用按钮更换 LED?

[英]How to Change LED with Button?

我想只用一个按钮来更换 LED。 第一次单击按钮 - 红色 LED 亮起,第二次 - 红色熄灭,绿色亮起,第三次 - 绿色熄灭,黄色亮起,第四次 - 再次以红色开始...

首先,我尝试一键打开红色,然后关闭...

int red = 8;
int button = 13;
int buttonstate = 0;
bool redOn = false;


void setup(){
  pinMode(red,OUTPUT);
  pinMode(button,INPUT);
}

void loop(){
  
 buttonstate = digitalRead(button);
    

if (buttonstate == 1){
  if (redOn == false){
    digitalWrite(red,HIGH); 
    redOn = true;
        }
  else{
    digitalWrite(red,LOW);
    redOn = false;
    }
}
}

这样可行。 然后我尝试添加另外两个 LED ..

int red = 8;
int yellow = 3;
int green = 6;
int button = 13;
int buttonstate = 0;
bool redOn = false;
bool yellowOn = false;
bool greenOn = false;


void setup(){
  pinMode(red,OUTPUT);
  pinMode(yellow,OUTPUT);
  pinMode(green,OUTPUT);
  pinMode(button,INPUT);
}

void loop(){
  
 buttonstate = digitalRead(button);
    

if (buttonstate == 1){
  if (redOn == false){
    digitalWrite(red,HIGH); 
    redOn = true;
        }
  else if (redOn == true && greenOn == false && yellowOn == false) {
    digitalWrite(red,LOW);
    redOn = false;
    digitalWrite(green,HIGH);
    greenOn = true;
    }
  else if (redOn == false && greenOn == true && yellowOn == false) {
    digitalWrite(green,LOW);
    greenOn = false;
    digitalWrite(yellow,HIGH);
    yellowOn = true;
    }
   else if (redOn == false && greenOn == false && yellowOn == true) {
    digitalWrite(yellow,LOW);
    yellowOn = false;
    }
  
  else{
      redOn = false;
      greenOn = false;
      yellowOn = false;
}
}
}

那是行不通的。 有人知道如何实现这一点吗?

您应该首先检测按钮是否在遇到灯开关之前发生了变化

int buttonState = 0;
void loop()
{
    int bs = digitalRead(button);
    if(bs != buttonState)
    {
        // the button state changed!
        buttonState = bs;

        if(bs == 1)
        {
            // ... AND has been pressed
            // (if you want to switch on releasing, compare against 0)
            // -> switch now your LED outputs appropriately
        }
    }
}

不过,从您的代码中,我不能完全确定所需的 LED 照明模式应该是什么样子,所以跳过这部分(直到您提供准确的描述)。

有两点需要考虑:

首先,Arduino 的处理器比人类快得多,这意味着即使您短时间按下按钮,您的代码也会以同样多的速度获得它。 您可以通过在 loop() function 的末尾添加一个小的延迟来解决这个问题,例如:

delay(1000)

或者通过设置一个包含之前按钮的 state 的变量,并根据 state 的变化(从 0 到 1)进行操作

第二件事是你开始先单独检查红灯:

if (redOn == false){
    digitalWrite(red,HIGH); 
    redOn = true;
        }

当您在此处将 redOn 设置为 false 时,此 if 语句将在绿灯亮起时有效

else if (redOn == true && greenOn == false && yellowOn == false) {
    digitalWrite(red,LOW);
    **redOn = false;**
    digitalWrite(green,HIGH);
    greenOn = true;
    }

因此,在您关闭红灯并打开绿灯并按下按钮后,红灯将亮起,绿灯将保持亮起,因为您将执行第一个 if 语句,您对绿灯和黄灯:

if (redOn == false){
    digitalWrite(red,HIGH); 
    redOn = true;
        }

此外,您永远无法到达黄灯亮起的 state。 因此,您可以通过替换将第一个 if 语句修改为像其他 if 语句一样更具体

if (redOn == false){
    digitalWrite(red,HIGH); 
    redOn = true;
        }

if (!greenOn && !yellowOn){
    digitalWrite(red,HIGH); 
    redOn = true;
        }

删除最后一个 else,因为您不希望它们再次全部关闭

else{
      redOn = false;
      greenOn = false;
      yellowOn = false;
}

旁注:在 if 语句中使用 boolean 变量时,您不必使用“==”比较器,只需使用 boolean 变量

利用:

if(redOn)

代替:

if(redOn == true)

并使用:

if(!redOn)

代替:

if(redOn == false)

希望我的回答对你有帮助:)

此致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM