Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SoftwareSerial.h>
- int tableau_random[30]; // tableau de mémorisation de la suite tirée au hazard
- int tableau_reponses[30]; // tableau de mémorisaytion de réponses données par le joueur
- int ledPin1 = 4; // LED 1 connectée à la sortie 4 soit Port D bit
- int ledPin2 = 5; // LED 2 connectée à la sortie 5
- int ledPin3 = 6; // LED 3 connectée à la sortie 6
- int ledPin4 = 7; // LED 4 connectée à la sortie 7
- int buzerPin = 8; // Buzer connecté à la sortie 8
- int reponse1 = 9; // BP 1 connecté à l'entrée 9
- int reponse2 = 10; // BP 2 connecté à l'entrée 10
- int reponse3 = 11; // BP 3 connecté à l'entrée 11
- int reponse4 = 12; // BP 4 connecté à l'entrée 12
- int f; // pour competr les parties
- int compteur; // compteur de nombre aléatoires dans la liste en cours
- int compteur_listes; // compteur de listes bien renseignées
- int appui; // appui sur un BP
- int nombre; // nombre aléatoire
- int erreur_T; // erreur de dépassemant du temps alloué pour appuyer sur un BP
- int flag_3_erreur; // le joueur a droit à 3 erreur avant de devoir cesser de jouer
- int longueur_liste; // détermine la longueur d'une suite de nombre aléatoires
- int nombre_listes;
- long temps_alloue; // temps alloué pour appuyer sur un BP
- unsigned long debut_chrono; // relevé du temps dès la demande d'appui sur BP
- unsigned long chrono; // relevé du temps en fin d'appui sur BP
- boolean reponse; // pour la lecture des lignes d'entrée de BP
- // fonction d'affichage du tableau des réponses données par le joueur
- // le tableau est utilisé pour vérifier l'exactitude des réponses du joueur
- // cette fonction n'est pas utilisée, elle a servie à la mise au point du programme
- void joue_tableau_reponses(int pointeur_reponses)
- {
- if (pointeur_reponses==0)
- {
- return;
- }
- Serial.print("tableau reponses ");
- for ( int f = 0; f <=pointeur_reponses;f++)
- {
- nombre = tableau_reponses[f];
- Serial.print(f); Serial.print(" "); Serial.print( tableau_reponses[f]);
- affichage_leds(nombre);
- }
- Serial.println('\r');
- }
- // fonction pour afficher les chiffres stockés dans le tableau "tableau_random"
- // retourne immediatement à l'appelant si pas de chiffres stockés
- // balaie le tableau et à chacune des cases appelle la fonction affichage_leds(nombre)
- void joue_tableau_random(int pointeur_random)
- {
- if (pointeur_random == 0)
- {
- return;
- }
- for ( int f = 0; f <=pointeur_random;f++)
- {
- nombre = tableau_random[f];
- affichage_leds(nombre);
- }
- }
- // fonction de saisie de la réponse par bouton poussoir
- // attend un appui sur un des BP tout en surveillant le temps qui passe
- // le temps alloué est de 3 secondes ...initialisé en void set up ()
- // en cas de depassement du temps, incrémente la variable erreur et appele la fonction erreur_temps(erreur)
- void saisie_reponse()
- {
- debut_saisie:
- for (int BP = 1 ; BP <=compteur; BP++)
- {
- reponse = HIGH;
- appui = 0;
- debut_chrono = millis();
- Serial.print(BP); Serial.print(" eme BP = ");
- do{
- reponse = digitalRead(reponse1);
- if (reponse == LOW) {(tableau_reponses[compteur]=1);(appui = 1);goto sortie;}
- reponse=digitalRead(reponse2);
- if (reponse == LOW) {(tableau_reponses[compteur]=2);(appui = 2);goto sortie;}
- reponse=digitalRead(reponse3);
- if (reponse == LOW) {(tableau_reponses[compteur]=3);(appui = 3);goto sortie;}
- reponse=digitalRead(reponse4);
- if (reponse == LOW) {(tableau_reponses[compteur]=4);(appui = 4);goto sortie;}
- chrono = millis();
- if ((chrono - debut_chrono)>temps_alloue)
- {
- erreur_temps();
- if (erreur_T==3){goto sortie_sur_erreur3;}
- joue_tableau_random(compteur);
- goto debut_saisie;
- }
- } while (appui==0);
- Serial.print("appui = "); Serial.print(appui); Serial.println('\r');
- sortie:
- delay(600);
- controle_reponse(appui,BP);
- }
- sortie_sur_erreur3:
- delay(100);
- }
- // fonction de traitement du dépassement du temps alloué pour répondre
- // ce temps est surveillé à chaque attente d'un appui sur une touche
- // lors de la saisie des réponse du joueur
- void erreur_temps()
- {
- Serial.print("temps de reponse depasse "); Serial.println('\r');
- erreur_T ++;
- musique_depassement_temps();
- //Serial.print(erreur_T); Serial.println('\r');
- if (erreur_T== 3)
- {
- // Serial.print(" erreur = ");Serial.print(erreur_T);Serial.print(" depassement du temps ");Serial.println('\r');
- musique_depassement_temps();
- }
- }
- // fonction de traitement d'une mauvaise réponse
- void traitement_erreur_reponse(int fausse_reponse)
- {
- Serial.print("controle reponse = "); Serial.print(fausse_reponse); Serial.print(" est.................... mauvaise "); Serial.println('\r');
- musique_mauvaise_reponse();
- compteur=0;
- loop();
- }
- // fonction de controle de la réponse qui vient d'etre saisie
- // cette fonctiuon est appelée à cacque appui sur un Bouton poussoir
- void controle_reponse(int reponseBP,int rang)// appelé avec la dernière réponse
- {
- Serial.print("tableau_random cas "); Serial.print(rang);Serial.print(" contient "); Serial.print(tableau_random[rang]); Serial.println('\r');
- Serial.print("reponseBP = "); Serial.print(reponseBP); Serial.println('\r');
- if (tableau_random[rang] == reponseBP)
- {
- //goto sortie_controle_reponse;
- Serial.print("controle reponse = "); Serial.print(reponseBP); Serial.print(" est ok "); Serial.println('\r');
- }
- else
- {
- traitement_erreur_reponse(reponseBP);
- }
- }
- // fonction pour allumer les leds en fonction du tableau des chiffres de la fonction random
- // ou ceux du tableau_reponses ( à faire si besoin)
- void affichage_leds(int nombreR)
- {
- switch (nombreR)
- {
- case 1:
- tone(buzerPin,3900);
- digitalWrite(ledPin1, LOW); // allume la led 1
- delay(500); // waits for a second
- digitalWrite(ledPin1, HIGH); // éteinds la led 1
- noTone(buzerPin);
- delay(300); // waits for a second
- break;
- case 2:
- tone(buzerPin,4150);
- digitalWrite(ledPin2, LOW); // allume la led 2
- delay(500); // waits for a second
- digitalWrite(ledPin2, HIGH); // éteinds la led 2
- noTone(buzerPin);
- delay(300); // waits for a second
- break;
- case 3:
- tone(buzerPin,4300);
- digitalWrite(ledPin3, LOW); // allume la led 3
- delay(500); // waits for a second
- digitalWrite(ledPin3, HIGH); // éteinds la led 3
- noTone(buzerPin);
- delay(300); // waits for a second
- break;
- case 4:
- tone(buzerPin,4450);
- digitalWrite(ledPin4, LOW); // allume la led 4
- delay(500); // waits for a second
- digitalWrite(ledPin4, HIGH); // éteinds la led 4
- noTone(buzerPin);
- delay(300); // waits for a second
- break;
- default:
- break;
- }
- }
- // cette fonction allume les 4 leds en chenillard
- // en n'effectuant qu'un seul passage
- void musique_bonne_suite()
- {
- tone(buzerPin,4000);
- digitalWrite(ledPin1, LOW); // allume la led 1
- delay(200); // waits for a second
- digitalWrite(ledPin1, HIGH); // éteinds la led 1
- noTone(buzerPin);
- tone(buzerPin,4100);
- digitalWrite(ledPin2, LOW); // allume la led 1
- delay(200); // waits for a second
- digitalWrite(ledPin2, HIGH); // éteinds la led 1
- noTone(buzerPin);
- tone(buzerPin,4200);
- digitalWrite(ledPin3, LOW); // allume la led 1
- delay(200); // waits for a second
- digitalWrite(ledPin3, HIGH); // éteinds la led 1
- noTone(buzerPin);
- tone(buzerPin,4300);
- digitalWrite(ledPin4, LOW); // allume la led 1
- delay(200); // waits for a second
- digitalWrite(ledPin4, HIGH); // éteinds la led 1
- noTone(buzerPin);
- delay(500);
- }
- // cette fonction fait clignoter les 4 leds ensemble 3 fois
- // elle émet également 3 bips
- void musique_depassement_temps()
- {
- for (int i=1; i <= 3; i++)
- {
- tone(buzerPin,3800); // émet un son
- digitalWrite(ledPin1, LOW); // allume la led 1
- digitalWrite(ledPin2, LOW); // allume la led 2
- digitalWrite(ledPin3, LOW); // allume la led 3
- digitalWrite(ledPin4, LOW); // allume la led 4
- delay(150); // tempo de 150ms
- digitalWrite(ledPin1, HIGH); // éteinds la led 1
- digitalWrite(ledPin2, HIGH); // éteinds la led 2
- digitalWrite(ledPin3, HIGH); // éteinds la led 3
- digitalWrite(ledPin4, HIGH); // éteinds la led 4
- noTone(buzerPin); // cesse d'émettre un son
- delay(150); // tempo de 150ms
- }
- delay(500);
- }
- // cette fonction fait clignoter 3 fois les leds par groupes de 2
- // ces deux groupes clignotent à l'inverse l'un de l'autre
- // un bip continu est emit pendant ce temps
- void musique_mauvaise_reponse()
- {
- for (int i=1; i <= 3; i++)
- {
- tone(buzerPin,3800);
- digitalWrite(ledPin1, LOW); // allume la led 1
- digitalWrite(ledPin2, HIGH); // éteinds la led 2
- digitalWrite(ledPin3, LOW); // allume la led 3
- digitalWrite(ledPin4, HIGH); // eteinds la led 4
- delay(150); // tempo de 150ms
- digitalWrite(ledPin1, HIGH); // éteinds la led 1
- digitalWrite(ledPin2, LOW); // allume la led 2
- digitalWrite(ledPin3, HIGH); // éteinds la led 3
- digitalWrite(ledPin4, LOW); // allume la led 4
- delay(150); // tempo de 150ms
- }
- digitalWrite(ledPin2, HIGH); // éteinds la led 2
- digitalWrite(ledPin4,HIGH); // éteinds la led 4
- noTone(buzerPin);
- delay(500);
- }
- void musique_chenillard_droite()
- {
- tone(buzerPin,4000);
- digitalWrite(ledPin4, LOW); // allume la led 4
- delay(100); // waits for a second
- digitalWrite(ledPin4, HIGH); // éteinds la led 4
- noTone(buzerPin);
- tone(buzerPin,4100);
- digitalWrite(ledPin3, LOW); // allume la led 3
- delay(100); // waits for a second
- digitalWrite(ledPin3, HIGH); // éteinds la led 3
- noTone(buzerPin);
- tone(buzerPin,4200);
- digitalWrite(ledPin2, LOW); // allume la led 2
- delay(100); // waits for a second
- digitalWrite(ledPin2, HIGH); // éteinds la led 2
- noTone(buzerPin);
- tone(buzerPin,4300);
- digitalWrite(ledPin1, LOW); // allume la led 1
- delay(100); // waits for a second
- digitalWrite(ledPin1, HIGH); // éteinds la led 1
- noTone(buzerPin);
- delay(100);
- }
- void musique_chenillard_gauche()
- {
- tone(buzerPin,4000);
- digitalWrite(ledPin1, LOW); // allume la led 1
- delay(100); // waits for a second
- digitalWrite(ledPin1, HIGH); // éteinds la led 1
- noTone(buzerPin);
- tone(buzerPin,4100);
- digitalWrite(ledPin2, LOW); // allume la led 1
- delay(100); // waits for a second
- digitalWrite(ledPin2, HIGH); // éteinds la led 1
- noTone(buzerPin);
- tone(buzerPin,4200);
- digitalWrite(ledPin3, LOW); // allume la led 1
- delay(100); // waits for a second
- digitalWrite(ledPin3, HIGH); // éteinds la led 1
- noTone(buzerPin);
- tone(buzerPin,4300);
- digitalWrite(ledPin4, LOW); // allume la led 1
- delay(100); // waits for a second
- digitalWrite(ledPin4, HIGH); // éteinds la led 1
- noTone(buzerPin);
- delay(100);
- }
- // fonction appelée pour la fin d'une liste
- // correctement renseignée jusqu'au bout
- void musique_partie_gagnee()
- {
- musique_chenillard_gauche();
- musique_chenillard_droite();
- musique_chenillard_gauche();
- musique_chenillard_droite();
- }
- // fonction appelée pour la fin de toutes les parties
- void musique_fin_jeu()
- {
- for (int i=1; i <= 3; i++)
- {
- musique_chenillard_gauche();
- musique_mauvaise_reponse();
- musique_depassement_temps();
- musique_chenillard_droite();
- }
- }
- void setup()
- {
- pinMode(ledPin1,OUTPUT);
- pinMode(ledPin2,OUTPUT);
- pinMode(ledPin3,OUTPUT);
- pinMode(ledPin4,OUTPUT);
- pinMode(buzerPin,OUTPUT);
- pinMode(reponse1, INPUT_PULLUP); //init de la résistance de pull up sur l'entrée BP 1
- pinMode(reponse2, INPUT_PULLUP); //init de la résistance de pull up sur l'entrée BP 1
- pinMode(reponse3, INPUT_PULLUP); //init de la résistance de pull up sur l'entrée BP 1
- pinMode(reponse4, INPUT_PULLUP); //init de la résistance de pull up sur l'entrée BP 1
- digitalWrite(ledPin1, HIGH); // éteinds la led 1
- digitalWrite(ledPin2, HIGH); // éteinds la led 2
- digitalWrite(ledPin3, HIGH); // éteinds la led 3
- digitalWrite(ledPin4, HIGH); // éteinds la led 4
- noTone(buzerPin); // éteinds le buzer
- compteur_listes=0;
- nombre_listes = 3; // nombre de parties
- longueur_liste = 5; // longueur d'une partie
- temps_alloue = 3000; // 3 secondes allouées pour tout appui sur les BP
- flag_3_erreur = 0; // compteur des 3 erreurs acceptées au maxi
- for ( int f = 0; f <=30;f++) // reset des tableau de mémorisation
- { // des chiffres tirés au hazard
- tableau_random[f]=0; // et des chiffres donnés en réponse
- tableau_reponses[f]=0; // par le joueur
- }
- compteur_listes = nombre_listes * longueur_liste;
- Serial.begin(9600); //i,it de la liaison série
- }
- void loop()
- {
- for ( f = 1; f <= compteur_listes;f ++)
- {
- Serial.print(".....f = ");
- Serial.print(f);
- Serial.println('\r');
- debut_programme:
- if (compteur == longueur_liste)
- {
- musique_partie_gagnee();
- compteur=0;erreur_T=0;
- }
- tone(buzerPin,4300,500); // bip avant tirage au sort d'un chiffre de la liste au hazard
- delay(1200); // tempo de 300 mili-seconde
- if (compteur == 0)
- {
- Serial.println('\r');
- Serial.print("debut du programme......nouvelle partie............");
- Serial.println('\r');
- //digitalWrite(buzerPin, LOW); // allume la led buzer
- //delay(500); // attente 500 ms
- //digitalWrite(buzerPin, HIGH); // éteinds la led buzer
- //delay(500); // attente 500 ms
- erreur_T = 0;
- }
- joue_tableau_random(compteur); //affiche les nombres aléatoires déjà tirés
- compteur ++; //incrémente le compteur de nombres aléatoires
- Serial.println('\r');
- Serial.print("compteur ");
- Serial.print(compteur);
- Serial.println('\r');
- nombre = random(1, 5); // tire un nombre aléatoire entre 1 et 4
- tableau_random[compteur] = nombre; // initialise la case correspondante dans le tableau de mémorisation
- affichage_leds(nombre); // allume la led correspondant au nombre aléatoire qui vient d'etre tiré
- saisie_reponse(); // saut en routine de saisie des appui sur BP par le joueur
- if (erreur_T==3)
- {
- compteur=0;
- erreur_T=0;
- goto debut_programme;
- }
- musique_bonne_suite(); // affiche les leds et bips selon séquence bonne réponse pour toute la suite
- Serial.println('\r');
- Serial.print(".........................compteur listes ");
- Serial.print(compteur_listes);
- Serial.print(".....f = ");
- Serial.print(f);
- Serial.println('\r');
- if (f == compteur_listes)
- {
- musique_fin_jeu();
- compteur=0;erreur_T=0;//musique_fin_jeu();
- attente_raz_micro:
- goto attente_raz_micro;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement