2015-07-19 5 views
1

J'ai créé ce projet de sorte que lorsque je pousse et maintiens le bouton poussoir vers le bas, il va clignoter les trois LED sur ma planche à pain. Le problème avec ceci est que dès que je l'enfonce une fois, les LEDs ne cessent de clignoter, même si je relâche le bouton. Je suis assez sûr que le problème est que le programme ne lit qu'une fois l'état du bouton et continue ensuite vers le reste du programme. Est-il possible de mettre à jour le bouton tous les dixièmes de seconde? Ou s'il y a une autre façon de le réparer, n'hésitez pas à répondre. Voici mon code (pas la plus jolie, je sais):Simple code bouton LED Arduino

//Assigns button to digital pin 4 
int buttonPin = 4; 

void setup() { 
//sets pins 1-3 as output pins 
for (int ledPin= 1; ledPin <= 3; ledPin++) { 
     pinMode(ledPin, OUTPUT); 
} 
//sets the button pin as a button 
pinMode(buttonPin, INPUT_PULLUP); 
} 

void loop() { 
    //puts button state into variable "button" 
    int button = digitalRead(buttonPin); 
    //while button is pushed, blink leds in order 
    while (button == LOW) { 
    for (int ledPin = 1; ledPin <= 3; ledPin++) { 
     digitalWrite(ledPin, HIGH); 
     delay(500); 
     digitalWrite(ledPin, LOW); 
    } 
    } 
    //while button is not pushed, turn off leds 
    while (button == HIGH) { 
    for (int ledPin = 1; ledPin <= 3; ledPin++) { 
    digitalWrite(ledPin, LOW); 
    } 
} 
} 

Répondre

0

Le problème est que vous avez dit, vous lisez seulement au début de la boucle de l'état de bouton puis en entrant un certain temps qui ne peut pas sortir parce que button n'est jamais mis à jour à nouveau. Étant donné que la fonction loop() fonctionne aussi longtemps que l'Arduino est en cours d'exécution (après setup(), bien sûr), vous pouvez mettre à jour votre code pour ressembler à ceci:

void loop() { 
    //puts button state into variable "button" 
    int button = digitalRead(buttonPin); 
    //if button is pushed, blink leds in order 
    if (button == LOW) { 
    for (int ledPin = 1; ledPin <= 3; ledPin++) { 
     digitalWrite(ledPin, HIGH); 
     delay(500); 
     digitalWrite(ledPin, LOW); 
    } 
    }else if (button == HIGH) { //if button is not pushed, turn off leds 
    for (int ledPin = 1; ledPin <= 3; ledPin++) { 
     digitalWrite(ledPin, LOW); 
    } 
    } 
} 

Ce que cela va faire est de vérifier l'état du bouton, puis si elle est appuyez sur les LED clignotantes, sinon les désactiver toutes. Vous n'avez pas besoin des boucles while puisque loop() sera exécuté à nouveau dès qu'il se terminera, de sorte que vous obtiendrez une réponse continue à vos actions. Sinon, si vous voulez faire en sorte que relâcher le bouton pendant un cycle flash arrête, vous pouvez ajouter quelque chose comme ceci à la première boucle:

button = digitalRead(buttonPin); 
if(button == HIGH) break; 

Qu'est-ce qui va faire est de vérifier à nouveau le bouton alors que la Les DEL clignotent et si le bouton a été relâché, il quittera la boucle for. Cela étant dit, puisque vous avez un retard là-dedans, il pourrait vous manquer de relâcher puis de ré-appuyer sur le bouton si cela se produit dans le délai de 500ms.

J'espère que cela vous aide!

+0

Merci beaucoup! Cela m'a vraiment aidé. Je ne peux pas croire que je ne pouvais pas comprendre ça par moi-même haha! –