bouton-poussoir.ino

Arduino UNO R3 · Fichier : bouton-poussoir.ino · Langage : Arduino · Usage : Allumer une LED quand on appuie sur un bouton, avec anti-rebond

Un bouton relié à la broche 2 allume la LED 13 à chaque appui. L'anti-rebond logiciel (30 ms) évite les faux appus dus aux rebonds mécaniques du contact. La résistance de tirage est celle interne du microcontrôleur (INPUT_PULLUP).

Matériel requis

Une Arduino Uno R3 (ATmega328P, 5 V, 16 MHz) alimentée par USB ou jack 7-12 V. 1 bouton poussoir (une patte sur la broche 2, l'autre sur GND).

Câblage

Bouton entre la broche 2 et GND. Pas de résistance externe : le mode INPUT_PULLUP active la résistance interne de 20 à 50 kΩ.

Fonctionnement

La lecture est mémorisée et validée seulement si elle reste stable 30 ms. Un appui met la broche à la masse (LOW en PULLUP) et allume la LED ; le relâchement l'éteint.

Exécution

Dans l'Arduino IDE, choisissez la carte « Arduino Uno » et le port série correspondant, puis cliquez sur Téléverser. Ouvrez le moniteur série à 9600 bauds pour suivre les messages.

Variantes

Pour un bouton qui reste enclenché (toggle), inversez ledAllumee sur chaque front. En câblage actif-haut, ajoutez une résistance 10 kΩ vers GND et testez HIGH.

bouton-poussoir.ino

// Bouton poussoir avec anti-rebond logiciel (machine à états).
const int BOUTON = 2;  // broche du bouton (vers GND, résistance interne)
const int LED = 13;

bool etatPrecedent = HIGH;
bool etatStable = HIGH;
bool ledAllumee = false;
unsigned long dernierBord = 0;
const unsigned long ANTI_REBOND = 30; // ms

void setup() {
  pinMode(BOUTON, INPUT_PULLUP); // pas de resistance externe : on utilise celle du MCU
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  bool lecture = digitalRead(BOUTON);
  unsigned long maintenant = millis();

  if (lecture != etatPrecedent) {
    dernierBord = maintenant; // le signal bouge : on remet le chrono a zero
  }
  if (maintenant - dernierBord >= ANTI_REBOND && lecture != etatStable) {
    etatStable = lecture;
    if (etatStable == LOW && !ledAllumee) { // front d'appui (LOW en PULLUP)
      ledAllumee = true;
      Serial.println(F("Appui !"));
    } else if (etatStable == HIGH && ledAllumee) {
      ledAllumee = false;
    }
    digitalWrite(LED, ledAllumee ? HIGH : LOW);
  }
  etatPrecedent = lecture;
}

← Retour à la fiche