bouton-poussoir.ino

Arduino UNO R3 · Archivo : bouton-poussoir.ino · Lenguaje : Arduino · Uso : Allumer une LED quand on appuie sur un bouton, avec anti-rebond

Un botón conectado al pin 2 enciende el LED en el 13 en cada pulsación. El antirrebote por software (30 ms) evita falsas pulsaciones por los rebotes mecánicos del contacto. La resistencia de pull-up es la interna del microcontrolador (INPUT_PULLUP).

Hardware

Un Arduino Uno R3 (ATmega328P, 5 V, 16 MHz) alimentado por USB o jack de 7-12 V. 1 botón pulsador (una pata al pin 2, la otra a GND).

Cableado

Botón entre el pin 2 y GND. Sin resistencia externa: el modo INPUT_PULLUP activa la resistencia interna de 20 a 50 kΩ.

Funcionamiento

La lectura se valida solo si permanece estable 30 ms. Una pulsación lleva el pin a masa (LOW en PULLUP) y enciende el LED; al soltar se apaga.

Ejecución

En el Arduino IDE, elige la placa « Arduino Uno » y el puerto serie correspondiente y pulsa Subir. Abre el monitor serie a 9600 baudios para seguir los mensajes.

Variantes

Para un botón enclavado (toggle), invierte ledAllumee en cada flanco. Con cableado activo en alto, añade una resistencia de 10 kΩ a GND y prueba 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;
}

← Volver a la ficha