Ardu? No!Initiation ≫ Test conditionnel if

Test conditionnel if

Pour l'instant on affichait tous les nombres à la même vitesse. Mais en observant le jeu de cache-cache des enfants on se rend vite compte qu'au début on compte lentement, puis au bout d'un moment on compte le plus vite possible. Nous allons faire pareil.

Notre but est de compter de 1 à 10 avec un temps de une seconde entre chaque nombre, puis à partir de 10, on va compter sans mettre d'attente. Pour cela il nous faut faire un test. En français on dirait "si je viens de dire un nombre plus petit que 10, alors j'attends une seconde". Notez que le alors ne sert pas à grand chose, et en C, on ne le met pas.

if

Pour les tests la première syntaxe est la suivante:

if (<condition>) instruction;

if c'est la traduction de si en anglais. La condition se met entre parenthèses, elle peut être simple ou complexe. Et si la condition est vraie, on exécutera l'instruction qui suit. Bien sûr l'instruction est ignorée si la condition est fausse. Pour cette étape, l'instruction sera unique, nous verrons bientôt comment faire pour exécuter tout un code.

La condition

La condition doit être vraie ou fausse. Nous allons commencer par les conditions les plus simples du style a=b, a>b...

Pas de chance, le symbole = est déjà pris pour les affectations. Si on veut tester si cacheCache est égal ou pas à 10 et que l'on écrit:

cacheCache = 10

le compilateur comprendra que l'on veut mettre 10 dans cacheCache et ne fera pas le test. C'est une erreur très habituelle qui n'est pas signalée par le compilateur (il comprend en fait autre chose). Pour le test d'égalité, on écrira == , par exemple (a == b). Une pratique habituelle (celle de l'IDE notamment) consiste à mettre un espace de chaque côté des symboles de comparaisons (et aussi d'ailleurs des affectations). Sur les claviers, nous avons les symboles < et > mais nous n'avons pas ≤ et ≥. Nous taperons <= ou >= à la place. Les tests de base sont:

==égal
<inférieur
<=inférieur ou égal
>supérieur
>=supérieur ou égal
!=non égal (différent)

Ah! Une chose qui peut paraître évidente, mais que je vais quand même signaler: pour chaque parenthèse ouvrante, il y a une parenthèse fermante correspondante, et c'est pareil pour les accolades ou les crochets. Avec l'IDE (et certains éditeurs de texte), si vous placez le curseur avant ou après une accolade, on vous indique la copine. Tout ceci a un corollaire, il doit y avoir autant de parenthèses ouvrantes que de parenthèses fermantes.

Compter comme un enfant

Nous avons tout ce qu'il nous faut pour compter lentement d'abord, puis rapidement. On reprend un programme des étapes précédentes, et au lieu d'attendre systématiquement (sans condition) une seconde, nous allons attendre une seconde si cacheCache est inférieure à 10. J'ai exprimé en français en mettant la condition après, mais en C, le if doit être en premier.

Changez donc la ligne:

delay(1000);

par:

if (cacheCache < 10) delay(1000);

Cela devrait fonctionner. On peut aussi donner comme condition (cacheCache <= 9) ou (10 > cacheCache)...

Ne mettez pas de point-virgule derrière la condition, sauf pour vérifier ce que j'affirme! En écrivant

if (cacheCache < 10); delay(1000);

Le compilateur va comprendre qu'il y a une instruction vide derrière la condition qui sera exécutée ou pas (comme elle est vide cela ne change rien!). Puis le if est terminé, et le delay(1000); sera exécuté dans tous les cas, car il n'est plus dans la condition.

if ... else

Après 10, cela va trop vite! Jamais les enfants ne vont à cette vitesse. Nous allons rectifier le tir. Nous allons attendre une seconde en dessous de 10 et 0,3 secondes après. Content?

Vous avez une solution avec ce que l'on a vu, c'est de mettre systématiquement un délai de 0,3s et (avant ou après) une attente de 0,7s si le nombre affiché était inférieur à 10. Cela fonctionne, mais nous allons voir une autre solution. En français cela peut faire pour le délai: si le nombre est inférieur à 10, j'attends 1s, sinon j'attends 0,3s La nouvelle syntaxe sera:

if (<condition>) instruction1;
else instruction2;

En C cela va faire:

if (cacheCache < 10) delay(1000);
else delay(300);

A vous d'essayer. Aide?int cacheCache; void setup() { Serial.begin(115200); } void loop() { Serial.println(cacheCache++); if (cacheCache < 10) delay(1000); else delay(300); }