LOCODUINO

Instructions conditionnelles : le if ... else

.
Par : Jean-Luc

DIFFICULTÉ :

Dans « La programmation, qu’est ce que c’est », nous avons vu un premier programme très simple permettant de faire clignoter une DEL. Comparé à de l’électronique classique, ce n’est pas vraiment un grand pas en avant. Si la force des micro-contrôleurs est justement de permettre de faire des choses beaucoup plus complexes que ce qui est faisable en électronique classique, cette complexité se traduit forcément par un programme plus élaboré. Une des briques de base est la capacité d’exécuter les instructions selon une condition.

Un premier exemple simple d’utilisation du if

Pour prendre un exemple concret, supposons que vous vouliez que l’Arduino signale sur une DEL la présence d’un train dans une gare cachée. Les constituants de ce système sont :

  • bien évidemment un Arduino ;
  • un capteur qui va donner une information de nature tout ou rien : le train est présent ou il ne l’est pas ;
  • la DEL qui permet de signaler la présence du train.

Le capteur fournit la condition : le train est présent. La série d’instructions à exécuter correspond à on allume la DEL.

L’instruction permettant d’allumer la DEL si le train est présent est le if ... else, « si ... sinon » en français. La syntaxe générale est la suivante :

if (condition) {
    // instruction(s) exécutée(s) si la condition est vraie
}
else {
    // instruction(s) exécutée(s) si la condition est fausse
}

Si il n’est pas nécessaire d’exécuter une série d’instruction si la condition est fausse, il suffit d’omettre la partie else comme ceci :

if (condition) {
    // instruction(s) exécutée(s) si la condition est vraie
}
Notez bien les paires d’accolades ouvrantes et fermantes qui délimitent les séries d’instructions. Notez également les parenthèses autour de la condition.
 

Pour revenir à notre système, supposons que le capteur soit connecté à la broche 2 de l’Arduino et qu’il fournisse HIGH, c’est à dire 5V, si le train est présent et LOW, c’est à dire 0V, si il n’est pas présent. La condition pour allumer la DEL est donc que le capteur fournisse HIGH.

Pour commencer en respectant les bonnes pratiques, définissons la constante pinCapteur et donnons lui la valeur 2.

const byte pinCapteur = 2;

Evidemment pour que tout cela puisse fonctionner il faut que la broche 2 soit programmée en entrée et que le programme lise la valeur fournie par le capteur. Nous avons déjà vu dans « La programmation, qu’est ce que c’est » comment programmer une broche en sortie pour allumer une DEL et comment écrire une valeur sur cette broche. Ici nous devons faire l’inverse. Pour programmer la broche 2 en entrée, la fonction pinMode(...) est également employée mais son second argument doit être INPUT, « entrée » au lieu de OUTPUT. Ceci vient se loger dans setup() :

void setup() {
    pinMode(pinCapteur, INPUT);
}

Pour lire la valeur fournie par le capteur, nous allons utiliser la fonction digitalRead(...). L’unique argument de digitalRead(...) est le numéro de broche. Jusqu’ici nous n’avons vu que des fonctions qui ne retournent aucune valeur, c’est à dire dont le type est void. digitalRead(...) retourne une valeur, un int, qui est l’état de la broche, HIGH ou LOW [1].

Dans notre cas, la condition du if est une simple comparaison, on veut comparer la valeur renvoyer par digitalRead(pinCapteur) avec HIGH. La condition est vraie si les deux sont identiques. Cette comparaison est effectuée avec l’opérateur == [2]. Ainsi :

digitalRead(pinCapteur) == HIGH

sera vrai si digitalRead(pinCapteur) retourne HIGH et faux si il retourne LOW.

Sous le capot. On a parlé de vrai ou faux. Sur l’Arduino, deux constantes sont définies et disponible : true (vrai) et false (faux). Un type boolean [3] existe également. Toutefois, il s’agit en fait de nombres. false vaut 0 et true vaut 1. Une comparaison retourne donc un nombre, 0 ou 1

Vous savez déjà allumer une DEL, le programme complet est :

