← Retour au chapitre

Étape 2 / 3

Exo 8 : Interrupteur intelligent

Toggle ON/OFF avec anti-rebond et variable d'état.

Chapitres précédents non terminés
Pour un apprentissage optimal, termine d'abord : Boucles et tableaux

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.

Le problème : les rebonds (bouncing)

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 !

La logique du toggle

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 !

Schéma du circuit

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

D2D7220Ω

Montage (rappel)

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.

++151015202530abcdeabcdefghijfghij151015202530++
100%

Exercice : complète le toggle

Remplis les trous pour créer un toggle avec anti-rebond :

1. Quelle fonction retourne le temps écoulé depuis le démarrage ?

if (digitalRead(BTN) == LOW && - lastPress > 200)

2. Comment inverser un booléen ? (true ↔ false)

ledState = ;

3. Quelle variable contient l'état actuel de la LED ?

digitalWrite(LED, );

À retenir

  • Un toggle = un appui pour ON, un autre pour OFF, grâce à une variable bool.
  • !ledState inverse un booléen : truefalse, falsetrue.
  • Le debounce avec millis() empêche les rebonds mécaniques d'être interprétés comme plusieurs appuis.
  • Même concept que le debounce() en JavaScript — on attend que les parasites cessent avant d'agir.

Valide cette étape quand tu as terminé la lecture et la manipulation.

← digitalRead et INPUT_PULLUPExo 9 : Feu tricolore complet →

Electro-Lab - support pédagogique Arduino (MVP).

IFOSUP Wavre - Cours Drones et Robotique.