Main

Apprendre : Accueil | Exemples | Fondements? | Bidouillage? | Liens?
Exemples > Entrées / Sorties Numériques

Compter le nombre d'appuis sur un bouton poussoir


Une fois que l'on sait utiliser un bouton poussoir, on veut souvent ensuite déclencher des actions en fonction du nombre de fois où un bouton poussoir a été appuyé. Pour réaliser cela, il est nécessaire de savoir quand le bouton poussoir passe de l'état haut à l'état bas, et de compter combien de fois ce changement est survenu. On appelle cela la détection de changement d'état ou la détection de front (montant ou descendant).

Matériel requis

  • une plaque d'essai pour montages sans soudures
  • des straps
  • une résistance de 10 Kohms
  • un bouton poussoir

Le circuit à réaliser

Image créée avec le logiciel Fritzing. Pour plus de circuits d'exemple, voir la page des projets Fritzing.

Pour réaliser ce circuit, :

  • Mettre le bouton poussoir en place sur la plaque d'essai,
  • Connecter 3 fils à la carte Arduino :
    • les 2 premiers, rouge et noir, à connecter au bus d'alimentation (bandes rouge et bleue en haut et bas de la carte) pour alimenter la plaque d'essai en 5V et la connecter à la masse.
    • Le 3ème fil relie la broche 2 à une des pattes du bouton poussoir.
  • La même patte du bouton poussoir doit-etre connectée à la masse via la résistante de 10Ko réalisant ainsi un "rappel au moins" (ou pulldown en anglais).
  • La patte opposée du bouton poussoir doit être connectée au 5V.
  • Ensuite, connecter la carte Arduino par un câble USB à votre ordinateur sur lequel est installé le logiciel Arduino.

Comment çà marche ?

Les boutons poussoir connectent deux points d'un circuit quand vous appuyez dessus (et seulement tant que vous appuyez dessus). Quand le bouton poussoir (ou BP) est ouvert (càd quand il n'est pas appuyé), il n'y a aucune connexion entre les broches du boutton (ou les 2 paires de broches sur les BP pour CI à 4 broches) : dans cette situation la broche de la carte Arduino est donc connectée à la masse (via la résistance de "rappel au moins" ou pulldown et la broche sera lue comme étant au niveau BAS (0V).

