2016-08-25 1 views
0

fonctionnalité:bascule à partir de l'état du bouton arduino HIGH à l'état bas après une période

utilisateur appuie sur le bouton dôme rouge (n'est pas un bouton d'état 2), d'où il doit basculer sur la première presse " 0 "->" 1 "& lorsque vous appuyez à nouveau sur" 1 "->" 0 ". Par conséquent, lorsque vous appuyez sur cette touche, le moniteur série imprime des "1" à partir de "0" toutes les 100 ms. Le comportement signale que le bouton button est basculé de LOW à HIGH

En outre, une bande de LED est également connectée à Arduino. Par conséquent, lorsque le buttonstate affiche une valeur HIGH dans le moniteur série, l'état des voyants passe à HIGH après un délai de 10 secondes et reste à l'état HIGH pendant 10 secondes avant de passer à l'état LOW. Enfin, buttonState devrait passer de HIGH à LOW après un délai (25s), sans que l'utilisateur appuie physiquement sur le bouton.

Problème:

A ce moment, l'utilisateur doit appuyer sur la touche dôme rouge pour basculer entre LOW & état haut. Par conséquent, lorsque l'état initial du bouton est LOW, il affiche "0" dans le moniteur série et lorsqu'il est pressé, le bouton bascule à HIGH, affiche "1" dans le moniteur série et lorsque le bouton est pressé à nouveau, il bascule HIGH to LOW, indiquant "0" dans le moniteur série.

Par conséquent, je voudrais demander de l'aide sur la façon de permettre à l'état butt de basculer de HIGH à LOW sans que l'utilisateur n'appuie sur le bouton.

donc correctBehaviour:

état initial « 0 » sont représentées sur le moniteur en série et lorsque le bouton utilisateur appuie ButtonState représente des « 1 » dans le moniteur de série et après un nombre de 25s, le buttonstate bascule à LOW sans que l'utilisateur appuie de nouveau sur le bouton.

code:

const int buttonPin = 2; //the number of the pushbutton pin 
const int Relay  = 4; //the number of the LED relay pin 

uint8_t stateLED = LOW; 
uint8_t  btnCnt = 1; 

int buttonState = 0; //variable for reading the pushbutton status 
int buttonLastState = 0; 
int outputState = 0; 

void setup() { 
    Serial.begin(9600); 
    pinMode(buttonPin, INPUT); 
    pinMode(Relay, OUTPUT); 
    digitalWrite(Relay, LOW); 
} 

void loop() { 

    // read the state of the pushbutton value: 
    buttonState = digitalRead(buttonPin); 
    // Check if there is a change from LOW to HIGH 
    if (buttonLastState == LOW && buttonState == HIGH) 
    { 
    outputState = !outputState; // Change outputState 
    } 
    buttonLastState = buttonState; //Set the button's last state 

    // Print the output 
    if (outputState) 
{ 
     switch (btnCnt++) { 
     case 100: 
     stateLED = LOW; 
     digitalWrite(Relay, HIGH); // after 10s turn on 
     break; 

     case 200: 
     digitalWrite(Relay, LOW); // after 20s turn off 
     break; 

     case 202: // small loop at the end, to do not repeat the LED cycle 
     btnCnt--; 
     break;  
     } 

     Serial.println("1"); 
    }else{ 
    Serial.println("0"); 
    if (btnCnt > 0) { 
     // disable all: 
     stateLED = LOW; 
     digitalWrite(Relay, LOW); 
    } 
    btnCnt = 0; 
    } 

    delay(100); 
} 

Répondre

0

Je suppose que votre code est presque correct.

Dans le cas 200: je basculerais également outputtate pour revenir à l'état par défaut.

BTW: btncnt est un nom trompeur que vous comptez vos intervalles de 100 ms, pas appuyer sur des boutons ou similaires.

IMO, délai (100); est un compromis acceptable: faire réagir encore appuyer sur des boutons, mais sans le faire correctement à l'aide si (Millis() - lastpressed> 20000) { ...

+0

que voulez-vous dire par « mais sans le faire en utilisant correctement si (millis() - lastpressed> 20000) {... ", j'utilise le delay (100) pour vérifier chaque appui sur un bouton. Désolé, je ne comprends pas vraiment votre sens – Luke

+0

lire, exercer et comprendre l'exemple BlinkWithoutDelay à https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay.Il ne s'agit pas seulement de cligner des yeux, mais de chaque attente non bloquante. – datafiddler