Advertisement
Guest User

Simon a dit

a guest
Mar 6th, 2014
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.74 KB | None | 0 0
  1. #include <SoftwareSerial.h>
  2.  
  3. int tableau_random[30];          // tableau de mémorisation de la suite tirée au hazard
  4. int tableau_reponses[30];        // tableau de mémorisaytion de réponses données par le joueur
  5.  
  6. int ledPin1  = 4;                 // LED 1 connectée à la sortie 4 soit Port D bit
  7. int ledPin2  = 5;                 // LED 2 connectée à la sortie 5
  8. int ledPin3  = 6;                 // LED 3 connectée à la sortie 6
  9. int ledPin4  = 7;                 // LED 4 connectée à la sortie 7
  10.  
  11. int buzerPin = 8;                 // Buzer connecté à la sortie 8
  12.  
  13. int reponse1 = 9;                 // BP 1 connecté à l'entrée 9
  14. int reponse2 = 10;                // BP 2 connecté à l'entrée 10
  15. int reponse3 = 11;                // BP 3 connecté à l'entrée 11
  16. int reponse4 = 12;                // BP 4 connecté à l'entrée 12
  17.  
  18. int f;                            // pour competr les parties
  19. int compteur;                     // compteur de nombre aléatoires dans la liste en cours
  20. int compteur_listes;              // compteur de listes bien renseignées
  21. int appui;                        // appui sur un BP
  22. int nombre;                       // nombre aléatoire
  23. int erreur_T;                     // erreur de dépassemant du temps alloué pour appuyer sur un BP
  24. int flag_3_erreur;                // le joueur a droit à 3 erreur avant de devoir cesser de jouer
  25. int longueur_liste;               // détermine la longueur d'une suite de nombre aléatoires
  26. int nombre_listes;
  27. long temps_alloue;                // temps alloué pour appuyer sur un BP
  28. unsigned long debut_chrono;       // relevé du temps dès la demande d'appui sur BP
  29. unsigned long chrono;             // relevé du temps en fin d'appui sur BP
  30. boolean reponse;                  // pour la lecture des lignes d'entrée de BP
  31.  
  32. // fonction d'affichage du tableau des réponses données par le joueur
  33. // le tableau est utilisé pour vérifier l'exactitude des réponses du joueur
  34. // cette fonction n'est pas utilisée, elle a servie à la mise au point du programme
  35. void joue_tableau_reponses(int pointeur_reponses)
  36. {
  37.   if (pointeur_reponses==0)
  38.       {
  39.        return;
  40.       }
  41. Serial.print("tableau reponses ");
  42.      for ( int f = 0; f <=pointeur_reponses;f++)
  43.       {
  44.        nombre = tableau_reponses[f];
  45. Serial.print(f); Serial.print("  "); Serial.print( tableau_reponses[f]);
  46.        affichage_leds(nombre);
  47.       }
  48. Serial.println('\r');
  49. }
  50.  
  51. // fonction pour afficher les chiffres stockés dans le tableau "tableau_random"
  52. // retourne immediatement à l'appelant si pas de chiffres stockés
  53. // balaie le tableau et à chacune des cases appelle la fonction affichage_leds(nombre)
  54. void joue_tableau_random(int pointeur_random)
  55. {
  56.   if (pointeur_random == 0)
  57.       {
  58.        return;
  59.       }
  60.   for ( int f = 0; f <=pointeur_random;f++)
  61.       {
  62.        nombre = tableau_random[f];
  63.        affichage_leds(nombre);
  64.       }
  65. }
  66.  
  67. // fonction de saisie de la réponse par bouton poussoir
  68. // attend un appui sur un des BP tout en surveillant le temps qui passe
  69. // le temps alloué est de 3 secondes ...initialisé en void set up ()
  70. // en cas de depassement du temps, incrémente la variable erreur et appele la fonction erreur_temps(erreur)
  71. void saisie_reponse()
  72. {
  73. debut_saisie:
  74.   for (int BP = 1 ; BP <=compteur; BP++)
  75.      {
  76.       reponse = HIGH;
  77.       appui = 0;
  78.       debut_chrono = millis();  
  79. Serial.print(BP); Serial.print(" eme BP = ");
  80.             do{
  81.                reponse = digitalRead(reponse1);
  82.                if (reponse == LOW) {(tableau_reponses[compteur]=1);(appui = 1);goto sortie;}
  83.                reponse=digitalRead(reponse2);
  84.                if (reponse == LOW) {(tableau_reponses[compteur]=2);(appui = 2);goto sortie;}
  85.                reponse=digitalRead(reponse3);
  86.                if (reponse == LOW) {(tableau_reponses[compteur]=3);(appui = 3);goto sortie;}
  87.                reponse=digitalRead(reponse4);
  88.                if (reponse == LOW) {(tableau_reponses[compteur]=4);(appui = 4);goto sortie;}
  89.                chrono = millis();    
  90.                if ((chrono - debut_chrono)>temps_alloue)
  91.                   {
  92.                    erreur_temps();
  93.                    if (erreur_T==3){goto sortie_sur_erreur3;}
  94.                    joue_tableau_random(compteur);
  95.                    goto debut_saisie;
  96.                   }
  97.               } while  (appui==0);    
  98. Serial.print("appui = "); Serial.print(appui); Serial.println('\r');
  99. sortie:
  100.       delay(600);
  101.       controle_reponse(appui,BP);
  102.      }
  103. sortie_sur_erreur3:
  104.      delay(100);
  105. }
  106.  
  107. // fonction de traitement du dépassement du temps alloué pour répondre
  108. // ce temps est surveillé à chaque attente d'un appui sur une touche
  109. // lors de la saisie des réponse du joueur
  110. void erreur_temps()
  111. {
  112. Serial.print("temps de reponse depasse "); Serial.println('\r');  
  113.    erreur_T  ++;
  114.    musique_depassement_temps();
  115. //Serial.print(erreur_T); Serial.println('\r');    
  116.    if (erreur_T== 3)
  117.     {
  118.  //      Serial.print(" erreur =  ");Serial.print(erreur_T);Serial.print(" depassement du temps ");Serial.println('\r');
  119.      musique_depassement_temps();
  120.     }
  121. }
  122.  
  123. // fonction de traitement d'une mauvaise réponse
  124. void traitement_erreur_reponse(int fausse_reponse)
  125. {
  126.    Serial.print("controle reponse = "); Serial.print(fausse_reponse); Serial.print(" est.................... mauvaise "); Serial.println('\r');
  127.    musique_mauvaise_reponse();
  128.    compteur=0;
  129.    loop();
  130. }
  131.  
  132. // fonction de controle de la réponse qui vient d'etre saisie
  133. // cette fonctiuon est appelée à cacque appui sur un Bouton poussoir
  134. void controle_reponse(int reponseBP,int rang)// appelé avec la dernière réponse
  135. {
  136.   Serial.print("tableau_random cas "); Serial.print(rang);Serial.print(" contient "); Serial.print(tableau_random[rang]);  Serial.println('\r');
  137.   Serial.print("reponseBP = "); Serial.print(reponseBP);  Serial.println('\r');
  138.  
  139.   if (tableau_random[rang] == reponseBP)
  140.       {
  141.       //goto sortie_controle_reponse;
  142.       Serial.print("controle reponse = "); Serial.print(reponseBP); Serial.print(" est ok "); Serial.println('\r');
  143.       }
  144.   else  
  145.       {
  146.       traitement_erreur_reponse(reponseBP);
  147.       }
  148. }                        
  149.  
  150. // fonction pour allumer les leds en fonction du tableau des chiffres de la fonction random
  151. // ou ceux du tableau_reponses ( à faire si besoin)
  152. void affichage_leds(int nombreR)
  153. {
  154.     switch (nombreR)
  155.     {
  156.     case 1:
  157.        tone(buzerPin,3900);
  158.        digitalWrite(ledPin1, LOW);    // allume la led 1
  159.        delay(500);                  // waits for a second
  160.        digitalWrite(ledPin1, HIGH);   // éteinds la led 1
  161.        noTone(buzerPin);
  162.        delay(300);                  // waits for a second
  163.        break;
  164.     case 2:
  165.        tone(buzerPin,4150);
  166.        digitalWrite(ledPin2, LOW);    // allume la led 2
  167.        delay(500);                  // waits for a second
  168.        digitalWrite(ledPin2, HIGH);   // éteinds la led 2
  169.        noTone(buzerPin);
  170.        delay(300);                  // waits for a second
  171.        break;
  172.     case 3:
  173.        tone(buzerPin,4300);
  174.        digitalWrite(ledPin3, LOW);    // allume la led 3
  175.        delay(500);                  // waits for a second
  176.        digitalWrite(ledPin3, HIGH);   // éteinds la led 3
  177.        noTone(buzerPin);
  178.        delay(300);                  // waits for a second
  179.        break;
  180.     case 4:
  181.        tone(buzerPin,4450);
  182.        digitalWrite(ledPin4, LOW);    // allume la led 4
  183.        delay(500);                  // waits for a second
  184.        digitalWrite(ledPin4, HIGH);   // éteinds la led 4
  185.        noTone(buzerPin);
  186.        delay(300);                  // waits for a second
  187.        break;  
  188.     default:
  189.        break;
  190.     }
  191. }
  192.  
  193. // cette fonction allume les 4 leds en chenillard
  194. // en n'effectuant qu'un seul passage
  195.  void musique_bonne_suite()
  196. {
  197.      tone(buzerPin,4000);
  198.      digitalWrite(ledPin1, LOW);    // allume la led 1
  199.      delay(200);                  // waits for a second
  200.      digitalWrite(ledPin1, HIGH);   // éteinds la led 1
  201.      noTone(buzerPin);
  202.      tone(buzerPin,4100);
  203.      digitalWrite(ledPin2, LOW);    // allume la led 1
  204.      delay(200);                  // waits for a second
  205.      digitalWrite(ledPin2, HIGH);   // éteinds la led 1
  206.      noTone(buzerPin);
  207.      tone(buzerPin,4200);
  208.      digitalWrite(ledPin3, LOW);    // allume la led 1
  209.      delay(200);                  // waits for a second
  210.      digitalWrite(ledPin3, HIGH);   // éteinds la led 1
  211.      noTone(buzerPin);
  212.      tone(buzerPin,4300);
  213.      digitalWrite(ledPin4, LOW);    // allume la led 1
  214.      delay(200);                  // waits for a second
  215.      digitalWrite(ledPin4, HIGH);   // éteinds la led 1
  216.      noTone(buzerPin);
  217.      delay(500);
  218.  }
  219.      
  220. // cette fonction fait clignoter les 4 leds ensemble 3 fois
  221. // elle émet également 3 bips
  222. void musique_depassement_temps()
  223. {
  224.    for (int i=1; i <= 3; i++)
  225.     {
  226.      tone(buzerPin,3800);           // émet un son
  227.      digitalWrite(ledPin1, LOW);    // allume la led 1
  228.      digitalWrite(ledPin2, LOW);    // allume la led 2
  229.      digitalWrite(ledPin3, LOW);    // allume la led 3
  230.      digitalWrite(ledPin4, LOW);    // allume la led 4
  231.      delay(150);                    // tempo de 150ms
  232.      digitalWrite(ledPin1, HIGH);   // éteinds la led 1
  233.      digitalWrite(ledPin2, HIGH);   // éteinds la led 2
  234.      digitalWrite(ledPin3, HIGH);   // éteinds la led 3
  235.      digitalWrite(ledPin4, HIGH);   // éteinds la led 4
  236.      noTone(buzerPin);              // cesse d'émettre un son
  237.      delay(150);                    // tempo de 150ms
  238.     }
  239.    delay(500);
  240. }
  241.      
  242. // cette fonction fait clignoter 3 fois les leds par groupes de 2
  243. // ces deux groupes clignotent à l'inverse l'un de l'autre
  244. // un bip continu est emit pendant ce temps
  245. void musique_mauvaise_reponse()
  246. {
  247.    for (int i=1; i <= 3; i++)
  248.     {
  249.      tone(buzerPin,3800);
  250.      digitalWrite(ledPin1, LOW);     // allume la led 1
  251.      digitalWrite(ledPin2, HIGH);    // éteinds la led 2
  252.      digitalWrite(ledPin3, LOW);     // allume la led 3
  253.      digitalWrite(ledPin4, HIGH);    // eteinds la led 4
  254.      delay(150);                     // tempo de 150ms
  255.      digitalWrite(ledPin1, HIGH);    // éteinds la led 1
  256.      digitalWrite(ledPin2, LOW);     // allume la led 2
  257.      digitalWrite(ledPin3, HIGH);    // éteinds la led 3
  258.      digitalWrite(ledPin4, LOW);     // allume la led 4
  259.      delay(150);                     // tempo de 150ms
  260.     }
  261.     digitalWrite(ledPin2, HIGH);     // éteinds la led 2
  262.     digitalWrite(ledPin4,HIGH);      // éteinds la led 4
  263.     noTone(buzerPin);
  264.     delay(500);
  265. }
  266.  void musique_chenillard_droite()
  267. {
  268.      tone(buzerPin,4000);
  269.      digitalWrite(ledPin4, LOW);    // allume la led 4
  270.      delay(100);                  // waits for a second
  271.      digitalWrite(ledPin4, HIGH);   // éteinds la led 4
  272.      noTone(buzerPin);
  273.      tone(buzerPin,4100);
  274.      digitalWrite(ledPin3, LOW);    // allume la led 3
  275.      delay(100);                  // waits for a second
  276.      digitalWrite(ledPin3, HIGH);   // éteinds la led 3
  277.      noTone(buzerPin);
  278.      tone(buzerPin,4200);
  279.      digitalWrite(ledPin2, LOW);    // allume la led 2
  280.      delay(100);                  // waits for a second
  281.      digitalWrite(ledPin2, HIGH);   // éteinds la led 2
  282.      noTone(buzerPin);
  283.      tone(buzerPin,4300);
  284.      digitalWrite(ledPin1, LOW);    // allume la led 1
  285.      delay(100);                  // waits for a second
  286.      digitalWrite(ledPin1, HIGH);   // éteinds la led 1
  287.      noTone(buzerPin);
  288.      delay(100);
  289.  }
  290.   void musique_chenillard_gauche()
  291. {
  292.      tone(buzerPin,4000);
  293.      digitalWrite(ledPin1, LOW);    // allume la led 1
  294.      delay(100);                  // waits for a second
  295.      digitalWrite(ledPin1, HIGH);   // éteinds la led 1
  296.      noTone(buzerPin);
  297.      tone(buzerPin,4100);
  298.      digitalWrite(ledPin2, LOW);    // allume la led 1
  299.      delay(100);                  // waits for a second
  300.      digitalWrite(ledPin2, HIGH);   // éteinds la led 1
  301.      noTone(buzerPin);
  302.      tone(buzerPin,4200);
  303.      digitalWrite(ledPin3, LOW);    // allume la led 1
  304.      delay(100);                  // waits for a second
  305.      digitalWrite(ledPin3, HIGH);   // éteinds la led 1
  306.      noTone(buzerPin);
  307.      tone(buzerPin,4300);
  308.      digitalWrite(ledPin4, LOW);    // allume la led 1
  309.      delay(100);                  // waits for a second
  310.      digitalWrite(ledPin4, HIGH);   // éteinds la led 1
  311.      noTone(buzerPin);
  312.      delay(100);
  313.  }
  314.  
  315.  // fonction appelée pour la fin d'une liste
  316.  // correctement renseignée jusqu'au bout
  317.  void musique_partie_gagnee()
  318.  {
  319.     musique_chenillard_gauche();
  320.     musique_chenillard_droite();
  321.     musique_chenillard_gauche();
  322.     musique_chenillard_droite();
  323.  }
  324.  
  325.  // fonction appelée pour la fin de toutes les parties
  326.  void musique_fin_jeu()
  327. {
  328.    for (int i=1; i <= 3; i++)
  329.    {
  330.    musique_chenillard_gauche();
  331.    musique_mauvaise_reponse();
  332.    musique_depassement_temps();
  333.    musique_chenillard_droite();
  334.    }
  335. }
  336.  
  337.  
  338.  
  339. void setup()
  340. {
  341.   pinMode(ledPin1,OUTPUT);
  342.   pinMode(ledPin2,OUTPUT);
  343.   pinMode(ledPin3,OUTPUT);
  344.   pinMode(ledPin4,OUTPUT);
  345.  
  346.   pinMode(buzerPin,OUTPUT);
  347.  
  348.   pinMode(reponse1, INPUT_PULLUP);   //init de la résistance de pull up sur l'entrée BP 1
  349.   pinMode(reponse2, INPUT_PULLUP);   //init de la résistance de pull up sur l'entrée BP 1
  350.   pinMode(reponse3, INPUT_PULLUP);   //init de la résistance de pull up sur l'entrée BP 1
  351.   pinMode(reponse4, INPUT_PULLUP);   //init de la résistance de pull up sur l'entrée BP 1
  352.  
  353.   digitalWrite(ledPin1, HIGH);       // éteinds la led 1
  354.   digitalWrite(ledPin2, HIGH);       // éteinds la led 2
  355.   digitalWrite(ledPin3, HIGH);       // éteinds la led 3
  356.   digitalWrite(ledPin4, HIGH);       // éteinds la led 4
  357.  
  358.   noTone(buzerPin);                  // éteinds le buzer
  359.  
  360.   compteur_listes=0;
  361.   nombre_listes = 3;                    // nombre de parties
  362.   longueur_liste = 5;                   // longueur d'une partie
  363.   temps_alloue = 3000;                // 3 secondes allouées pour tout appui sur les BP
  364.   flag_3_erreur = 0;                   // compteur des 3 erreurs acceptées au maxi
  365.   for ( int f = 0; f <=30;f++)       // reset des tableau de mémorisation
  366.   {                                  // des chiffres tirés au hazard
  367.   tableau_random[f]=0;               // et des chiffres donnés en réponse
  368.   tableau_reponses[f]=0;             // par le joueur
  369.   }
  370.  
  371. compteur_listes = nombre_listes * longueur_liste;
  372. Serial.begin(9600);                  //i,it de la liaison série
  373. }
  374.  
  375. void loop()
  376. {
  377.   for ( f = 1; f <= compteur_listes;f ++)
  378.   {
  379.     Serial.print(".....f =  ");  
  380.   Serial.print(f);
  381.   Serial.println('\r');
  382.  
  383. debut_programme:
  384.       if (compteur == longueur_liste)
  385.         {
  386.           musique_partie_gagnee();
  387.           compteur=0;erreur_T=0;
  388.         }
  389.       tone(buzerPin,4300,500);            // bip avant tirage au sort d'un chiffre de la liste au hazard
  390.       delay(1200);                         // tempo de 300 mili-seconde
  391.       if (compteur == 0)
  392.         {
  393.   Serial.println('\r');
  394.   Serial.print("debut du programme......nouvelle partie............");
  395.   Serial.println('\r');        
  396.        //digitalWrite(buzerPin, LOW);     // allume la led buzer
  397.        //delay(500);                      // attente 500 ms
  398.        //digitalWrite(buzerPin, HIGH);    // éteinds la led buzer
  399.        //delay(500);                      // attente 500 ms
  400.         erreur_T = 0;
  401.         }
  402.          
  403.       joue_tableau_random(compteur);      //affiche les nombres aléatoires déjà tirés
  404.       compteur ++;                        //incrémente le compteur de nombres aléatoires
  405.   Serial.println('\r');
  406.   Serial.print("compteur ");  
  407.   Serial.print(compteur);
  408.   Serial.println('\r');
  409.  
  410.       nombre = random(1, 5);               // tire un nombre aléatoire entre 1 et 4
  411.       tableau_random[compteur] = nombre;   // initialise la case correspondante dans le tableau de mémorisation
  412.       affichage_leds(nombre);              // allume la led correspondant au nombre aléatoire qui vient d'etre tiré
  413.       saisie_reponse();                    // saut en routine de saisie des appui sur BP par le joueur
  414.      if (erreur_T==3)
  415.        {
  416.          compteur=0;
  417.          erreur_T=0;
  418.          goto debut_programme;
  419.        }
  420.       musique_bonne_suite();               // affiche les leds et bips selon séquence bonne réponse pour toute la suite  
  421.    
  422.    
  423.     Serial.println('\r');
  424.   Serial.print(".........................compteur listes  ");  
  425.   Serial.print(compteur_listes);
  426.   Serial.print(".....f =  ");  
  427.   Serial.print(f);
  428.   Serial.println('\r');
  429.   if (f == compteur_listes)
  430.         {
  431.           musique_fin_jeu();
  432.           compteur=0;erreur_T=0;//musique_fin_jeu();
  433. attente_raz_micro:
  434.         goto attente_raz_micro;
  435.         }
  436. }
  437. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement