Bases · 12 min de lecture

Bloc si Arduino : bouton et LED avec if-else, en blocs et en C++

Bloc si Arduino avec bouton et LED : lire une broche, if-else, comparaisons =, ≠, <, >, conditions imbriquées, marche/arrêt, anti-rebond et veilleuse LDR.

Le bloc si sur Arduino permet à un programme de choisir entre deux chemins selon une question : « Le bouton est-il appuyé ? Si oui, allume la LED, sinon éteins-la. » En C++ Arduino, cette structure s'appelle if/else, et le bloc « si … faire … sinon » de la programmation par blocs BlueGrays en est l'équivalent exact. Dans cet article, tu vas utiliser un projet bouton et LED pour apprendre à régler une broche en entrée et à la lire, puis le bloc si, les opérateurs de comparaison, les conditions imbriquées et la façon de combiner deux conditions avec « et », bloc par bloc et ligne par ligne.

Cet article est la partie 3 de la série Des blocs au code. Dans la partie précédente, nous avons écrit notre premier programme et fait clignoter une LED avec des blocs ; dans la suivante, nous verrons les boucles et les variables.

Jusqu'ici, nos programmes faisaient toujours la même chose : la LED s'allumait, attendait, s'éteignait et attendait encore. Ils n'écoutaient jamais le monde extérieur. Avec les conditions, la carte décide en regardant un bouton, un capteur de lumière ou une distance qu'elle mesure, et c'est là que commence le vrai plaisir de la programmation robotique. Tous les exemples viennent de projets en blocs gratuits : tu peux ouvrir leurs blocs et leur code sur la page programmation par blocs ou dans l'appli et suivre en parallèle.

Entrée et sortie : dans quel sens travaille une broche ?

Les broches numériques d'Arduino font l'un de deux travaux. Une broche réglée en sortie fournit 5 V (HIGH) ou 0 V (LOW) ; c'est ainsi qu'on pilote une LED, un buzzer ou un relais. Une broche réglée en entrée ne fournit rien, elle écoute seulement la tension présente : sur un Arduino Uno, elle lit HIGH au-dessus d'environ 3 V et LOW en dessous de 1,5 V. En blocs, ce choix se fait dans la section de configuration : le bloc « régler la broche 13 en ENTRÉE » devient pinMode(13, INPUT); en C++, et « régler la broche 7 en SORTIE » devient pinMode(7, OUTPUT);. Pour lire la broche, on utilise le bloc « lire la broche 13 ». Il ne ressemble pas aux autres : ce n'est pas une commande qu'on empile, mais un bloc de valeur arrondi qui s'emboîte dans un emplacement d'un autre bloc. Son équivalent C++ est digitalRead(13), qui renvoie HIGH ou LOW. Comme HIGH vaut 1 et LOW vaut 0 sur Arduino, tu peux aussi ranger le résultat dans une variable comme un nombre. En bref, les blocs de commande font quelque chose, les blocs de valeur donnent un résultat, et l'emplacement de condition du bloc si ne se remplit qu'avec un tel résultat.

BlocÉquivalent C++Ce qu'il fait
régler la broche 13 en ENTRÉEpinMode(13, INPUT);Met la broche en écoute (une fois, dans la configuration)
régler la broche 7 en SORTIEpinMode(7, OUTPUT);Permet à la broche de fournir une tension
lire la broche 13digitalRead(13)Renvoie HIGH (1) ou LOW (0)
écrire HAUT sur la broche 7digitalWrite(7, HIGH);Met 5 V sur la broche, la LED s'allume
lecture analogique A0analogRead(A0)Renvoie un nombre de 0 à 1023
si … faire … sinonif (…) { … } else { … }Exécute l'un des deux chemins selon la condition

Câblage : bouton sur 13, LED sur 7, résistance pull-down obligatoire

Dans le projet Allumer une LED avec un bouton-poussoir (Push), le bouton est sur D13 et la LED sur D7. Une patte du bouton va au 5V, l'autre à D13, et une résistance de pull-down de 10 kΩ est placée entre D13 et GND. Bouton relâché, la résistance tire la broche vers GND et on lit LOW. Quand tu appuies, le 5V arrive directement sur la broche et on lit HIGH. Comme la résistance est grande, seul un demi-milliampère environ circule du 5V vers GND pendant l'appui. La patte longue de la LED va à D7 à travers une résistance de 220 Ω, la courte à GND.

