Exo 8 : Interrupteur intelligent — Toggle ON/OFF
Dans la section précédente, la LED s'allume tant qu'on appuie et s'éteint quand on relâche. Mais un vrai interrupteur, ça bascule : un appui → ON, un autre appui → OFF. C'est un toggle.
Étape 2 / 3
Toggle ON/OFF avec anti-rebond et variable d'état.
Dans la section précédente, la LED s'allume tant qu'on appuie et s'éteint quand on relâche. Mais un vrai interrupteur, ça bascule : un appui → ON, un autre appui → OFF. C'est un toggle.
Quand tu appuies sur un bouton mécanique, le contact ne se fait pas en une seule fois. Le métal rebondit pendant quelques millisecondes, générant plusieurs impulsions au lieu d'une seule.
Analogie dev : c'est exactement comme le debounce en JavaScript — quand un utilisateur clique frénétiquement sur un bouton, on attend qu'il ait fini avant de traiter l'action. Même concept, même solution !
Appuie sur le bouton...
Décoche « Anti-rebond » pour voir le chaos des rebonds mécaniques !
Pour faire un toggle, il faut deux choses :
1. Une variable d'état
bool ledState = false;
Elle retient si la LED est actuellement ON ou OFF.
2. Un anti-rebond (debounce)
On ignore les appuis trop rapprochés avec millis() et un délai de 200ms.
const int BTN = 2;
const int LED = 7;
bool ledState = false;
unsigned long lastPress = 0;
void setup() {
pinMode(BTN, INPUT_PULLUP);
pinMode(LED, OUTPUT);
}
void loop() {
if (digitalRead(BTN) == LOW && millis() - lastPress > 200) {
ledState = !ledState; // Inverse l'état
digitalWrite(LED, ledState); // Applique le nouvel état
lastPress = millis(); // Mémorise l'instant
}
}millis() retourne le nombre de millisecondes écoulées depuis le démarrage de l'Arduino. En comparant avec lastPress, on s'assure qu'au moins 200ms se sont écoulées depuis le dernier appui — exactement comme un debounce(fn, 200) en JS !
Le montage est le même que la section précédente : bouton sur D2 avec INPUT_PULLUP, LED sur D7 avec résistance 220Ω.
D2 → Bouton → GND | D7 → R 220Ω → LED → GND
Le montage est identique à la section précédente. Si tu l'as déjà câblé, tu peux simplement changer le code !
Même montage que la section précédente : bouton poussoir à cheval sur le fossé (colonne 8), câble bleu vers D2, GND.
Remplis les trous pour créer un toggle avec anti-rebond :
1. Quelle fonction retourne le temps écoulé depuis le démarrage ?
2. Comment inverser un booléen ? (true ↔ false)
3. Quelle variable contient l'état actuel de la LED ?
bool.!ledState inverse un booléen : true → false, false → true.millis() empêche les rebonds mécaniques d'être interprétés comme plusieurs appuis.debounce() en JavaScript — on attend que les parasites cessent avant d'agir.Valide cette étape quand tu as terminé la lecture et la manipulation.