Main

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

Commander une LED avec un bouton poussoir en filtrant le bruit


Cet exemple montre comment utiliser un bouton poussoir : à chaque fois que l'on appuie sur le bouton, la LED (ou tout autre chose) est allumée (si elle est éteinte) ou éteinte (si elle est allumée). Ce programme gère également l'anti-rebond de l'entrée, c'est à dire que le programme teste l'état de l'entrée à deux reprises en peut de temps afin d'être sur que le bouton poussoir est vraiment appuyé.

En l'absence de prise en compte de l'anti-rebond, le début de l'appui sur le bouton poussoir sera pris en compte comme plusieurs appuis. On utilise ici l'instruction millis pour garder la trace du temps écoulé lorsque le bouton est appuyé.

Au niveau microscopique, lorsque l'on appuie sur le bouton poussoir, le contact n'est pas immédiat et le bouton poussoir, avant de se stabiliser, "rebondit" un peu comme une balle rebondit avant de rester posée au sol : la conséquence est une suite rapide de niveaux "HAUT" / "BAS" que le programme considérera comme autant d'appuis successifs en l'absence d'un filtrage dit "anti-rebond".

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.

Comment çà marche ?

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

...

Schéma théorique du montage

Voici le schéma théorique du montage :

Explications du programme

Le code ci-dessous est basé sur la version "anti-rebond" de Limor Fried, mais la logique a été inversée dans cet exemple. Dans son exemple, le bouton poussoir renvoie la valeur BAS quand il est appuyé et HAUT quand il est ouvert. Ici, le bouton poussoir renvoie le niveau HAUT quand il est appuyé et BAS quand il n'est pas appuyé.

Le code du programme

A copier/coller dans votre logiciel Arduino.


/*
 Anti-rebond

 A chaque fois que la broche en entrée va de BAS vers HAUT (c'est à dire lorsqu'un
 bouton poussoir est appuyé), la broche en sortie est inversée de BAS vers HAUT
 ou de HAUT vers BAS. On utilise un délai minimum entre 2 inversion de l'état de la LED
 afin d'assurer l'anti-rebond de la broche en entrée
 (càd on filtre le "bruit" de la broche en entrée).

 Le montage :
 * LED connectée entre la broche 13 et la masse (0V)
 * bouton poussoir conncté entre la broche 2 et le +5V
 * la résistance de 10 K entre la broche 2 et le 0V.  

 créé le 21 Novembre 2006
 par David A. Mellis
 modifié le 3 juilet 2009
 par Limor Fried

 Cet exemple est dans le domaine public.
 Traduction française par X. HINAULT - www.mon-club-elec.fr

 http://www.arduino.cc/en/Tutorial/Debounce
 */


// 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 ledState = HIGH;         // Variable pour l'état courant de la LED
int buttonState;             //Variable pour l'état actuel du bouton poussoir
int lastButtonState = LOW;   // Variable pour l'état précédent du bouton poussoir

// les variables suivantes sont de type long car le temps, mesuré en millisecondes
// devient rapidement un nombre qui ne peut pas être stocké dans un type int.
long lastDebounceTime = 0;  // variable pour mémoriser le temps écoulé depuis le dernier changement de la LED
long debounceDelay = 50;    //intervalle anti-rebond

void setup() {
  pinMode(buttonPin, INPUT); // met la broche en entrée
  pinMode(ledPin, OUTPUT); // met la broche en sortie
}

void loop() {
  // lit l'état du bouton poussoir et le stocke dans une variable locale type int
  int reading = digitalRead(buttonPin);

  // vérifie si le bouton poussoir vient d'être appuyé
  // c'est à dire si la broche est passée de HAUT à BAS,  puis on attend
  // suffisamment longtemps pour ignorer le rebond

  // Si l'état du bouton poussoir est changé ou si il y a du bruit
  if (reading != lastButtonState) {
    // mémorise le moment où l'appui détecté
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // quelque soit l'état de la broche lu, tant que le délai n'est pas écoulé
    // le bouton poussoir est considéré comme étant dans le dernier état pris en compte
    buttonState = reading;
  }

  //// modifie l'état de la LED en utilisant l'état du bouton
  digitalWrite(ledPin, buttonState);

  // Mémorise la valeur de l'état du bouton poussoir lue. Lors du prochain passage
  // dans la boucle loop, ce sera la variable lastButtonState
  lastButtonState = reading;
}
 

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. Blink - turn an LED on and off
  3. Button State Change - counting the number of button pushes

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/Debounce