const byte pinCapteur = 2; // le capteur est connecté sur la broche 2
const byte pinDEL = 13;    // on utilise la DEL de la carte sur la broche 13
 
void setup() {
    pinMode(pinCapteur, INPUT); // on veut lire le capteur
    pinMode(pinDEL, OUTPUT);  // on veut piloter la DEL
}
 
void loop() {
    if (digitalRead(pinCapteur) == HIGH) { // si un train est détecté
        digitalWrite(pinDEL, HIGH);   // allume la DEL
    }
    else { // sinon
        digitalWrite(pinDEL, LOW);   // éteint la DEL
    }
}

Les if imbriqués

le if étant une instruction, il peut tout à fait être utilisé à l’intérieur d’un autre if. Supposons que notre capteur ait des sautes d’humeur, de temps en temps il déraille et envoie de courtes impulsions de moins de 10ms comme si un train était présent alors que ce n’est pas le cas. Ce genre de problème arrive plus souvent qu’on ne croit.

Pour corriger ce problème, il suffit de lire une seconde fois le capteur après un délai de 10ms et si il renvoie à nouveau HIGH alors il y a bien un train. sinon ce n’est pas le cas [4]. loop() deviendrait donc :

void loop() {
    if (digitalRead(pinCapteur) == HIGH) {
        // si un train est détecté
        // on attend 10 ms avant de vérifier que
        // ce n'est pas une détection erronée
        delay(10); 
        if (digitalRead(pinCapteur) == HIGH) {
            // le train est toujours là, allume la DEL
            digitalWrite(pinDEL, HIGH);   
        }
        else {
            // sinon, éteint la DEL
            digitalWrite(pinDEL, LOW);   
        }
    }
    else {
        // sinon, éteint la DEL
        digitalWrite(pinDEL, LOW);
    }
}

Les opérateurs de comparaison

Nous venons de voir l’égalité, l’opérateur ==, il existe d’autres opérateurs de comparaison.

!= est l’opérateur différent de. La comparaison est vraie si les deux opérandes sont différents. On peut par exemple écrire digitalRead(pinCapteur) != LOW comme ceci :

if (digitalRead(pinCapteur) != LOW) { // le train est toujours là
    digitalWrite(pinDEL, HIGH);   // allume la DEL
}
else { // sinon
    digitalWrite(pinDEL, LOW);   // éteint la DEL
}

> est l’opérateur supérieur à. La comparaison est vraie si le le premier opérande est plus grand que le second opérande.

>= est l’opérateur supérieur ou égal à. La comparaison est vraie si le le premier opérande est plus grand que ou égal au second opérande.

< est l’opérateur inférieur à. La comparaison est vraie si le le premier opérande est plus petit que le second opérande.

<= est l’opérateur inférieur ou égal à. La comparaison est vraie si le le premier opérande est plus petit que ou égal au second opérande.

Les opérateurs logiques

On peut composer les comparaisons avec des opérateurs logiques. Par exemple, si nous avons maintenant deux capteurs, l’un branché sur pinCapteur1 et l’autre sur pinCapteur2 et que nous voulons allumer la DEL si les deux capteurs renvoient HIGH tous les deux en même temps, nous écrirons :

if (digitalRead(pinCapteur1) == HIGH && digitalRead(pinCapteur2) == HIGH) {
    digitalWrite(pinDEL, HIGH);   // allume la DEL
}
else { // sinon
    digitalWrite(pinDEL, LOW);   // éteint la DEL
}

&& est donc le et logique. La condition est vraie si les deux opérandes sont vrais. Dans tous les autres cas, la condition est fausse.

|| est le ou logique. La condition est vraie si l’un des deux ou les deux opérandes sont vrais. Lorsque les deux opérandes sont faux, la condition est fausse.

! est l’opérateur de négation. Si son unique opérande est vrai, la condition est fausse et inversement. Par exemple, disposant de 3 capteurs branchés sur pinCapteur1, pinCapteur2 et pinCapteur2, on peut allumer si le premier et le deuxième sont HIGH ou si le troisième est LOW, on écrirait :

