Séance du 25 Octobre 2013
Arduino leçon 2 : la boucle for ()
Nous aborderons en même temps les tableaux (en anglais array[]).

Exemple de programme rudimentaire
Nous allons écrire un programme pour allumer successivement 4 LEDs.
Les anodes sont reliées aux pins 2, 9, 3, 5 d'Arduino, les cathodes à la masse via une résistance.
Je fais exprès de vous donner des numéros qui ne sont ni consécutifs ni croissants.
fonctions à utiliser
dans le setup :
- on déclare les 4 broches en sortie.
dans la boucle :
- on allume la première,
- on attend 1 seconde,
- on éteint la première et on allume la deuxième,
- et on continue jusqu'à la dernière.
le programme chenille_1
void setup {
|
1ère amélioration : utilisation d'un tableau
Imaginez qu'au lieu de 4 diodes on en utilise 54 pour utiliser toutes les broches d'Arduino.
La programme serait d'une longueur pénible.
On va étudier une méthode plus efficace. On définit un tableau qui contiendra les numéros des pins utilisées.
On le parcourera avec une boucle for().
La boucle forOn peut considérer "for" comme une fonction recevant 3 paramètres, même si ce n'est pas la vérité puisque ses paramètres
sont séparés par des points-virgules alors que ceux d'une vraie fonction le sont par des virgules simples.
|
Les tableauxLes tableaux sont des ensembles de variables de même catégorie (des int, des longs...)
|
Les comparaisonsLes comparaisons de 2 valeurs s'écrivent ainsi
|
// déclarations
int tablo[] = {2, 9, 3, 5, 2}; // noter l'élément ajouté à la fin
int i ;
void setup() {
for ( i=0 ; i<4 ; i=i+1) {
pinMode(tablo[i], OUTPUT);
}
Regardez bien comme on va chercher les éléments du tableau.
- tablo[0] vaut 2
- tablo[1] vaut 9
- tablo[2] vaut 3
- tablo[3] vaut 5
- tablo[4] vaut 2
- tablo[5] provoquerait une erreur car le tableau contient 5 valeurs numérotées de 0 à 4 .
void loop() {
for ( i=0 ; i<5 ; i=i+1) {
digitalWrite(tablo[i], LOW);
digitalWrite(tablo[i+1], HIGH); //
c'est pour que cette instruction fonctionne quand i vaut 4 que le tableau comporte 5 valeurs.
delay (1000);
}
}
Le programme chenille_2
// déclarations int tablo[] = { 2, 9, 5, 3, 2 } ; // notez l'élément ajouté à la fin int i ; void setup { for ( i=0 ; i<4 ; i++) { pinMode(tablo[i], OUTPUT); } } void loop { for ( i=0 ; i<4 ; i++) { digitalWrite(tablo[i], LOW); digitalWrite(tablo[i+1], HIGH); digitalWrite(9, HIGH); delay (1000); } } |
Ce programme fait exactement la même chose que le premier mais prend beaucoup moins de place en mémoire.
Il a encore un gros inconvénient : les délais à l'intérieur de la boucle.
Amélioration du programme
On va donc améliorer le programme en utilisant la fonction millis().
Cette fonction renvoie une valeur qui est un grand nombre, trop grand pour tenir dans un octet. On
demande à Arduino de réserver 4 octets de mémoire pour ce nombre. C'est l'expression "unsigned long" qui l'indique.
Ça permet de stocker un nombre pouvant aller jusqu'à 4,3 milliards. (2 puissance 32)
Pour info, ce nombre renvoyé par la fonction est le temps écoulé depuis le lancement du programme, en millisecondes.
Ce n'est pas un intervalle de temps très précis. On ne peut pas l'utiliser pour une horloge.
programme chenille_3
On déclare des variables et une fonction :
Dans le setup(), on note l'heure du prochain changement.
Dans la boucle, on regarde si 1000ms se sont écoulées depuis le dernier changement de led.
si OUI, on appelle changeLed() avant de continuer
si NON, on continue à boucler
unsigned long tpsProchain;
|
Modulo
Pour ceux qui se rappellent ce que signifie ce terme en mathématiques,
'a modulo b' s'écrit en langage Arduino 'a % b' ;
Vous pouvez essayer de l'utiliser à la place des 3 dernières lignes du programme.
Si vous n'y arrivez pas en moins de 10 mn, laissez tomber.
haut de la page

