Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 未正确检测到按钮信号_Arduino_Arduino Uno - Fatal编程技术网

Arduino 未正确检测到按钮信号

Arduino 未正确检测到按钮信号,arduino,arduino-uno,Arduino,Arduino Uno,我有6个不同的led连接到引脚2到7,还有一个按钮连接到引脚8。我有两个功能,一个以1秒的间隔打开和关闭led,另一个以彩色模式打开和关闭led。当我按下按钮时,我试图在这两种模式之间切换。但这不是我想要的方式。我必须按住按钮,直到所有led熄灭,才能切换模式。我希望我的led在按下按钮后立即切换模式 我曾尝试在引脚8(按钮)高的时候切换模式,但我得到了相同的结果,我必须按住才能使其工作 这是我的密码: //BUTTON STATE int state = 0; bool currentStat

我有6个不同的led连接到引脚2到7,还有一个按钮连接到引脚8。我有两个功能,一个以1秒的间隔打开和关闭led,另一个以彩色模式打开和关闭led。当我按下按钮时,我试图在这两种模式之间切换。但这不是我想要的方式。我必须按住按钮,直到所有led熄灭,才能切换模式。我希望我的led在按下按钮后立即切换模式

我曾尝试在引脚8(按钮)高的时候切换模式,但我得到了相同的结果,我必须按住才能使其工作

这是我的密码:

//BUTTON STATE
int state = 0;
bool currentState = LOW;
bool lastState = LOW;

void setup() {
  // put your setup code here, to run once:
  for(int pin = 2;pin <8; pin++){//DECLARE PIN FOR OUTPUT FROM PIN 2 TO 7
    pinMode(pin,OUTPUT);
    pinMode(8,INPUT);
  }
}

bool buttonState(bool last){
  bool current = digitalRead(8);
  if(last != current){
    current = digitalRead(8);
  }
  return current;  
}

void led_dance(int mode){
 if(mode == 0 && digitalRead(8) != HIGH){
   mode_sequeal();
 }
 else{       
  mode_color(); 
 }
}

void mode_sequeal(){//TURN ON LED IN SERIES AND TURN IT OFF IN SERIES  
  for(int led = 2;led <8; led++){//FOR TURNING LED ON
    digitalWrite(led, HIGH);//TURNS LED ON    
    delay(1000);//DELAY FOR 1 SECONDS  
  }
  for(int led = 2;led <8; led++){//FOR TURNING LED OFF
    digitalWrite(led, LOW);
    delay(1000);//DELAY FOR 1 SECONDS
  }
}

void mode_color(){  
    digitalWrite(2,HIGH);
    digitalWrite(5,HIGH);
    delay(500);
    digitalWrite(2,LOW);
    digitalWrite(5,LOW);
    digitalWrite(3,HIGH);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(3,LOW);
    digitalWrite(7,LOW);
    digitalWrite(4,HIGH);
    digitalWrite(6,HIGH);
    delay(500);
    digitalWrite(4,LOW);
    digitalWrite(6,LOW);  
}

void loop() {
  // put your main code here, to run repeatedly:  
 currentState = buttonState(lastState);
 if(lastState == LOW && currentState == HIGH){
   state++;   
 }
 lastState = currentState;
 if(state == 2){
    state = 0; 
 }
 led_dance(state);
}  
//按钮状态
int state=0;
布尔电流状态=低;
bool lastState=低;
无效设置(){
//将安装代码放在此处,以便运行一次:

对于(int pin=2;pin,您的问题是只有在
led_dance
完成后才能读取按钮

你有两个选择:

选项一:您可以使代码更加混乱,并在每次延迟前后添加读取状态按钮,如下所示:

   int buttonChanged()
   {
       // Put logic here to check button state and save it according to your wishes, for example:
       currentState = buttonState(lastState);
       if(lastState == LOW && currentState == HIGH)
       {
           state++;   
       }
       int stateChanged = lastState != currentState;
       lastState = currentState;
       if(state == 2)
       {
           state = 0; 
       }

       return stateChanged;
   }

   void mode_sequeal()
   {
       //TURN ON LED IN SERIES AND TURN IT OFF IN SERIES  
       for(int led = 2; led <8; led++)
       {
           //FOR TURNING LED ON
           digitalWrite(led, HIGH);//TURNS LED ON    
           if (buttonChanged())
           {
               return;
           }
           delay(1000);//DELAY FOR 1 SECONDS    
           if (buttonChanged())
           {
               return;
           }
       }

       for(int led = 2;led < 8; led++)
       {
           //FOR TURNING LED OFF  
           if (buttonChanged())
           {
               return;
           }
           digitalWrite(led, LOW);
           delay(1000);//DELAY FOR 1 SECONDS  
           if (buttonChanged())
           {
               return;
           }
       }
 }
int按钮更改()
{
//将逻辑放在此处,检查按钮状态并根据您的意愿保存,例如:
currentState=按钮状态(lastState);
if(lastState==LOW&¤tState==HIGH)
{
状态++;
}
int stateChanged=lastState!=currentState;
lastState=当前状态;
如果(状态==2)
{
状态=0;
}
退货状态发生变化;
}
无效模式_sequeal()
{
//串联打开LED,串联关闭LED

对于(int led=2;led首先,根据问题按钮连接到引脚2,根据代码-连接到引脚8。是哪一个?第二,您只需初始化引脚8一次-无需在每次循环迭代中初始化它。对不起,它的引脚8连接在哪里。现在我更正了我的问题NX伙计,我将尝试一下。祝您好运,不要伪造t返回并留下一些反馈:)在延迟之前和之后调用ButtonChanged()函数确实有效,但您是对的,它使我的代码混乱,所以我肯定会尝试使用计时器库。