ComposantSe branche surBroche Arduino Uno
Bouton, patte 1Directement5V
Bouton, patte 2 (en diagonale)DirectementD13
Résistance 10 kΩ (pull-down)Entre D13 et GNDD13 – GND
Patte longue de la LED (anode)À travers une résistance de 220 ΩD7
Patte courte de la LED (cathode)DirectementGND
Si tu oublies la résistance de pull-down, D13 n'est relié à rien quand le bouton est relâché ; on parle d'entrée flottante. La broche capte le bruit électrique, digitalRead() renvoie HIGH ou LOW au hasard et la LED scintille sans que tu touches à rien, voire s'allume quand ta main s'approche. Sur les boutons à quatre pattes, les deux pattes d'un même côté sont déjà reliées à l'intérieur : utilise donc des pattes en diagonale. Pour plus de détails, vois comment brancher un bouton sur Arduino et les résistances pull-up et pull-down.

Le bloc si et if/else : la LED s'allume tant que tu appuies

La version en blocs du projet comporte deux sections. Dans « configuration (une fois) », la broche 13 est réglée en ENTRÉE et la broche 7 en SORTIE. Dans « répéter indéfiniment », il n'y a qu'un seul grand bloc : si … faire … sinon. Son emplacement de condition hexagonal contient la comparaison « lire la broche 13 = HAUT ». Si la condition est vraie, le bloc « écrire HAUT sur la broche 7 » de la branche « faire » s'exécute ; sinon, c'est le bloc « écrire BAS sur la broche 7 » de la branche « sinon ».

Bloc si Arduino avec bouton et LED : blocs du projet Allumer une LED avec un bouton-poussoir (Push)
La broche 13 est en ENTRÉE et la broche 7 en SORTIE ; si la broche 13 lit HAUT la LED s'allume, sinon elle s'éteint.
C++ (Arduino IDE)
1void setup() {
2  pinMode(13, INPUT);    // Buton girişi (harici pull-down) / Button input (external pull-down)
3  pinMode(7, OUTPUT);    // LED çıkışı / LED output
4}
5
6void loop() {
7  if (digitalRead(13) == HIGH) {   // Buton basılı mı? / Is the button pressed?
8    digitalWrite(7, HIGH);         // Basılı: LED yanar / Pressed: LED on
9  } else {
10    digitalWrite(7, LOW);          // Bırakıldı: LED söner / Released: LED off
11  }
12}
13

Mets le code à côté des blocs et la correspondance saute aux yeux. Le mot if correspond à « si », la condition digitalRead(13) == HIGH entre parenthèses à l'emplacement de condition, la première paire d'accolades à la branche « faire », et else avec ses accolades à la branche « sinon ». Chaque bloc placé dans une branche devient une ligne entre les accolades correspondantes. Comme loop() tourne des dizaines de milliers de fois par seconde, la carte relit sans cesse le bouton ; dès que tu lèves le doigt, la condition est fausse au tour suivant et la LED s'éteint. D'où le nom « Push » : la LED ne reste allumée que tant que tu appuies. La branche « sinon » est facultative ; un bloc si avec seulement la branche « faire » devient un if sans else. Mais si tu supprimes la branche « sinon » ici, la LED ne s'éteint plus jamais une fois allumée, car il ne reste aucune ligne pour l'éteindre. Penser aux deux branches de chaque condition est une bonne habitude.

Blocs de comparaison : =, ≠, < et >

Signe dans le blocC++SignificationExemple tiré des projets
===égal àdigitalRead(13) == HIGH (LED avec bouton, Push)
≠!=différent debutton != lastButton (allumer et éteindre une LED)
<<inférieur àvalue < 50 (veilleuse avec LDR)
>>supérieur àdistance > minDistance (distance HC-SR04)
Le signe « = » du bloc de comparaison s'écrit == en C++. Un seul signe égal en C++ n'est pas une comparaison mais une affectation. Si tu écris if (button = 1), le compilateur ne t'arrête pas : button reçoit 1, le résultat est non nul, la condition est donc vraie à chaque tour et la LED s'allume sans jamais regarder le bouton. Avec les blocs, impossible de faire cette erreur, car l'affectation (« définir … à … ») et la comparaison sont des blocs séparés. Une fois passé au code, en revanche, c'est l'erreur la plus fréquente.

