Page 95 - arduino_Neat
P. 95
Dans le programme ci-dessus nous avons utilisé un opérateur logique &&. Cet opérateur nous
a permis d'introduire plusieurs conditions à la fonction if(), puisque nous voulions que TOUTES
les conditions soient vraies pour que les instructions s'exécutent. Seul (vrai && vrai) retourne
une valeur vraie, alors que (vrai && faux) et (faux && vrai) retournent tous deux faux.
Ci-dessous l’opérateur logique && (et) nous permet de rentrer dans la fonction if() seulement
si les deux conditions sont vraies.
if (lectureCapteur >= SEUIL && millis () - temps >= ANTIREBOND) {
...
}
Ci-dessous l’opérateur logique || (ou) nous permet de rentrer dans la fonction if() si l'une ou
l'autre des conditions est vraie.
if (marqueurTemps [posTableau] == 0 || posTableau == NOMBREMARQUEURS) {
...
}
TROISIÈME ÉTAPE
Dans cette étape nous allons implémenter un mécanisme qui va nous permettre de formaliser
notre scénario d'utilisation qui comporte deux modes différents : le MODE ÉCOUTE et le MODE
JEUX. Cette troisième étape introduit aussi plusieurs astuces pour que le programme puisse
fonctionner dans son ensemble notamment un concept permettant de définir les conditions de
passage d'un mode à un autre ainsi que l'ajout d'une LED facilitant la visualisation les impacts
enregistrés puis re-joués.
////////// Déclaration des variables
// ces variables sont constantes
const int LED = 13; // LED connectée à la pin digitale 13
const int CAPTEUR = A0; // Piezo connecté à la pin Analogue 0
const int SEUIL = 1; // seuil de détection du capteur
const int ANTIREBOND = 200; // filtre anti-rebond
const int FIN = 2000; // temps pour définir la fin du mode écoute
const int NOMBREMARQUEURS = 50; // nombre maximum de marqueurs temps
// ces variables changent
int lectureCapteur = 0; // valeur du capteur
int ledEtat = LOW; // état de la LED
int mode = 1; // mode écoute (1) ou jeux (2)
int posTableau = 0; // Position dans le tableau
long temps = 0; // variable pour mémoriser le temps
long marqueurTemps[NOMBREMARQUEURS]; // tableau pour mémoriser les temps qui séparent chaque
impacte
int i = 0; // variable pour parcourir la liste
boolean DEBUG = false; // activer ou non le DEBUG
boolean BOUCLE = false; // TODO
void setup() {
pinMode(LED, OUTPUT); // déclarer la pin en sortie
Serial.begin(9600); // configurer le port série
}
////////// Boucle principale
void loop() {
switch(mode) {
case 1: // mode enregistrement
if(DEBUG == true) Serial.println("mode 1"); // envoie du mode
// lecture de la valeur du capteur Piezo
lectureCapteur = analogRead(CAPTEUR);
// si la valeur captée est supérieure au seuil choisi et
// que le temps écoulé depuis le dernier impacte est supérieur au temps de
l'ANTIREBOND
// alors on rentre dans la condition
if (lectureCapteur >= SEUIL && millis() - temps >= ANTIREBOND) {
marqueurTemps[posTableau] = millis() - temps; //
digitalWrite(LED, HIGH); // activer la broche de la LED
delay(5); // atendre 10 milisegonde
digitalWrite(LED, LOW); // éteindre la broche de la LED
// on memorise le temps écoulé entre chaque impacte
posTableau++; // on incrémente la position
temps = millis(); // initialisation
}
// si le temps écoulé depuis le dernier impact est supérieur
// au temps dit de FIN et que plus de deux impacts sont enregistrés
95