2017-07-05 3 views
0

Lorsque j'essaie de changer l'état du bouton après qu'il a été pressé, rien ne fonctionne. Je le fais avec la ligne prev = current;Pourquoi mon bouton ne fonctionne-t-il pas lorsque je tente de mettre à jour l'état du bouton?

#include <Servo.h>; 

//HIGH not pressed 
//LOW pressed 

int pushD3 = 3; 
int pushD4 = 4; 
int pushD5 = 5; 
int pushD6 = 6; 
int val4 = 0; 
int val5 = 0; 
int ledPin = 13; 
int prev = 0; 
int current = 0; 
Servo ZServo; 

void setup() { 
    ZServo.attach(9); 
    pinMode(pushD3, INPUT_PULLUP); 
    digitalWrite(3, HIGH); 
    pinMode(pushD4, INPUT_PULLUP); 
    digitalWrite(4, HIGH); 
    pinMode(pushD5, INPUT_PULLUP); 
    digitalWrite(5, HIGH); 
    pinMode(pushD6, INPUT_PULLUP); 
    digitalWrite(6, HIGH); 
    pinMode(ledPin, OUTPUT); 
} 

void loop() { 
    if (digitalRead(3) == LOW) { 
    current = 1 - current; 
    } 
    if (current == 1 && prev == 0) { 
    checkButtons_slow(); 
    delay(100); 
    } 
    if (current == 0 && prev == 1) { 
    //ZServo.write(110); 
    delay(500); //half a second 
    } 
    prev = current; 
} 

void checkButtons_slow() { 
    val4 = digitalRead(pushD4); 
    val5 = digitalRead(pushD5); 
    if (val4 == LOW) { 
    ZServo.write(87); 
    } else if (val5 == LOW) { 
    ZServo.write(99); 
    } else { 
    ZServo.write(91); //GUESSED ON 92; SHOULD TECHNICALLY BE 90 
    } 
} 
+0

Vous ne configurez pas de broches. Où 'checkButtons_slow()' est-il défini? Qu'est-ce qui est censé arriver? – stevieb

+0

@stevieb Je l'ai fait mais je ne l'ai pas mis dans le code car je suis à peu près sûr qu'il est correct. Modifier montre tout cela. – mkpappu

+0

Merci pour la mise à jour. Il est toujours préférable de montrer votre croquis entier, ou au moins un exemple minimal avec tout le code nécessaire pour reproduire exactement votre problème. Voir [SSCCE] (http://sscce.org/). – stevieb

Répondre

0

Vous mettez à jour votre état à bascule même lorsque le bouton est pas poussé. C'est pourquoi la logique ne fonctionne pas. Vous devez également garder une trace du moment où le bouton est relâché pour la logique du bouton bascule.

Vous pouvez également être la prochaine victime du rebond du commutateur. Un commutateur typique ne va pas proprement d'ouvert à fermé, et peut produire de petits signaux d'ouverture/fermeture rapides lorsqu'il est poussé (et relâché). Bien que cela n'affecte pas le fonctionnement des boutons enfoncés/enfoncés, c'est un tueur pour les commutateurs à états multiples.

Un moyen facile d'éviter cela est de limiter la vitesse à laquelle vous lisez les commutateurs. J'ai trouvé qu'un taux de 30ms est plutôt bon.

int last_time = 0; 
bool was_pushed = false; 

void loop() { 

    if (millis() - last_time > 30) // filter out signal bounce. 
    { 
    last_time = millis(); 
    if (digitalRead(3) == LOW) 
    { 
     if (!was_pushed)   // prevent toggling until button is released.  
     current = !current; 
     was_pushed = true; 
    } 
    else 
    { 
     was_pushed = false; 
    } 
    if (current != prev) 
    { 
     prev = current;   // keep the previous toggle state only on change. 
     if (current) 
     { 
     checkButtons_slow(); 
     delay(100); 
     } 
     else 
     { 
     //ZServo.write(110); 
     delay(500); //half a second 
     } 
    } 
    } 
} 
+0

Si je remplace mon code par ceci, rien ne se passe du tout. Bien que, si je remplace 'checkButtons_slow();' avec 'ZServo.write (80);' puis une fois que je clique sur un bouton, le servo se déplace en raison de 'ZServo.write (80);' – mkpappu

+0

Ceci n'est pas une esquisse complète . Vous devez toujours inclure votre configuration actuelle(). –

+0

Je sais. Je viens de remplacer ma boucle() avec ça. – mkpappu

0

J'ai trouvé votre mise en œuvre et Michael est un peu confus, pourquoi ne pas faire:

bool state = false; 
bool buttonPressed = false; 
void loop(){ 
    if (digitalRead(3) == LOW && !buttonPressed){ 
     state=!state; 
     buttonPressed = true; 
    } 
    if(digitalRead(3) == HIGH){ 
     buttonPressed = false; 
    } 

    // Then your logic 
    if (state) { 
    checkButtons_slow(); 
    delay(100); 
    } else{ 
     //ZServo.write(110); 
     delay(500); //half a second 
    } 
}