Quand le BP est fermé (càd lorsqu'on appuie dessus), il se crée une connexion entre les 2 broches du BP, reliant ainsi la broche au 5V, et la broche sera lue comme étant au niveau HAUT (=+5V).

Lorsqu'une broche numérique d'Entrée/Sortie est connectée à rien, le niveau présent sur cette broche en entrée est instable et la LED dans notre programme clignoterait de façon erratique. Ceci est du au fait que l'entrée est "flottante" - c'est à dire qu'elle n'a pas de connexion matérielle au +5V ou à la masse, et elle oscillera de façon aléatoire entre le niveau HAUT et le niveau BAS. C'est pour cette raison qu'il faut mettre une résistance de "rappel au moins" dans le montage du BP sur la broche numérique en entrée.

Pour plus d'information sur le bouton poussoir, voir : Le Bouton Poussoir

Bon à savoir
Il est possible de réaliser également un montage d'un bouton poussoir sur une broche en entrée avec un "rappel au plus" ou pull-up, au lieu d'un "rappel au moins" ou "pull-down". Le microcontrôleur utilisé sur la carte Arduino dispose d'ailleurs d'une résistance interne qu'il est possible d'activer pour réaliser ce "rappel au plus", ce qui permet de se dispenser d'une résistance externe ! Voir l'exemple : l'appui sur un BP allume une LED

Mise en oeuvre du programme

Programmation de la carte Arduino

Préparation du Terminal côté PC dans le logiciel Arduino

  • Côté PC, il faut ouvrir la fenêtre terminal de l'IDE Arduino : pour ce faire, un simple clic sur le bouton « Sérial Monitor ».
  • La fenêtre « Terminal » s'ouvre alors :
  • Il faut alors régler le débit de communication sur la même valeur que celle utilisée par le programme avec lequel nous allons programmer la carte Arduino :

Résultat obtenu

Le nombre d'appui sur le bouton poussoir est comptabilisé : à chaque nouvel appui, un message dans la fenêtre du Terminal Série informe de la prise en compte d'un nouvel appui.

Schéma théorique du montage

Voici le schéma théorique du montage :

Image créée avec le logiciel Fritzing. Pour plus de circuits d'exemple, voir la page des projets Fritzing.

Explications du programme

Dans ce programme, l'état du bouton est continuellement lu. L'état actuel du bouton poussoir est comparé au dernier état du bouton poussoir lors du passage dans la boucle loop. Si l'état du bouton poussoir est différent du dernier état et que le bouton poussoir est au niveau HAUT (càd appuyé), alors le bouton poussoir est passé de l'état ouvert à l'état fermé, de l'état BAS à l'état HAUT. Le programme incrémente alors une variable comptant le nombre d'appuis.

De plus, ce programme analyse la valeur du nombre d'appuis ayant eu lieu : si il s'agit d'un multiple de 4, la LED de la carte Arduino sur la broche 13 est allumée. Sinon, elle est éteinte.

Le code du programme

A copier/coller dans votre logiciel Arduino.

/*
  Détection de changement d'état d'un bouton poussoir
  (détection de front)

   La plupart du temps, il n'est pas nécessaire de connaître l'état d'un bouton poussoir
  à tout moment, mais seulement si l'état du bouton poussoir a été modifié.
  Par exemple, on voudra savoir si un bouton poussoir est passé de l'état BAS à l'état HAUT.
  Ceci est appelé détection de changement d'état, ou détection de front.

 Cet exemple montre comment détecter quand un bouton poussoir change d'état.

 Le montage :
 * un bouton poussoir connecté entre la broche 2 et le +5V
 * une résistance de 10Kohms entre la broche 2 et le 0V (masse)
 * une LED entre la broche 13et la masse (intégrée à la carte Arduino)

  créé 27 Sep 2005
  modifié 30 Dec 2009
 par Tom Igoe

 Cet exemple est dans le domaine public.
 Traduction française par X. HINAULT.

 http://arduino.cc/en/Tutorial/ButtonStateChange

 */


// Les constantes ne changent pas durant le programme.
// Utilisée ici pour définir la numéro de la broche :

const int  buttonPin = 2;     // crée un identifiant pour la broche utilisée avec le bouton poussoir
const int ledPin = 13;       // crée un identifiant pour la broche utilisée avec la LED


// Les variables sont modifiées au cours du programme
int buttonPushCounter = 0;   // variable pour le comptage du nombre d'appuis sur le bouton poussoir
int buttonState = 0;         //Variable pour l'état actuel du bouton poussoir
int lastButtonState = 0;     // Variable pour l'état précédent du bouton poussoir

void setup() {
  // met la broche en entrée
  pinMode(buttonPin, INPUT);
 // met la broche en sortie
  pinMode(ledPin, OUTPUT);
  // initialise la communication série
  // Attention : utiliser la meme vitesse de communication pour le Terminal Série
  Serial.begin(9600);
}


void loop() {
  // lit l'état actuel du bouton poussoir et le mémorise dans la variable
  buttonState = digitalRead(buttonPin);

  // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
  if (buttonState != lastButtonState) {
    // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
    if (buttonState == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS  à HAUT
      buttonPushCounter++;

      // affiche les messages sur le PC
      Serial.println("APPUI");
      Serial.print("nombre d'appuis:  ");
      Serial.println(buttonPushCounter, DEC); // affiche la valeur au format décimal
    }
    else {
      // si le bouton courant est BAS
      // il est passé de HAUT à BAS :
      Serial.println("PAS D'APPUI");
    }

    //mémorise l'état courant du bouton poussoir
    //pour les prochains passages dans la boucle loop
    lastButtonState = buttonState;
  }

  // allume la LED tous les 4 appuis
  // en utilisant la fonction modulo (symbole %)
  // qui fournit le reste de la division
  // par 4 de la variable de comptage
  // si le reste vaut 0, la variable de comptage
  // est un multiple de 4
  if (buttonPushCounter % 4 == 0) { // si le reste de variable/4 vaut 0
    digitalWrite(ledPin, HIGH); // allume la LED
  } else { // sinon
   digitalWrite(ledPin, LOW); // eteint la LED
  }

}

Voir également

La documentation des composants utilisés

La documentation des instructions utilisées :

La documentation des stratégies de programmation utilisées

Les autres exemples suivants :

  1. DigitalReadSerial - read a switch, print the state out to the Serial Monitor
  2. BlinkWithoutDelay - blinking an LED without using the delay() function
  3. Blink - turn an LED on and off

Commentaires utilisateurs



Page d'accueil de la référence Arduino en français

Corrections, suggestions et nouvelle documentation peuvent être postées sur le Forum Arduino.

La présente traduction française commentée a été réalisée par Xavier HINAULT (2010) (www.mon-club-elec.fr) et est sous licence Creative Commons Attribution-ShareAlike 3.0. Cette page est la traduction française commentée de la page originale : http://arduino.cc/en/Tutorial/ButtonStateChange