Go Down

Topic: Code mise à zero pushbutton counter (Read 766 times) previous topic - next topic

roud

Bonjour,

Je débute en programmation et il y a quelques notions qui m'échappent.
J'utilise l'exemple trouver sous le site Arduino ci-dessous) pour compter le nombre d'appuis sur le boutonet afficher dans le port série.

[edit]    
http://arduino.cc/en/Tutorial/ButtonStateChange

*/

// this constant won't change:
const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
 // initialize the button pin as a input:
 pinMode(buttonPin, INPUT);
 // initialize the LED as an output:
 pinMode(ledPin, OUTPUT);
 // initialize serial communication:
 Serial.begin(9600);
}


void loop() {
 // read the pushbutton input pin:
 buttonState = digitalRead(buttonPin);

 // compare the buttonState to its previous state
 if (buttonState != lastButtonState) {
   // if the state has changed, increment the counter
   if (buttonState == HIGH) {
     // if the current state is HIGH then the button
     // wend from off to on:
     buttonPushCounter++;
     Serial.println("on");
     Serial.print("number of button pushes:  ");
     Serial.println(buttonPushCounter, DEC);
   }
   else {
     // if the current state is LOW then the button
     // wend from on to off:
     Serial.println("off");
   }
 }
 // save the current state as the last state,
 //for next time through the loop
 lastButtonState = buttonState;

 
 // turns on the LED every four button pushes by
 // checking the modulo of the button push counter.
 // the modulo function gives you the remainder of
 // the division of two numbers:
 if (buttonPushCounter % 4 == 0) {
   digitalWrite(ledPin, HIGH);
 } else {
  digitalWrite(ledPin, LOW);
 }
 
}[/edit]

Maintenant, j'aimerai mettre à zéro le compteur d'interruption au bout de 2 minutes.
Comment dois-je programmer ? Quelqu'un peut me dire quelles lignes de code ajouter svp ?


Luj06

dans la boucle (loop), il faut tester le nombre de millisecondes par rapport aux deux secondes en cours.

Code: [Select]

long deuxSecCount = 0;

// ...

void loop()
{
 // ...

 if (millis() - 120000 > deuxSecCount * 120000) {
    deuxSecCount++;
    buttonPushCounter  = 0;
 }

}

// ...


roud

#2
Nov 15, 2010, 03:58 pm Last Edit: Nov 15, 2010, 03:59 pm by Nicoroots59 Reason: 1
OK, j'ai compris tes lignes de code, c'est déjà ça.
Par contre, ça ne marche pas à chaque fois.
Si rien ne se passe pendant un temps supérieur à 2 minutes alors la remise à zéro ne s'effectue pas.
Est-ce qu'il faut que je lie ma remise à zero à un état du boutton ? Si c'est ça j'ai également besoin d'aide.


fdufnews

Quote
Est-ce qu'il faut que je lie ma remise à zero à un état du boutton ?
Non au contraire

Quote
Si rien ne se passe pendant un temps supérieur à 2 minutes alors la remise à zéro ne s'effectue pas.
C'est que tu as du faire le test dans une partie du code qui n'est balayé que lorsque l'on appuie sur un bouton ou que tu ne passes pas dans la partie de code qui met la LED à jour.

roud

En fait, je suis en train de me dire qu'il serait peut être plus judicieux de mettre à zéro mon compteur si je reste à l'état Off pendant un certain temps (20s par ex).
ENsuite, je compte les tours quand ma roue tourne et dans ce cas là l'application de départ fonctionne bien.
Quand ma roue s'arrête, et que je reste à l'état OFF; alors je repars à Zéro.

En utilisant le code collé au départ, je pense que ça doit être possible...mais je ne sais pas comment m'y prendre pour passer à zéro quand ma roue est restée immobile plus de 20 s.




Go Up