if ((digitalRead(pinCapteur1) == HIGH && digitalRead(pinCapteur2) == HIGH)
    || digitalRead(pinCapteur3) == LOW)
{
    digitalWrite(pinDEL, HIGH);   // allume la DEL
}
else { // sinon
    digitalWrite(pinDEL, LOW);   // éteint la DEL
}

Bien que dans les exemples nous nous soyons limités à la comparaison du résultat renvoyé par digitalRead(...) à une constante, HIGH ou LOW, cela ne signifie pas que les opérateurs de comparaison et les opérateurs logiques se limitent à ça. Tout résultat de fonction, toute constante, toute variable, peuvent être employés à gauche ou à droite des opérateurs présentés.

Une comparaison retournant un nombre, 0 ou 1, les opérateurs logiques opèrent donc sur des nombres. En réalité, tout nombre différent de 0 est compris comme vrai et tout nombre égal à 0 est compris comme faux. Toutefois une bonne pratique consiste à ne pas trop mélanger les booléens avec les entiers et éviter de faire de l’arithmétique avec les opérateurs logiques.

Dans le prochain article, nous verrons une autre instruction conditionnelle : le switch.

La suite de la série d’articles avec « Calculer avec l’Arduino (1) ». Si ce n’est pas déjà fait lisez également « La programmation, qu’est ce que c’est » et « Types, constantes et variables ».

