Pages: [1]   Go Down
Author Topic: Problème de débutant: gestion de boutons  (Read 1173 times)
0 Members and 1 Guest are viewing this topic.
Paris, France
Offline Offline
Jr. Member
**
Karma: 1
Posts: 55
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

Je butte sur un petit soucis tout con dans un de mes montages.

J'utilise deux boutons pour incrémenter ou décrémenter une valeur. Mon soucis se situe au niveau de la gestion de la modification de la valeur.
La valeur se modifie en continue quand je pousse le bouton, hors j'ai besoin qu'elle ne bouge que d'une unité par appuie.

J'utilise deux boutons avec des ponts diviseurs sur une entrée analogique. Je n'ai pas de soucis du coté de l'acquisition, l'anti-rebond fonctionne bien.

Voici la partie du code qui concerne mon soucis:

Code:
   
   int tmpButtonState = LOW;
   buttonValue = analogRead(buttonPin);
   if(buttonValue>BUTTON2LOW && buttonValue<BUTTON2HIGH){
     tmpButtonState = BUTTON2;
   }else if(buttonValue>BUTTON1LOW && buttonValue<BUTTON1HIGH){
     tmpButtonState = BUTTON1;

   if (tmpButtonState != lastButtonState) {
     lastDebounceTime = millis();
   }


   if ((millis() - lastDebounceTime) > debounceDelay) {
     buttonState = tmpButtonState;
   }
   lastButtonState = tmpButtonState;

switch(buttonState){
     case BUTTON1:
     if(LedLevel !=0){
         LedLevel--;
       }
     break;
     case BUTTON2:
       if (LedLevel < 6){
         LedLevel++;
       }
     break;
   }


Mon but est de faire varier LedLevel d'une unité dans un sens ou dans l'autre à chaque appuie sur un des deux boutons, dans un interval de 0 à 6.

C'est pour m’entraîner à gérer des boutons pour plus tard manipuler des menus.
Logged

France
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3636
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
La valeur se modifie en continue quand je pousse le bouton
Parce que tu parcours la boucle de ton programme plusieurs fois tant que le bouton est maintenu.
Il faut tester le relâcher du bouton juste après le switch/case comme ça tu ne boucleras que si le bouton est revenu au repos.
Logged

Paris, France
Offline Offline
Jr. Member
**
Karma: 1
Posts: 55
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui, j'ai bien compris que le problème vient de la.

Mais je ne sais pas comment gérer cet aspect dans mon code.
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3839
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu peux fair eun delay() + while :
Code:
delay(20); // permet au signal de se stabiliser sans compromettre la réactivité
while(digitalRead(Bouton,HIGH); //tant que le bouton est appuyé, le programme reste la
delay(20); // permet au signal de se stabiliser sans compromettre la réactivité
Logged


Paris, France
Offline Offline
Jr. Member
**
Karma: 1
Posts: 55
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pas con, mais ca bloque tout le programme.

Dans mon cas actuel c'est du test c'est pas génant, mais si je dois faire un menu sur une plateforme qui gère des E/S ca risque de poser soucis.

Il y a forcement un moyen de gérer les boutons tout en laissant le programme boucler.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 39
Ardui-Novice
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut,

Quote
Il y a forcement un moyen de gérer les boutons tout en laissant le programme boucler.

En utilisant les interruptions  smiley-lol
Logged

Rennes
Online Online
Sr. Member
****
Karma: 1
Posts: 330
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La librairie qu'il te faut est ici: http://playground.arduino.cc//Code/Bounce
Ca élimine les rebonds ("debounce") et ça permet de détecter les fronts pour n'avoir qu'un seul déclenchement.

Edit: elle ne fonctionnera pas avec une entrée analogique je pense.
Il faut donc que tu mémorises l'état précédent de chaque bouton, et que tu ne déclenches tes actions que quand l'état précédent est 0 et que l'état courant est 1 (une détection de front montant, en somme).

A la fin de loop() tu n'oublies par de mettre à jour tes variables stockant l'état précédent des boutons avec l'état courant, pour être prêt pour l'itération suivante.

« Last Edit: February 18, 2013, 09:15:41 am by patg_ » Logged


France
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3636
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Dans mon cas actuel c'est du test c'est pas génant, mais si je dois faire un menu sur une plateforme qui gère des E/S ca risque de poser soucis.

Si tu ne veux pas bloquer, tu lèves un drapeau lorsqu'une touche est reconnue.

A chaque lecture de l'état des boutons tu regardes si une touche est appuyée ou non.
      si elle est appuyée et que le drapeau est baissé tu exécutes ton code normalement
      si elle est appuyée et que le drapeau est levé tu passes
      si elle relâchée tu effaces le drapeau
Quelque part cela revient à ajouter un second "else" dans le" if" qui suit l'analogRead au début de ton code.
 
« Last Edit: February 18, 2013, 09:57:38 am by fdufnews » Logged

Paris, France
Offline Offline
Jr. Member
**
Karma: 1
Posts: 55
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La librairie qu'il te faut est ici: http://playground.arduino.cc//Code/Bounce
Ca élimine les rebonds ("debounce") et ça permet de détecter les fronts pour n'avoir qu'un seul déclenchement.

Edit: elle ne fonctionnera pas avec une entrée analogique je pense.
Il faut donc que tu mémorises l'état précédent de chaque bouton, et que tu ne déclenches tes actions que quand l'état précédent est 0 et que l'état courant est 1 (une détection de front montant, en somme).

A la fin de loop() tu n'oublies par de mettre à jour tes variables stockant l'état précédent des boutons avec l'état courant, pour être prêt pour l'itération suivante.



Parfait, c'etait la bonne solution. Merci smiley-grin

C'est vraiment tout con, j'aurais du y penser !
Logged

IDF/SO
Offline Offline
Edison Member
*
Karma: 41
Posts: 2312
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Coucou revoilà l'analogicien de service  smiley-mr-green

Tu as tout à fait le droit de compliquer ton programme en ajoutant des lignes de codes qui  permettent de patienter en attendant que les rebonds s'arrêtent.

Mais tu as aussi parfaitement le droit d'éliminer les effets des rebonds à l'endroit même où ils sont créés.
Il suffit simplement de placer un condensateur en parrallele sur le contact, une valeur de 100 nF convient dans quasiment tout les cas.
Et hop plus de pollution dans le code. smiley-mr-green
Logged

Paris, France
Offline Offline
Jr. Member
**
Karma: 1
Posts: 55
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Coucou revoilà l'analogicien de service  smiley-mr-green

Tu as tout à fait le droit de compliquer ton programme en ajoutant des lignes de codes qui  permettent de patienter en attendant que les rebonds s'arrêtent.

Mais tu as aussi parfaitement le droit d'éliminer les effets des rebonds à l'endroit même où ils sont créés.
Il suffit simplement de placer un condensateur en parrallele sur le contact, une valeur de 100 nF convient dans quasiment tout les cas.
Et hop plus de pollution dans le code. smiley-mr-green

C'est ce que je ferais surement dans le proto final surtout que je bosse en analogique pour l'entrée des boutons (pour n'avoir qu'une entrée pour tous les boutons), mais pour le moment sur la breadboard c'est plus facile en soft qu'en hard smiley-wink
Logged

Pages: [1]   Go Up
Jump to: