Arduino - Bouton + LED

Objectif

Allumer une LED lorsque l'on appuie sur un bouton.

Materiel

Combinaisons possibles (Pins / LEDs)

Chaque pin controle 1 LED (ON/OFF). Formule : 2n combinaisons possibles.

Pins Formule Combinaisons Valeurs
12120 - 1
22240 - 3
32380 - 7
424160 - 15
525320 - 31
626640 - 63
7271280 - 127
8282560 - 255
9295120 - 511
1021010240 - 1023
1321381920 - 8191

Exemple avec 7 LEDs : etat 42 = 0101010 en binaire

Etat 42 = 0 1 0 1 0 1 0
           LED7=OFF LED6=ON LED5=OFF LED4=ON LED3=OFF LED2=ON LED1=OFF

Arduino Uno : 13 pins digitaux + 6 analogiques = 19 pins max = 219 = 524 288 combinaisons

Bouton (numerotation)

Vue de dessus :

B1
B2
B3
B4

Connexions internes

B1 est relie a B3
B2 est relie a B4

Branchement

Cote Bouton

(ou equivalent : B3 → Pin GND et B4 → Pin 2)

Cote Arduino + LED

LED - Comment reconnaitre LED+ et LED– ?

Vue reelle

plat = LED– longue = LED+ courte = LED–

Vue Tinkercad

LED– gauche LED+ droite
  • LED+ (droite / patte longue) → Pin 13
  • LED– (gauche / patte courte) → Resistance → Pin GND

Sur Tinkercad : gauche = LED– / droite = LED+

Schema logique

Pin 2 ─── B2 (Bouton) ─── B1 ─── Pin GND

Pin 13 ─── LED+ ─── LED– ─── Resistance ─── Pin GND

Schema visuel

Arduino UNO P2 Pin 2 P13 Pin 13 GND Pin GND GND Pin GND Bouton B1 B2 B3 B4 LED LED+ LED- 220 Ohm B2 --> LED+ --> B1 : fil direct --> Resistance sortie : fil par le bas --> Resistance entree --> Signal (vert) GND (rouge) Resistance Connexion interne

Programme 1 : LED allumee tant qu'on appuie

La LED s'allume quand on maintient le bouton, et s'eteint quand on relache.

int bouton = 2;
int led = 13;

