2017-10-17 81 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); 

}