Arduino 制作RGB二极管的单按钮开关级

Arduino 制作RGB二极管的单按钮开关级,arduino,Arduino,我希望能够在没有打开的情况下启动程序,然后当我按下按钮一次时,它应该切换为红色,如果你再按一次,它应该切换为绿色,再按一次,它应该变为蓝色。毕竟,当你再次按下按钮时,它应该关闭,然后它只是循环 以下是我一直在使用的工具,但它似乎失败了。 当你第一次按下按钮时,它总是变成红色,如果你再按一次,它什么也不做。如果你一直对按钮乱发信息,它会在所有颜色中随机切换,但从不关闭 void循环(){ int toRed=数字读取(按钮); 如果(存储==高){ 切换到(); 延迟(250);//给你时间把手指

我希望能够在没有打开的情况下启动程序,然后当我按下按钮一次时,它应该切换为红色,如果你再按一次,它应该切换为绿色,再按一次,它应该变为蓝色。毕竟,当你再次按下按钮时,它应该关闭,然后它只是循环

以下是我一直在使用的工具,但它似乎失败了。
当你第一次按下按钮时,它总是变成红色,如果你再按一次,它什么也不做。如果你一直对按钮乱发信息,它会在所有颜色中随机切换,但从不关闭

void循环(){
int toRed=数字读取(按钮);
如果(存储==高){
切换到();
延迟(250);//给你时间把手指从按钮上拿开。
int toGreen=数字读取(按钮);
如果(toGreen==高){
开关绿色();
延迟(250);
int toBlue=数字读取(按钮);
如果(toBlue==高){
switchtoBlue();
延迟(250);
int状态=数字读取(按钮);
如果(状态==高){
返回;
}
}
}
}
}

您可以使用状态机设计模式方法执行类似操作:

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
语句中断循环。

问题在于代码中的逻辑有缺陷。它的作用就好像在您按下按钮之前,
digitalRead
功能一直在等待。相反,实际发生的情况是,
循环
函数被反复调用,而您只真正测试最外层的按钮测试,或者如果您发送垃圾邮件,您可能会幸运地让它在每种颜色之间循环

相反,您需要的只是测试按钮,如果按下了按钮,则增加一个变量以指示应该亮起的灯。比如:

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;
    }
  }  

失败似乎不是一个有用的问题描述。它以什么方式特别失败?很抱歉描述不好,希望编辑可以帮助描述它。谢谢太棒了,你忘了做nextState++;在switchToX之后,但这完全有效!不,我把它放在switch语句之外,在它们之后运行。我看到了,但是在每种情况下,如果没有nextState++和nextState=(nextState+1)%4,程序将无法工作;如果您在switch语句的每种情况下或在switch语句之外编写increment语句,则情况是一样的。它将以两种方式跟踪每个案例。谢谢你的解释,你对我的逻辑是正确的,抱歉,我是C新手。虽然你的代码由于某些原因无法立即从红色>绿色>蓝色切换,但它会逐渐淡入其他颜色,如:红色>黄色>绿色>青色>蓝色,然后在关闭时慢慢淡出。哈哈,我只是需要延迟,现在它可以正常工作了。谢谢