void setup() {
  pinMode(bouton, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  if (digitalRead(bouton) == LOW) {
    digitalWrite(led, HIGH);
  } else {
    digitalWrite(led, LOW);
  }
}

Programme 2 : Appui = allume / Re-appui = eteint (toggle)

Un appui allume la LED et elle reste allumee. Un deuxieme appui l'eteint. Comme un interrupteur.

int bouton = 2;
int led = 13;

bool etatLed = false;        // LED eteinte au depart
bool dernierAppui = HIGH;    // etat precedent du bouton

void setup() {
  pinMode(bouton, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  bool appui = digitalRead(bouton);

  // On detecte le moment ou on appuie (passage HIGH -> LOW)
  if (appui == LOW && dernierAppui == HIGH) {
    etatLed = !etatLed;           // inverser l'etat de la LED
    digitalWrite(led, etatLed);   // appliquer le nouvel etat
    delay(200);                   // anti-rebond (evite les faux appuis)
  }

  dernierAppui = appui;  // memoriser l'etat du bouton
}

Programme 3 : Double appui = clignotement

1 appui = allume ou eteint la LED. 2 appuis rapides (moins de 500ms) = la LED clignote. Re-double appui = arrete le clignotement.

int bouton = 2;
int led = 13;

bool dernierEtat = HIGH;
int compteurAppui = 0;
unsigned long premierAppui = 0;
bool clignote = false;

unsigned long dernierClignote = 0;
bool ledAllumee = false;

void setup() {
  pinMode(bouton, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  bool etat = digitalRead(bouton);

  // Detecter un nouvel appui (HIGH -> LOW)
  if (etat == LOW && dernierEtat == HIGH) {
    delay(50);  // anti-rebond

    compteurAppui++;

    if (compteurAppui == 1) {
      premierAppui = millis();
    }
  }

  dernierEtat = etat;

  // 2 appuis en moins de 1 seconde = activer/desactiver clignotement
  if (compteurAppui >= 2) {
    if (millis() - premierAppui < 500) {
      clignote = !clignote;  // toggle clignotement
      if (!clignote) {
        digitalWrite(led, LOW);  // eteindre si on arrete
      }
    }
    compteurAppui = 0;
  }

  // 1 seul appui et 1 seconde passee = toggle allume/eteint
  if (compteurAppui == 1 && millis() - premierAppui > 500) {
    compteurAppui = 0;
    if (clignote) {
      // Si on clignote, un simple appui arrete et eteint
      clignote = false;
      digitalWrite(led, LOW);
    } else {
      // Toggle normal : allume ou eteint
      ledAllumee = !ledAllumee;
      digitalWrite(led, ledAllumee);
    }
  }

  // Clignotement rapide sans bloquer
  if (clignote) {
    if (millis() - dernierClignote > 100) {
      ledAllumee = !ledAllumee;
      digitalWrite(led, ledAllumee);
      dernierClignote = millis();
    }
  }
}

Programme 4 : Appui long (2s) = allume 5s puis eteint 1s

Si on reste appuye plus de 2 secondes, la LED s'allume pendant 5 secondes puis s'eteint pendant 1 seconde, en boucle. Un appui normal arrete le cycle.

int bouton = 2;
int led = 13;

bool dernierAppui = HIGH;
unsigned long debutAppui = 0;  // quand on a commence a appuyer
bool boutonEnfonce = false;    // le bouton est maintenu ?
bool cyclage = false;          // mode 5s allume / 1s eteint actif ?

void setup() {
  pinMode(bouton, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  bool appui = digitalRead(bouton);

  // On detecte le moment ou on appuie
  if (appui == LOW && dernierAppui == HIGH) {
    debutAppui = millis();
    boutonEnfonce = true;

    // Si le cyclage est actif, un appui l'arrete
    if (cyclage) {
      cyclage = false;
      digitalWrite(led, LOW);
      delay(200);
      dernierAppui = appui;
      return;
    }
  }

  // On detecte le moment ou on relache
  if (appui == HIGH && dernierAppui == LOW) {
    boutonEnfonce = false;
  }

  // Si on maintient le bouton plus de 2 secondes
  if (boutonEnfonce && millis() - debutAppui > 2000) {
    boutonEnfonce = false;
    cyclage = true;
  }

  // Mode cyclage : 5s allume, 1s eteint
  if (cyclage) {
    digitalWrite(led, HIGH);   // allume 5 secondes
    for (int i = 0; i < 50; i++) {
      delay(100);
      // Verifier si on appuie pour arreter
      if (digitalRead(bouton) == LOW) {
        cyclage = false;
        digitalWrite(led, LOW);
        delay(200);
        dernierAppui = HIGH;
        return;
      }
    }

    digitalWrite(led, LOW);    // eteint 1 seconde
    for (int i = 0; i < 10; i++) {
      delay(100);
      // Verifier si on appuie pour arreter
      if (digitalRead(bouton) == LOW) {
        cyclage = false;
        delay(200);
        dernierAppui = HIGH;
        return;
      }
    }
  }

  dernierAppui = appui;
}

Arduino - Bouton + 2 LEDs

Objectif

Controler 2 LEDs avec un seul bouton : 1er appui = LED 1 s'allume, 2e appui = LED 2 s'allume, 3e appui = tout s'eteint.

Materiel

Branchement

Cote Bouton

Cote Arduino + LEDs

Schema logique

Pin 2 ─── B2 (Bouton) ─── B1 ─── Pin GND

Pin 12 ─── LED rouge + ─── LED rouge - ─── Resistance ─── Pin GND

Pin 13 ─── LED verte + ─── LED verte - ─── Resistance ─── Pin GND

Schema visuel

Arduino UNO P2 Pin 2 P12 Pin 12 P13 Pin 13 GND Pin GND GND Pin GND Bouton B1 B2 B3 B4 LED rouge LED+ LED- LED verte LED+ LED- 220 Ohm 220 Ohm B2 --> LED rouge+ --> LED verte+ --> B1 --> Resistances (par le bas) --> Resistance 1 --> Resistance 2 --> Signal (vert) GND (rouge) Resistance Connexion interne

Tableau des etats

Appui LED rouge (Pin 12) LED verte (Pin 13)
Etat initial OFF OFF
1er appui ON OFF
2e appui ON ON
3e appui OFF OFF
4e appui Retour au 1er appui (cycle) ...

Programme 1 : 2 LEDs sequentielles

1er appui = LED rouge s'allume. 2e appui = LED verte s'allume aussi. 3e appui = tout s'eteint. Et ca recommence.

int bouton = 2;
int ledRouge = 12;
int ledVerte = 13;

bool dernierAppui = HIGH;
int etape = 0;  // 0 = tout eteint, 1 = rouge, 2 = rouge + verte

void setup() {
  pinMode(bouton, INPUT_PULLUP);
  pinMode(ledRouge, OUTPUT);
  pinMode(ledVerte, OUTPUT);
}

void loop() {
  bool appui = digitalRead(bouton);

  // Detecter le moment ou on appuie (HIGH -> LOW)
  if (appui == LOW && dernierAppui == HIGH) {
    etape++;

    if (etape == 1) {
      // 1er appui : allumer LED rouge
      digitalWrite(ledRouge, HIGH);
    }
    else if (etape == 2) {
      // 2e appui : allumer LED verte (rouge reste allumee)
      digitalWrite(ledVerte, HIGH);
    }
    else {
      // 3e appui : tout eteindre et recommencer
      digitalWrite(ledRouge, LOW);
      digitalWrite(ledVerte, LOW);
      etape = 0;
    }

    delay(200);  // anti-rebond
  }

  dernierAppui = appui;
}

Programme 2 : Double appui = clignotement / Triple appui = clignotement alterne

1 appui = allume/eteint les LEDs en sequence (comme programme 1).
2 appuis rapides = les 2 LEDs clignotent ensemble.
3 appuis rapides = les LEDs clignotent chacune leur tour (alternance).
Re-double ou re-triple appui = arrete le clignotement.

int bouton = 2;
int ledRouge = 12;
int ledVerte = 13;

bool dernierEtat = HIGH;
int compteurAppui = 0;
unsigned long premierAppui = 0;

// Modes : 0 = normal, 1 = clignote ensemble, 2 = clignote alterne
int mode = 0;
int etape = 0;  // pour le mode normal (0, 1, 2)

unsigned long dernierClignote = 0;
bool ledEtat = false;

void setup() {
  pinMode(bouton, INPUT_PULLUP);
  pinMode(ledRouge, OUTPUT);
  pinMode(ledVerte, OUTPUT);
}

void loop() {
  bool etat = digitalRead(bouton);

  // Detecter un nouvel appui (HIGH -> LOW)
  if (etat == LOW && dernierEtat == HIGH) {
    delay(50);  // anti-rebond

    compteurAppui++;

    if (compteurAppui == 1) {
      premierAppui = millis();
    }
  }

  dernierEtat = etat;

  // 3 appuis en moins de 800ms = clignotement alterne
  if (compteurAppui >= 3 && millis() - premierAppui < 800) {
    compteurAppui = 0;
    if (mode == 2) {
      // Deja en alterne : arreter
      mode = 0;
      etape = 0;
      digitalWrite(ledRouge, LOW);
      digitalWrite(ledVerte, LOW);
    } else {
      // Activer clignotement alterne
      mode = 2;
    }
    return;
  }

  // 2 appuis en moins de 500ms = clignotement ensemble
  if (compteurAppui >= 2 && millis() - premierAppui < 500) {
    compteurAppui = 0;
    if (mode == 1) {
      // Deja en clignotement : arreter
      mode = 0;
      etape = 0;
      digitalWrite(ledRouge, LOW);
      digitalWrite(ledVerte, LOW);
    } else {
      // Activer clignotement ensemble
      mode = 1;
    }
    return;
  }

  // 1 seul appui et delai depasse = action normale
  if (compteurAppui == 1 && millis() - premierAppui > 800) {
    compteurAppui = 0;

    // Si on est en mode clignotement, un simple appui arrete
    if (mode != 0) {
      mode = 0;
      etape = 0;
      digitalWrite(ledRouge, LOW);
      digitalWrite(ledVerte, LOW);
      return;
    }

    // Mode normal : cycle sequentiel
    etape++;
    if (etape == 1) {
      digitalWrite(ledRouge, HIGH);
    }
    else if (etape == 2) {
      digitalWrite(ledVerte, HIGH);
    }
    else {
      digitalWrite(ledRouge, LOW);
      digitalWrite(ledVerte, LOW);
      etape = 0;
    }
  }

  // Mode 1 : clignotement ensemble (les 2 en meme temps)
  if (mode == 1) {
    if (millis() - dernierClignote > 200) {
      ledEtat = !ledEtat;
      digitalWrite(ledRouge, ledEtat);
      digitalWrite(ledVerte, ledEtat);
      dernierClignote = millis();
    }
  }

  // Mode 2 : clignotement alterne (une puis l'autre)
  if (mode == 2) {
    if (millis() - dernierClignote > 200) {
      ledEtat = !ledEtat;
      digitalWrite(ledRouge, ledEtat);
      digitalWrite(ledVerte, !ledEtat);
      dernierClignote = millis();
    }
  }
}