Marche/arrêt avec un bouton : si imbriqués et variable d'état

Dans le projet Push, la LED ne restait allumée que tant que tu maintenais le bouton. Pour qu'elle se comporte comme un vrai interrupteur, « un appui pour allumer, un autre pour éteindre », le programme doit retenir deux choses : si la LED est allumée en ce moment et ce que le bouton a lu au tour précédent. Le projet Allumer et éteindre une LED avec un bouton déclare pour cela deux entiers dans la section « variables globales (en haut) » : ledState (0 = éteinte, 1 = allumée) et lastButton (la lecture précédente). Le circuit reste le même : bouton sur D13 avec pull-down externe, LED sur D7.

Blocs du projet Allumer et éteindre une LED avec un bouton : si imbriqué, comparaison ≠ et bloc non
Le si extérieur repère un changement du bouton, le si intérieur vérifie qu'il s'agit d'un appui ; non ledState inverse l'état de la LED.
C++ (Arduino IDE)
1int ledState = 0;     // LED durumu: 0 = sönük, 1 = yanık / LED state: 0 = off, 1 = on
2int lastButton = 0;   // Butonun önceki okuması / Previous button reading
3
4void setup() {
5  pinMode(13, INPUT);   // Buton girişi (harici pull-down) / Button input (external pull-down)
6  pinMode(7, OUTPUT);   // LED çıkışı / LED output
7}
8
9void loop() {
10  int button = digitalRead(13);   // Butonu oku / Read the button
11  if (button != lastButton) {     // Buton durumu değişti / Button state changed
12    if (button == 1) {            // Yalnız basış anında (LOW -> HIGH) / Only at the press (LOW -> HIGH)
13      ledState = !ledState;       // Durumu ters çevir / Flip the state
14      digitalWrite(7, ledState);
15    }
16    delay(50);                    // Sıçramayı atlamak için kısa bekleme / Short wait to skip the bounce
17    lastButton = button;          // Bu okumayı sakla / Store this reading
18  }
19}
20
BlocLigne C++Rôle
déclarer entier (int) ledState = 0int ledState = 0;Mémorise l'état de la LED
déclarer entier (int) lastButton = 0int lastButton = 0;Mémorise la lecture précédente du bouton
définir button à lire la broche 13int button = digitalRead(13);Lit l'état actuel du bouton
si button ≠ lastButtonif (button != lastButton) {Entre si l'état du bouton a changé
si button = 1if (button == 1) {Entre si le changement est un appui (0 vers 1)
définir ledState à non ledStateledState = !ledState;Transforme 0 en 1 et 1 en 0
écrire ledState sur la broche 7digitalWrite(7, ledState);Met la LED dans le nouvel état
attendre 50 msdelay(50);Saute le rebond du contact
définir lastButton à buttonlastButton = button;Garde cette lecture pour le tour suivant

Le cœur du programme, ce sont les deux blocs si imbriqués. La condition extérieure button ≠ lastButton n'est vraie qu'au tour où l'état du bouton change ; pendant les milliers de tours où tu maintiens le bouton ou ne le touches pas, il ne se passe rien. Un changement peut aller dans deux sens : appui (0 vers 1) ou relâchement (1 vers 0). La condition intérieure button = 1 ne garde que l'appui. Ainsi la LED change une fois par appui et pas du tout au relâchement. Dans le code, les if imbriqués se voient aux accolades dans les accolades. En blocs, le si intérieur se loge dans la branche « faire » du si extérieur : on voit d'un coup d'œil quelle ligne dépend de quelle condition.

Le bloc non ledState s'écrit !ledState en C++. Le point d'exclamation donne le contraire logique : le contraire de 0 est 1, celui de tout nombre non nul est 0. Affecter à ledState son propre contraire inverse l'état à chaque appui. Le bloc suivant, « écrire ledState sur la broche 7 », correspond à la ligne digitalWrite(7, ledState) ; comme HIGH vaut 1 et LOW vaut 0, la valeur de la variable peut être écrite directement sur la broche. Enfin, lastButton reçoit la lecture de ce tour pour que la comparaison du tour suivant soit juste. Si tu oublies cette affectation, lastButton reste toujours à 0 ; tant que tu appuies, la condition extérieure est vraie à chaque tour et la LED clignote très vite.

Le bloc attendre 50 ms n'est pas décoratif, c'est une forme simple d'anti-rebond (debounce). Les contacts métalliques d'un bouton s'ouvrent et se ferment plusieurs fois pendant quelques millisecondes à l'appui ; la carte lit si vite qu'elle peut prendre un appui pour plusieurs, et la LED reste allumée ou éteinte au hasard. Attendre 50 ms après un changement laisse au rebond le temps de se calmer. Pendant que delay() attend, la carte ne peut rien faire d'autre ; pour temporiser sans bloquer le programme, lis millis() et delay().

Condition analogique : une veilleuse avec LDR

Les conditions ne servent pas qu'avec HIGH et LOW. Dans le projet Veilleuse avec LDR, le bloc « définir value à lecture analogique A0 » convertit la tension sur A0, où est branchée la LDR, en un nombre entre 0 et 1023 ; en C++, c'est la ligne value = analogRead(A0);. Le bloc si teste ensuite value < 50. Si la valeur est inférieure à 50, il fait sombre et la LED sur D13 s'allume ; sinon elle s'éteint. La structure est la même que dans le projet Push ; seule la comparaison dans l'emplacement de condition change.

Blocs du projet Veilleuse avec LDR : lecture analogique A0 et condition value < 50
Une lecture analogique donne un nombre de 0 à 1023 ; si value est inférieure à 50 la LED s'allume, sinon elle s'éteint.
C++ (Arduino IDE)
1int value;   // Işık okuması (0-1023) / Light reading (0-1023)
2
3void setup() {
4  pinMode(13, OUTPUT);   // LED çıkışı / LED output
5}
6
7void loop() {
8  value = analogRead(A0);   // Işık seviyesini oku / Read the light level
9
10  // Eşik 50: altı karanlık sayılır, hassasiyeti bu sayıyla ayarla
11  // Threshold 50: anything below counts as dark. Tune the sensitivity with this number
12  if (value < 50) {
13    digitalWrite(13, HIGH);   // Karanlık: LED yanar / Dark: LED on
14  } else {
15    digitalWrite(13, LOW);    // Aydınlık: LED söner / Bright: LED off
16  }
17}
18

Selon ta LDR et la résistance du circuit, le seuil de 50 peut être trop bas ou trop haut pour ta pièce. Pour trouver le bon nombre, utilise d'abord le projet Mesurer l'intensité lumineuse avec une LDR et observe dans le moniteur série les valeurs en pleine lumière et dans le noir, puis place le seuil entre les deux. Si la valeur oscille juste autour du seuil, la LED peut scintiller ; utiliser deux seuils distincts pour allumer et éteindre règle très bien le problème. Le fonctionnement d'une LDR est expliqué dans l'article capteur de lumière LDR.

Combiner des conditions : le bloc et et &&

Parfois, une seule condition ne suffit pas. Dans le projet HC-SR04 Mesure de la distance (affichage en série), la distance mesurée n'est affichée dans le moniteur série que si elle est comprise entre 3 cm et 100 cm. En blocs, deux comparaisons sont reliées côte à côte par un bloc et : « distance > minDistance et distance < maxDistance ». En C++, la ligne devient if (distance > minDistance && distance < maxDistance). L'opérateur && ne donne vrai que si les deux côtés sont vrais ; si un seul est faux, la condition est fausse. Les valeurs absurdes hors de la plage du capteur n'arrivent donc jamais à l'écran. En C++, « ou » s'écrit || et une seule condition vraie suffit. Tu peux tester les tables de vérité de ET, OU et NON avec l'outil portes logiques.

Les mêmes conditions sur ESP32 : pull-up interne et logique inversée

Le projet ESP32 Contrôle de LED avec bouton poussoir (Push) utilise le même bloc si sur un ESP32, avec deux différences. La LED est sur GPIO 5, le bouton sur GPIO 4, et la broche du bouton reçoit l'option d'entrée avec pull-up du bloc de broche. En C++, c'est pinMode(BUTTON_PIN, INPUT_PULLUP); : une résistance interne à la puce tire la broche vers HIGH, aucune résistance externe n'est nécessaire. Cette fois, le bouton va à GND, donc la broche lit LOW à l'appui et la condition devient « lire la broche BUTTON_PIN = BAS ». Le projet ESP32 Contrôle de LED avec bouton (Toggle) gère la marche/arrêt avec le bloc de temps écoulé, millis(), au lieu d'une attente de 50 ms, et relie encore deux conditions par un bloc et. Les broches de l'ESP32 fonctionnent en 3,3 V ; ne branche pas le bouton sur 5 V.

Erreurs fréquentes et solutions

ErreurSymptômeSolution
Pas de résistance de pull-downLa LED scintille toute seule et s'allume quand la main approcheMets 10 kΩ entre D13 et GND, ou utilise INPUT_PULLUP et inverse la logique
Un seul égal dans la condition : if (button = 1)La LED reste allumée et ignore le boutonUtilise == pour comparer
Point-virgule à la fin de la ligne ifLe code entre accolades s'exécute à chaque tour quelle que soit la conditionSupprime le ; après if (…)
Pattes du bouton du même côtéLa broche lit toujours HIGH ou toujours LOWUtilise des pattes en diagonale
lastButton pas mis à jour ou pas d'attenteLa LED clignote pendant l'appui ou finit au hasardAjoute lastButton = button et l'attente de 50 ms
Prendre HIGH pour appuyé avec INPUT_PULLUPLa LED marche à l'envers et s'allume au relâchementAvec le pull-up interne, LOW veut dire appuyé
Seuil de la LDR inadapté à la pièceLa LED ne s'allume jamais ou reste alluméeObserve la valeur dans le moniteur série et choisis un autre seuil

Ouvrir blocs et code côte à côte dans l'appli

Tous les projets de cet article font partie des projets en blocs gratuits de l'appli BlueGrays. Active l'interrupteur Voir en blocs dans la section code d'un projet et le code est remplacé par le même programme en blocs ; touche l'image pour l'ouvrir en plein écran. L'onglet Comprendre les blocs explique le programme étape par étape : chaque étape n'affiche que ses blocs et ce qu'ils font, ce qui permet de suivre les blocs si imbriqués un par un. Les exemples if/else et digitalRead du Guide du code existent aussi en blocs. Les blocs ne sont pas téléversés directement sur la carte et, pour l'instant, tu ne peux pas composer tes propres programmes en blocs ; sur la carte va toujours le vrai code C++ du projet, que tu copies dans l'Arduino IDE avant de le téléverser. Pour réviser, les Questions du jour te proposent 5 questions chaque jour, du niveau A1 au niveau C2.

Maintenant que tu maîtrises les conditions, l'étape suivante consiste à gérer répétitions et compteurs : dans la partie boucles et variables, tu verras le lien entre « répéter indéfiniment » et loop(), et entre le bloc de comptage et une boucle for. D'ici là, tu peux consulter dans l'appli BlueGrays le schéma et le code des projets LED avec bouton, veilleuse avec LDR et bouton sur ESP32, passer à la vue en blocs avec Voir en blocs et à l'explication pas à pas avec Comprendre les blocs.

Questions fréquentes

À quoi sert le bloc si en programmation par blocs ?

Le bloc si permet à un programme de prendre une décision : si la condition est vraie, les blocs de la branche « faire » s'exécutent ; sinon, ceux de la branche « sinon ». Dans les projets Arduino, on s'en sert surtout pour vérifier si un bouton est appuyé ou si la valeur d'un capteur a franchi un seuil. Son équivalent C++ est l'instruction if/else.

Quelle est la différence entre if et else sur Arduino ?

if exécute le code entre ses accolades quand la condition entre parenthèses est vraie. else est facultatif et contient le code qui ne s'exécute que si la condition est fausse. Sans else, rien ne se passe quand la condition est fausse et le programme passe à la ligne suivante.

Quelle est la différence entre = et == sur Arduino ?

Un seul signe égal (=) affecte une valeur à une variable, un double signe égal (==) compare deux valeurs. Écrire if (x = 1) met x à 1 et rend la condition toujours vraie ; la bonne écriture est if (x == 1). En blocs, le signe « = » du bloc de comparaison est traduit en == dans le code.

Pourquoi ma LED Arduino s'allume-t-elle sans appuyer sur le bouton ?

Le plus probable est que la broche du bouton est flottante, c'est-à-dire qu'il manque une résistance de pull-down ou de pull-up. La broche lit alors le bruit ambiant et paraît HIGH ou LOW au hasard. Place une résistance de 10 kΩ entre la broche et GND, ou utilise pinMode(broche, INPUT_PULLUP) et relie le bouton à GND.

Comment allumer et éteindre une LED avec un bouton sur Arduino ?

Garde l'état de la LED dans une variable (ledState) et la lecture précédente du bouton dans une autre (lastButton). Quand l'état du bouton change et que le nouvel état est appuyé, inverse l'état avec ledState = !ledState et écris-le sur la LED avec digitalWrite. Ajoute une courte attente, par exemple 50 ms, pour sauter le rebond ; le projet Allumer et éteindre une LED avec un bouton fait exactement cela.

Puis-je téléverser les blocs BlueGrays sur mon Arduino ?

Non, les blocs ne sont pas téléversés directement sur la carte. Ils correspondent ligne pour ligne au vrai code du projet et servent à comprendre le programme. Sur la carte, tu téléverses toujours le code C++ du projet en le copiant dans l'Arduino IDE.

Voir tous les projets
Allumer une LED avec un bouton-poussoir (Push)
#9Débutant

Allumer une LED avec un bouton-poussoir (Push)

Comme une sonnette : la lumière reste allumée tant que tu appuies et s'éteint quand tu relâches. L'Arduino surveille le bouton en permanence ; tant qu'il est enfoncé la LED est allumée, et dès que tu

4.8(113)
229
Allumer et éteindre une LED avec un bouton
#10Débutant

Allumer et éteindre une LED avec un bouton

Un appui et la lumière s'allume, un deuxième et elle s'éteint, exactement comme l'interrupteur de ta chambre. L'Arduino remarque chaque appui et fait passer la LED à l'état inverse, en attendant un co

4.8(100)
167
Veilleuse avec LDR
#12Débutant

Veilleuse avec LDR

Une petite veilleuse qui s'allume toute seule quand il fait nuit et s'éteint au matin. Un capteur de lumière mesure la clarté de la pièce, et l'Arduino allume la LED quand il fait assez sombre puis l'

4.8(102)
205
HC-SR04 Mesure de la distance (affichage en série)
#27Débutant

HC-SR04 Mesure de la distance (affichage en série)

Le capteur HC-SR04 fonctionne comme une chauve-souris qui trouve son chemin dans le noir : il envoie un son que tu ne peux pas entendre, écoute l'écho et mesure à quelle distance se trouve l'objet dev

4.6(46)
71
ESP32 Contrôle de LED avec bouton poussoir (Push)
#104Débutant

ESP32 Contrôle de LED avec bouton poussoir (Push)

La LED s'allume lorsque le bouton est enfoncé et s'éteint lorsqu'il est relâché. Montre comment la broche d'entrée numérique de l'ESP32 et la résistance pull-up interne sont utilisées. Grâce au mode INPUT_PULLUP, aucune résistance externe n'est nécessaire.

4.6(36)
55
ESP32 Contrôle de LED avec bouton (Toggle)
#105Débutant

ESP32 Contrôle de LED avec bouton (Toggle)

Chaque fois que l'on appuie sur le bouton, la LED change d'état : si elle est allumée, elle s'éteint, si elle est éteinte, elle s'allume. Modèle classique de basculement. Avec le debounce, nous nettoyons le bruit mécanique du bouton-poussoir pour garantir un seul basculement avec une seule pression.

4.6(39)
57
Mesurer l'intensité lumineuse avec une LDR
#11Débutant

Mesurer l'intensité lumineuse avec une LDR

Envie de voir en chiffres à quel point ta chambre est lumineuse ? Le LDR, une petite pièce sensible à la lumière, mesure la lumière ambiante, et l'Arduino écrit la valeur sur l'écran de ton ordinateur

4.6(81)
139
Clignotement d'une LED
#1Débutant

Clignotement d'une LED

Le tout premier bonjour de l'électronique : allumer et éteindre une seule LED. L'Arduino allume et éteint la LED à intervalles très courts, la lumière clignote donc rapidement. Tu vois de la façon la

4.6(188)
1127