Allumer une LED lorsque l'on appuie sur un bouton.
Chaque pin controle 1 LED (ON/OFF). Formule : 2n combinaisons possibles.
| Pins | Formule | Combinaisons | Valeurs |
|---|---|---|---|
| 1 | 21 | 2 | 0 - 1 |
| 2 | 22 | 4 | 0 - 3 |
| 3 | 23 | 8 | 0 - 7 |
| 4 | 24 | 16 | 0 - 15 |
| 5 | 25 | 32 | 0 - 31 |
| 6 | 26 | 64 | 0 - 63 |
| 7 | 27 | 128 | 0 - 127 |
| 8 | 28 | 256 | 0 - 255 |
| 9 | 29 | 512 | 0 - 511 |
| 10 | 210 | 1024 | 0 - 1023 |
| 13 | 213 | 8192 | 0 - 8191 |
Exemple avec 7 LEDs : etat 42 = 0101010 en binaire
Arduino Uno : 13 pins digitaux + 6 analogiques = 19 pins max = 219 = 524 288 combinaisons
Vue de dessus :
(ou equivalent : B3 → Pin GND et B4 → Pin 2)
Vue reelle
Vue Tinkercad
Sur Tinkercad : gauche = LED– / droite = LED+
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);
}
}
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
}
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();
}
}
}
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;
}
Controler 2 LEDs avec un seul bouton : 1er appui = LED 1 s'allume, 2e appui = LED 2 s'allume, 3e appui = tout s'eteint.
| 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) | ... |
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;
}
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();
}
}
}