Boucle While et arduino, l’exemple WhileStatementConditional.

 

Boucle While et arduino, l’exemple WhileStatementConditional.

L’exemple WhileStatementConditional va (enfin) nous permettre d’introduire les boucles While sous arduino. Le but sera dans un premier temps de calibrer une entrée analogique (en réalisant une mise à l’échelle entre une valeur minimum et une valeur maximum), puis allumer une LED de manière analogique selon la position du capteur (de l’entrée) précédemment calibrée.

Comment fonctionne une boucle WHILE?

La boucle WHILE a pour but d’exécuter en boucle une série d’instruction tant que sa condition est vrai (contrairement à la boucle FOR (voir l’exemple à ce lien) qui exécute ses instructions un nombre définie de fois.

Boucle while arduino 01

Par exemple, si vous regardez la figure ci dessus, nous exécuterons en boucle l’instruction 1 dans que la condition du test sera vrai. Et lorsque la condition du test deviendra fausse, nous sortirons de la boucle et continuerons à exécuter le reste du programme (ici l’instruction 2, etc…).

Traduction de la boucle WHILE sous arduino IDE.

Voici comment exprimer écrire une boucle while sous arduino:

//Instructions précédentes
while(expression a tester){
// Instructions exécutées en boucle
}
//Instructions exécutée lorsque l'expression à tester est devenue fausse.
  • Nous avons donc les instructions du programme précédents la boucle While.
  • Puis vient la boucle While déclarée via le mot-clé While.
  • Dans expression à tester nous mettrons la condition qui fait que notre boucle sera et restera active (cela peut être l’état d’un booléen, une comparaison…)
  • Puis entre les accolades l’ensemble des instructions exécutées par la boucle.
  • Enfin, lorsque l’expression à tester n’est plus vrai, nous sortons de la boucle pour exécuter le reste du programme.

Donc pour prendre l’exemple disponible sur le site arduino, nous avons:

var = 0;
while(var < 200){
  // do something repetitive 200 times
  var++;
}
  • Ligne 1: On déclare et initialise une variable nommée var à la valeur 0.
  • Ligne 2: On a notre boucle While qui sera active tant que var sera inférieure à 200.
  • Ligne 3: Des commentaires que l’on peut remplacer par un morceau de programme.
  • Ligne 4: On incrémente la variable var de 1.
  • Ligne 5: Accolade fermente, on retourne donc au While pour tester si la condition est toujours vrai. Si c’est le cas on exécute encore le code situé entre les accolades, sinon on poursuit le programme après ces accolades.

Programme de l’exemple arduino WhileStatementConditional.

Vous trouverez le programme fading dans Fichier -> Exemples -> 05.Control -> WhileStatementConditional.

chemin de lexemple whilestatementconditional01

Et voici le programme:

/*
Conditionals - while statement

This example demonstrates the use of while() statements.

While the pushbutton is pressed, the sketch runs the calibration routine.
The sensor readings during the while loop define the minimum and maximum
of expected values from the photo resistor.

This is a variation on the calibrate example.

The circuit:
* photo resistor connected from +5V to analog in pin 0
* 10K resistor connected from ground to analog in pin 0
* LED connected from digital pin 9 to ground through 220 ohm resistor
* pushbutton attached from pin 2 to +5V
* 10K resistor attached from pin 2 to ground

created 17 Jan 2009
modified 30 Aug 2011
by Tom Igoe

This example code is in the public domain.

http://www.arduino.cc/en/Tutorial/WhileLoop

*/


// These constants won't change:
const int sensorPin = A2; // pin that the sensor is attached to
const int ledPin = 9; // pin that the LED is attached to
const int indicatorLedPin = 13; // pin that the built-in LED is attached to
const int buttonPin = 2; // pin that the button is attached to


// These variables will change:
int sensorMin = 1023; // minimum sensor value
int sensorMax = 0; // maximum sensor value
int sensorValue = 0; // the sensor value


void setup() {
// set the LED pins as outputs and the switch pin as input:
pinMode(indicatorLedPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop() {
// while the button is pressed, take calibration readings:
while (digitalRead(buttonPin) == HIGH) {
calibrate();
}
// signal the end of the calibration period
digitalWrite(indicatorLedPin, LOW);

// read the sensor:
sensorValue = analogRead(sensorPin);

// apply the calibration to the sensor reading
sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

// in case the sensor value is outside the range seen during calibration
sensorValue = constrain(sensorValue, 0, 255);

// fade the LED using the calibrated value:
analogWrite(ledPin, sensorValue);
}

void calibrate() {
// turn on the indicator LED to indicate that calibration is happening:
digitalWrite(indicatorLedPin, HIGH);
// read the sensor:
sensorValue = analogRead(sensorPin);

// record the maximum sensor value
if (sensorValue > sensorMax) {
sensorMax = sensorValue;
}

// record the minimum sensor value
if (sensorValue < sensorMin) {
sensorMin = sensorValue;
}
}
  • Lignes 1 à 27: Le pavé de commentaire descriptif classique.
  • Ligne 31: Déclaration de la constante sensorPin qui désignera l’entrée analogique A2 sur laquelle sera raccordée le capteur (chez moi un potentiomètre).
  • Ligne 32: Déclaration de la constante ledPin qui désignera la borne 9 sur laquelle sera raccordée la LED en PWM.
  • Ligne 33: Déclaration de la constante indicatorLedPin qui désignera borne 13 où sera raccordée la LED indiquant une calibration en cours.
  • Ligne 34: Déclaration de la constante buttonPin qui désignera borne 2 où sera raccordé le bouton.
  • Lignes 38 à 40: Ici nous avons 3 variables qui vont nous servir à « calibrer notre sonde » (chez moi un potentiomètre). Attardons nous un moment sur le but de la calibration. Initialement mon potentiomètre à une plage allant de 0v pour le mini (soit 0%) à 5V pour le maxi (soit 100%). Mais admettons que ce qui m’intéresse se situe uniquement entre 2V et 3V; il faudra donc faire une « calibration » afin que 2V corresponde à 00% et 3V à 100%. C’est à cela que ces trois variables vont servir. Tant que nous serons en calibration (vous la sentez venir la boucle While???), nous écrierons la plus faible valeur jamais lue  dans sensorMin et la plus grande valeur jamais lue dans sensorMax (c’est pour cela que sensorMin est initialisé à 1023, car nous sommes sur de lire des valeurs plus faibles, vice versa pour sensorMax). Quant à sensorValue, ce sera la variable qui lira la valeur du capteur en temps réel.
  • Lignes 43 à 48: Vient la boucle setup (que nous commençons à bien connaitre) qui initialise indicatorLedPin et ledPin comme des sorties et buttonPin comme une entrée.
  • Ligne 50: Début de la boucle principale loop (qui se termine ligne 69).
  • Ligne 52 à 54: boucle While qui restera active tant que digitalRead(buttonPin) == HIGH, soit tant que le bouton restera appuyé. Et l’instruction que cette boucle exécute est l’appel de la fonction calibrate() qui se situe de la ligne 71 à la ligne 85…
  • Ligne 56: On éteint la LED indicatorLedPin allumée par la fonction calibrate.
  • Ligne 59: On vient lire l’entrée analogique sensorPin et stocker la valeur dans la variable sensorValue.
  • Ligne 62: On réalise une mise à l’echelle de l’entrée analogique via la fonction map (que nous avons deja vu à ce lien) qui ajustera la valeur de notre potentiomètre par rapport aux bornes définies lors de la calibration.
  • Ligne 65: Sert à borner notre résultat si celui ci dépasse la valeur 0 ou 255.
  • Ligne 68: On allume la led ledPin puis ou moins fort selon la position du potentiomètre.
  • Ligne 71: La voila notre fonction calibrate.
  • Ligne 73: On commence par indiquer qu’une calibration est en cours en allumant la LED indicatorLedPin (qui sera éteinte ligne 56).
  • Ligne 75: On vient lire la valeur du potentiomètre.
  • Ligne 78 à 80: Si la valeur lue est supérieure à la valeur de sensorMax, alors on affecte la valeur de sensorValue dans sensorMax. Ainsi on stockera dans sensorMax la plus grande valeur à laquelle sensorPin a été durant la calibration.
  • Ligne 82 à 84: Idem qu’au dessus sauf que l’on affecte la plus faible valeur dans sensorMin.

Cablage de l’exemple arduino WhileStatementConditional.

Initialement je voulais reprendre le montage tel qu’il est présenté sur le site officiel arduino, mais je pense que celui ci a une erreur sur le placement de sa résistance de pull-down sur le bouton…

cablage arduino while statement conditionnal 01

Sur mon montage j’ai simplement mis un potentiomètre sur l’entrée A0 plutôt qu’un capteur de luminosité.

Faisons l’inventaire de ce que l’on retrouve:

Essais live du programme arduino While Statement Conditional.

  • Dans un premier temps faite varier votre potentiomètre (ou votre capteur) de sa valeur mini à sa valeur maxi. Vous devriez voir la LED raccordée sur la borne 9 (LedPin) s’allumer de manière progressive du minimum au maximum.
  • Puis placez votre potentiomètre au milieu, et maintenez enfoncé le bouton de calibration. La LED de calibration s’allume (IndicatorLedPin, borne 13), et faite varier votre potentiomètre sur une petite plage (environ entre 40 et 60% de sa valeur max).
  • Relâchez le bouton de calibration, IndicatorLedPin s’éteint.
  • Et maintenant, la LedPin s’allumera toujours de manière progressive, mais sera complètement éteinte pour une valeur du potentiomètre inférieure à 40% et elle sera complètement allumée à partir de 60%.

 


Liens interne:

Tutoriel sur les boucles FOR.

Tutoriel sur l’utilisation d’un potentiomètre.

Tutoriel sur les sorties analogiques.

Liens externe:

Arduino, boucle While.

Wikipedia, boucle While.

 

About the Author: maxpeigne