Ignorer la navigation

La boucle « While »

Utilisation du buzzer de la carte DangerShield à l'aide d'une boucle WHILE

 


I. Fonctionnement de la boucle « While »

Le principe de fonctionnement de la boucle WHILE (tant que) :

TANTQUE  condition vraie
      exécution d'instructions (traitement)
FIN TANTQUE
suite du programme
 

 

    
     

Voici un extrait de la documentation Arduino:

while loops

Description
while loops will loop continuously, and infinitely, until the expression inside the parenthesis, () becomes false. Something must change the tested variable, or the while loop will never exit. This could be in your code, such as an incremented variable, or an external condition, such as testing a sensor.

Syntax
while (expression) {
  // statement(s)
}

Parameters
expression - a (boolean) C statement that evaluates to true or false

....

En résumé cela donne  (exemple):

    toto=0 ;
    while  (toto <  5 )     // on fait la boucle While tant que la variable toto est inférieure à 5
        {
                digitalWrite(LED_PIN,HIGH) ;    // allumage d'une LED
                toto=toto+1 ;  incrément de la variable toto
        }

 

 

II. Application avec le Buzzer de la carte DangerShield

Remarque : pour faire fonctionner ce buzzer (CET 12A3.5), il faut le faire vibrer (on l'alimente, on arrête, on l'alimente, on arrête, ….  le son émis va dépendre de la fréquence de cette alternance marche/arrêt).


1. Ouvrir le fichier « dangershield_buzzer.txt », récupérer le programme contenu dans le fichier et testez le (il faut  appuyer sur le 1er bouton poussoir) et essayer de comprendre comment il fonctionne.

2. Compléter l'algorigramme correspondant au programme :

3. A partir du programme, en déduire la fréquence du son émis

4. Pourquoi la variable "temps" est-elle multipliée par 1 000 ?




III. 1ère modification du programme (changement de variable)

Vous allez modifier le programme précédent pour que la variable réglée soit directement la fréquence (en Hertz). Vous devrez faire le calcul de la demi période (avant la boucle « While »).

Ainsi en tête de programme (dans la partie déclaration de variables) vous allez écrire :

float frequence = 220; // frequence en Hertz //
float demi_periode;   // calcul de la demi période de la fréquence //

Faites la modification du programme. Testez là et faites valider par le professeur.





IV. 2ème modification du programme (ajout d'une fonction ou sous-programme)


On va maintenant créer une fonction (sous programme) que l'on va appeler allu_buzzer.

La fonction allu_buzzer va posséder 3 paramètres :

  • le numéro de la broche (PIN en anglais) de branchement du buzzer
  • la fréquence
  • la durée de fonctionnement (en millisecondes)

Ces trois paramètres auront comme nom de variable à l'intérieur de la fonction (variables locales):

  • adress_buzzer
  • freq
  • temps_buz

La fonction sera donc de la forme:    void allu_buzzer ( …….…….. , ……….)


et utilisée de la manière suivante (dans la boucle Loop):  allu_buzzer ( …….…….. , ………. );

 

Cette fonction allu_buzzer va contenir la partie qui gère le Buzzer que l'on enlèvera de la boucle Loop pour la mettre dans la fonction. Grosso modo ceci (il faudra bien sûr changer le nom des variables et mettre les variables locales propres à la fonction:

partie issue du Loop et à mettre dans la fonction

(après modifications):

 

duree = 0;
    while(duree < temps*1000)
    {
      digitalWrite(BUZZER_PIN,HIGH); //
      delayMicroseconds(demi_periode);
      digitalWrite(BUZZER_PIN,LOW);
      delayMicroseconds(demi_periode);
      duree = duree + 2*demi_periode;
    }

1. Faire la modification du programme. Essayer. Quand cela fonctionne faire valider par le professeur.





V.  Un peu de musique maintenant

rajouter dans la déclaration des variables les notes de musique  (norme anglo-saxonne):

 
const float c = 261;
const float d = 294;
const float e = 329;
const float f = 349;
const float g = 391;
const float gS = 415;
const float a = 440;
const float aS = 455;
const float b = 466;
const float cH = 523;
const float cSH = 554;
const float dH = 587;
const float dSH = 622;
const float eH = 659;
const float fH = 698;
const float fSH = 740;
const float gH = 784;
const float gSH = 830;
const float aH = 880;

 

et dans la boucle du programme (void loop) :

appui_bp1= digitalRead(Bp1); // lecture de l'état du BP1//
 
  if (appui_bp1 == LOW) // test si appui sur BP//
  {
    allu_buzzer(BUZZER_PIN, a, 500);
    allu_buzzer(BUZZER_PIN, a, 500);
    allu_buzzer(BUZZER_PIN, a, 500);
    allu_buzzer(BUZZER_PIN, f, 350);
    allu_buzzer(BUZZER_PIN, cH, 150);
    allu_buzzer(BUZZER_PIN, a, 500);
    allu_buzzer(BUZZER_PIN, f, 350);
    allu_buzzer(BUZZER_PIN, cH, 150);
    allu_buzzer(BUZZER_PIN, a, 650);
    delay (500);
    allu_buzzer(BUZZER_PIN,eH, 500);
    allu_buzzer(BUZZER_PIN,eH, 500);
    allu_buzzer(BUZZER_PIN,eH, 500);
    allu_buzzer(BUZZER_PIN,fH, 350);
    allu_buzzer(BUZZER_PIN,cH, 150);
    allu_buzzer(BUZZER_PIN,gS, 500);
    allu_buzzer(BUZZER_PIN,f, 350);
    allu_buzzer(BUZZER_PIN,cH, 150);
    allu_buzzer(BUZZER_PIN,a, 650);
 
  }  

Essayez.

Créé avec eXeLearning (Nouvelle fenêtre)