[1Sous le capot, LOW vaut et HIGH vaut 1.

[2et non = tout seul qui est l’affectation, attention c’est une erreur fréquente.

[3Nommé ainsi d’après George Boole, mathématicien anglais du 19e siècle, créateur de la logique moderne.

[4Effectivement dans notre petit exemple, ça ne serait pas très grave de faire une fausse détection, on ne fait qu’allumer une DEL mais supposons maintenant que l’on manœuvre un aiguillage.

12 Messages

  • Instructions conditionnelles : le if ... else 27 novembre 2014 05:31, par james

    bonjour
    merci c’est très pédagogique : un vrai plaisir de vous lire et au final de comprendre
    j’attends avec impatience un article sur les capteurs ds la rubrique "composants" ...
    bonne journée

    Répondre

  • Instructions conditionnelles : le if ... else 28 novembre 2014 23:16, par Vauban38

    Clair, net, imagé et progressif ! que demander de mieux ?

    L’art de donner envie d’en savoir plus.....

    Bravo !

    Répondre

  • Instructions conditionnelles : le if ... else 11 janvier 2016 21:20, par dudule

    je suis très content de ce forum.
    je peux enfin faire autre chose que du ladder, il y a très longtemps que je cherche à faire ce genre de programmation et là je dois dire que je m’éclate avec l’aide des ardouineurs confirmés.
    merci à vous tous
    G arsac

    Répondre

  • le compteur ???? 5 février 2016 23:54, par dudule

    bonjour
    j’aimerais si possible faire du comptage à partir d’une entrée sur l’arduino.
    quelqu’un peut’il me venir en aide, je ne trouves pas la solution pour écrire cette fonction
    G A

    Répondre

    • le compteur ???? 11 juin 2016 08:02, par cardeaud

      Bonjour
      je rèponds tardivement mais cela servira à d’autres j’espère

      Chaque fois que j’appuie sur un bouton val vaut 1
      compteur = compteur + 1
      je remets val à 0
      reste à lire val qui est une variable oú à exécuter la suite du programme

      c’est le principe du compteur
      Si on veut un compteur automatique pour exécuter une boucle un certain nombre de fois il faut utiliser incrément.

      Répondre

  • programmer avec Arduino 15 mars 2016 18:03, par laisney

    Bravo pour votre site et vos explications

    je me lance dans l’Arduino et justement c’est pour gérer un réseau ferroviaire. je me suis déjà inscrit sur le site Locoduino.

    Encore bravo et merci

    Marc

    Répondre

  • Instructions conditionnelles : le if ... else 5 avril 2021 16:36, par Gaspard

    OOuuaaaww !!! Super tuto, très clair, très bien fait, et incroyablement utile..

    Répondre

  • Instructions conditionnelles : le if ... else 1er février 2022 13:08, par jean

    Bonjour, avec une sonde dht11 je mesure la température et l’humidité. J’affiche le résultat sur un lcd une ligne 16cars et je voudrais allumé 3 led une bleu quand le niveau humide dépasse 65% une verte entre 65% et 50% et une rouge en dessous de 50% en ne gardent qu’une led allumée. mais je rencontre un problème pour les leds.la bleu s’allume comme voulu,mais la verte reste alluméa plus de 65%, la verte s’allume comme voulu en dessous de 65%,la rouge s’allume comme voulu, et la verte ’s’éteint comme voulu en dessous de 50%. L’éclairage du lcd ne s’allume jamais. POUR LE LCD A UNE LIGNE ?? problème il n’y a pas moyen pour le configurer. mais sa marche comme ça.

    #include <dht11.h>
    #include <LiquidCrystal.h>

    dht11 DHT11 ; // create object of DHT11
    #define dhtpin 8 // set the pin to connect to DHT11
    const byte LEDB = 7 ;
    const byte LEDV = 9 ;
    const byte LEDR = 10 ;
    const byte ECL = 6 ; //commande éclairage LCD PASSE PAR 2N2222

    LiquidCrystal lcd(12, 11, 5, 4, 3, 2) ;

    void setup()
    pinMode(LEDB,OUTPUT) ;
    pinMode(LEDV,OUTPUT) ;
    pinMode(LEDR,OUTPUT) ;
    pinMode(ECL,OUTPUT) ;

    lcd.begin(16, 2) ;
    lcd.print("Initialisierung...") ;
    lcd.clear() ;
    digitalWrite(LEDB,LOW) ;
    digitalWrite(LEDV,LOW) ;
    digitalWrite(LEDR,LOW) ;
    digitalWrite(ECL,LOW) ;

    void loop()
    DHT11.read(dhtpin) ;// initialize the reading
    int humidity = DHT11.humidity ;// get humidity

    lcd.setCursor(2,0) ;
    lcd.print("T ") ;
    lcd.print((float)DHT11.temperature, 0) ;
    lcd.print("’C ") ;

    lcd.setCursor(2, 1) ;
    lcd.print("H ") ;
    lcd.print((float)DHT11.humidity,0) ;
    lcd.print("%") ;

    if(humidity>65)

    digitalWrite(LEDB,HIGH) ;
    digitalWrite(ECL,HIGH) ;
    digitalWrite(LEDV,LOW) ;

    else

    digitalWrite(LEDB,LOW) ;
    digitalWrite(ECL,LOW) ;
    digitalWrite(LEDV,HIGH) ;

    if(humidity<50)

    digitalWrite(LEDR,HIGH) ;
    digitalWrite(ECL,HIGH) ;
    digitalWrite(LEDV,LOW) ;

    else

    digitalWrite(LEDR,LOW) ;
    digitalWrite(ECL,LOW) ;
    digitalWrite(LEDV,HIGH) ;

    delay(2000) ;
    lcd.clear() ;

    float getTemp(char type)
    float temp = (float)DHT11.temperature ;//get temp

    if(type ==’F’)

    return temp * 1.8 + 32 ;// convert to fahrenheit
    else if(type ==’K’)

    return temp + 274.15 ;// convert to Kelvin
    else
    return temp ;

    Répondre

  • DHT11 1er février 2022 17:41, par msport

    Bonjour,

    comme expliqué dans l’article ci-dessous, votre question ne concerne pas le modélisme ferroviaire. Vous vous trompez de forum.

    Voyez plutôt : https://forum.arduino.cc/c/internat...

    Voir en ligne : Où et comment demander de l’aide ?

    Répondre

    • DHT11 1er février 2022 19:13, par Jean-Luc

      Tout à fait.

      Et votre code est faux. Si l’humidité est dans l’intervalle [50, 65], les deux else sont exécutés.

      Répondre

  • Instructions conditionnelles : le if ... else 29 octobre 2023 19:21, par Minjorin AKANKOSSI

    S’il vous plaît, montrer moi comment faire la condition for aussi
    Merci

    Répondre

Réagissez à « Instructions conditionnelles : le if ... else »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Programmation »

Les derniers articles

Les articles les plus lus