bouton-poussoir.ino
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 Pro Mini (ATmega328P, existe en 5 V/16 MHz y 3,3 V/8 MHz) conectado a un convertidor USB-serie (FTDI) o un programador ICSP. 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
Elige « Arduino Pro Mini » en el IDE (5 V/16 MHz o 3,3 V/8 MHz según tu modelo), el procesador ATmega328P, el puerto correcto y Subir. El convertidor debe estar cableado DTR-DTR, RX-TX, TX-RX, VCC-VCC, GND-GND.
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;
}