2017-10-17 117 views
0

我有一个代码,其中LED将点亮一段时间,具体取决于3个按钮的组合。在“for”循环期间用一组按钮关闭LED

我的问题是,一旦组合开始,我似乎无法关闭LED。假设当我按下所有3个按钮时,无论剩下多少时间,LED都会关闭。

这里是我有问题的一部分:

if (buttonState1 == HIGH){ 
     digitalWrite(ledPin4, HIGH); 
     for (int d=0; d<24;d++) 
      if (buttonState1 == HIGH && buttonState2 == HIGH && buttonState3 == HIGH){ 
       d=24; 
      } 
     delay(1000) 
    } 
    digitalWrite(ledPin4, LOW); 
} 

根据我的LED应开启了24秒,然后关闭,如果按下button 1,但如果所有按钮都被推向关闭同时不管剩下多少时间。

+0

根据代码,LED仅亮起一秒钟。 –

回答

0

我想你错过了卷曲支架:

if (buttonState1 == HIGH){ 
    digitalWrite(ledPin4, HIGH); 
    for (int d=0; d<24;d++){  // Missed bracket here 
     if (buttonState1 == HIGH && buttonState2 == HIGH && buttonState3 == HIGH){ 
      d=24; 
     } 
     delay(1000) 
    } 
    digitalWrite(ledPin4, LOW); 
} 

所以延迟是现在的for循环的一部分。如果您按下三个按钮,则说它不会关闭,这可能是因为延迟本身。你在1秒内不做任何事情,然后你检查少于一毫秒的东西。我假设你按下按钮一秒钟或更长时间,它可以工作(只要你有一些digitalReads,你没有向我们展示)。为避免这种情况,您可以使用时间戳代替延迟:

long startTime = 0; 

buttonState1 = digitalRead(buttonPin1); 

if(buttonState1 == HIGH){ 
    digitalWrite(ledPin4, HIGH); 
    startTime = millis(); 
    while(startTime + 24000 > millis() && startTime != 0){    
     // You have to read your buttons every loop. Might be also some problem in your code 
     buttonState1 = digitalRead(buttonPin1); 
     buttonState2 = digitalRead(buttonPin2); 
     buttonState3 = digitalRead(buttonPin3); 
     if (buttonState1 == HIGH && buttonState2 == HIGH && buttonState3 == HIGH){ 
      startTime = 0; 
      break; 
     } 
    } 
    digitalWrite(ledPin4, LOW); 

}