按一个按钮切换RGB二极管的级

时间:2017-11-08 17:27:32

标签: arduino

我希望能够在没有任何东西的情况下启动该程序,然后当我按下按钮一次时,它应该切换为红色,然后如果你再次按下它应该切换到绿色,然后再次按下它应该去蓝色。毕竟,当你再次按下按钮时它应该关闭,然后它就会循环。

这是我一直在使用的东西,但它似乎失败了 当您第一次按下按钮时它总是变为红色,如果再次按下它,它什么都不做。如果你继续发送垃圾邮件按钮,它会随机切换所有颜色,但永远不会关闭。

void loop() {
  int toRed = digitalRead(button);
  if (toRed == HIGH){
    switchtoRed();
    delay(250); // Give you time to take your finger off the button.
    int toGreen = digitalRead(button);
    if (toGreen == HIGH) {
      switchtoGreen();
      delay(250);
      int toBlue = digitalRead(button);
      if (toBlue == HIGH) {
        switchtoBlue();
        delay(250);
        int state = digitalRead(button);
        if (state == HIGH) {
          return;
        }
      }
    }
  }
}

2 个答案:

答案 0 :(得分:1)

问题是代码中的逻辑是有缺陷的。在您按下按钮之前,digitalRead功能正在等待。相反,实际发生的是loop函数被重复调用,你只是真正测试最外面的按钮测试,或者如果你垃圾按钮,你可能很幸运,让它循环通过每个颜色。

相反,您想要的只是测试按钮,如果已经按下,则增加一个变量以指示应该打开什么灯。类似的东西:

int pressed = 0;
int state = 0;

void loop()
  {
  if(digitalRead(button)==HIGH)     
    {
    if(pressed==0)
      {
      pressed=1; 
      switch(state)
        {
      case 0:
        switchToRed();
        state++;
      break; 
      case 1:
        switchToGreen();
        state++;
      break; 
      case 2:
        switchToBlue();
        state++;
      break; 
      case 3:
        switchToOff();
        state=0;
      break;
        }
      }
    }
  else
    {
    pressed=0;
    }
  }  

答案 1 :(得分:0)

使用状态机设计模式方法可以做到这样的事情:

int nextState = 0;

void loop(){
    while(1){
       if(digitalRead(button) == HIGH){
          switch(nextState){
              case 0: // Red Button
                  switchToRed();
              break;
              case 1: // Green Button
                  switchToGreen();
              break;
              case 2: // Blue Button
                  switchToBlue();
              break; 
              case 3: // Switch off
                  switchOff();
              break;
           }
           nextState = (nextState + 1) % 4;                         
           delay(250);
       }
       // or you can delay here
    }
}

如果你不想在案例3之后继续;你可以在案例3中使用return语句来打破循环。