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.
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ÉE | pinMode(13, INPUT); | Met la broche en écoute (une fois, dans la configuration) |
| régler la broche 7 en SORTIE | pinMode(7, OUTPUT); | Permet à la broche de fournir une tension |
| lire la broche 13 | digitalRead(13) | Renvoie HIGH (1) ou LOW (0) |
| écrire HAUT sur la broche 7 | digitalWrite(7, HIGH); | Met 5 V sur la broche, la LED s'allume |
| lecture analogique A0 | analogRead(A0) | Renvoie un nombre de 0 à 1023 |
| si … faire … sinon | if (…) { … } 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.
| Composant | Se branche sur | Broche Arduino Uno |
|---|---|---|
| Bouton, patte 1 | Directement | 5V |
| Bouton, patte 2 (en diagonale) | Directement | D13 |
| Résistance 10 kΩ (pull-down) | Entre D13 et GND | D13 – GND |
| Patte longue de la LED (anode) | À travers une résistance de 220 Ω | D7 |
| Patte courte de la LED (cathode) | Directement | GND |
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 ».

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}
13Mets 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 bloc | C++ | Signification | Exemple tiré des projets |
|---|---|---|---|
| = | == | égal à | digitalRead(13) == HIGH (LED avec bouton, Push) |
| ≠ | != | différent de | button != lastButton (allumer et éteindre une LED) |
| < | < | inférieur à | value < 50 (veilleuse avec LDR) |
| > | > | supérieur à | distance > minDistance (distance HC-SR04) |
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.

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| Bloc | Ligne C++ | Rôle |
|---|---|---|
| déclarer entier (int) ledState = 0 | int ledState = 0; | Mémorise l'état de la LED |
| déclarer entier (int) lastButton = 0 | int lastButton = 0; | Mémorise la lecture précédente du bouton |
| définir button à lire la broche 13 | int button = digitalRead(13); | Lit l'état actuel du bouton |
| si button ≠ lastButton | if (button != lastButton) { | Entre si l'état du bouton a changé |
| si button = 1 | if (button == 1) { | Entre si le changement est un appui (0 vers 1) |
| définir ledState à non ledState | ledState = !ledState; | Transforme 0 en 1 et 1 en 0 |
| écrire ledState sur la broche 7 | digitalWrite(7, ledState); | Met la LED dans le nouvel état |
| attendre 50 ms | delay(50); | Saute le rebond du contact |
| définir lastButton à button | lastButton = 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.
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.

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}
18Selon 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
| Erreur | Symptôme | Solution |
|---|---|---|
| Pas de résistance de pull-down | La LED scintille toute seule et s'allume quand la main approche | Mets 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 bouton | Utilise == pour comparer |
| Point-virgule à la fin de la ligne if | Le code entre accolades s'exécute à chaque tour quelle que soit la condition | Supprime le ; après if (…) |
| Pattes du bouton du même côté | La broche lit toujours HIGH ou toujours LOW | Utilise des pattes en diagonale |
| lastButton pas mis à jour ou pas d'attente | La LED clignote pendant l'appui ou finit au hasard | Ajoute lastButton = button et l'attente de 50 ms |
| Prendre HIGH pour appuyé avec INPUT_PULLUP | La LED marche à l'envers et s'allume au relâchement | Avec le pull-up interne, LOW veut dire appuyé |
| Seuil de la LDR inadapté à la pièce | La LED ne s'allume jamais ou reste allumée | Observe 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.
Projets à réaliser après cet article
Voir tous les projets
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

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

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'

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

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.

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.

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

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
Autres articles
Application BlueGrays
Réalise ce montage pas à pas sur ton téléphone
Schéma, code et liste des composants sur un seul écran. Plus de 200 projets Arduino, ESP32 et Pico à réaliser.
Scanne avec ton téléphone
Pointe l’appareil photo vers le code : la boutique d’applications de ton téléphone s’ouvre.
ou ouvre la boutique

