bouton-poussoir.ino
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 Pro Mini (ATmega328P, existe en 5 V/16 MHz et 3,3 V/8 MHz) reliée à un convertisseur USB-série (FTDI) ou un programmeur ICSP. 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
Choisissez « Arduino Pro Mini » dans l'IDE (5 V/16 MHz ou 3,3 V/8 MHz selon votre modèle), le processeur ATmega328P, le bon port, puis Téléverser. Le convertisseur doit être câblé DTR-DTR, RX-TX, TX-RX, VCC-VCC, GND-GND.
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;
}