2017-10-17 8 views
0

J'ai un code dans lequel une LED s'allume pendant une période de temps définie en fonction d'une combinaison de 3 boutons.Eteindre une LED avec une combinaison de boutons pendant une boucle "for"

Mon problème est qu'une fois qu'une combinaison commence, je n'arrive pas à éteindre la LED. Il est supposé que lorsque j'appuie sur tous les 3 boutons, la LED s'éteindra, peu importe combien de temps il reste.

Voici la partie que j'ai des problèmes avec:

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

Selon moi, la LED devrait allumer pour 24sec alors hors tension, si le bouton 1 est pressé, mais désactiver si tous les boutons sont poussés en même temps, quel que soit le temps restant.

+0

Selon le code, la LED s'allume seulement une seconde. –

Répondre

0

Je pense que vous avez manqué un support recourbé:

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

Ainsi, le délai est maintenant une partie de la boucle for. Le fait que vous disiez qu'il ne s'éteint pas si vous avez appuyé sur les trois boutons pourrait être à cause du retard lui-même. Vous êtes bloquant dans 1 sec de ne rien faire et ensuite vous vérifiez quelque chose moins d'une milliseconde. Je suppose que si vous appuyez sur vos boutons pendant une seconde ou plus, cela pourrait fonctionner (à condition que vous ayez quelques digitalReads, que vous ne nous avez pas montré). Pour éviter cela, vous pouvez utiliser un horodatage au lieu du délai:

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

}