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 |
|
|||
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.