Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Besoin d'aide pour mon programme

    8 septembre 2017 à 16:56:27

    Bonjour à tous ! Je suis actuellement sur un petit projet à l'aide d'arduino dans le but de m'améliorer, n'ayant réaliser jusqu'ici que de petits projets, principalement tirés du livre obtenu dans le kit débutant.

    Le principe est simple, le branchement est le suivant: 

    http://image.noelshack.com/fichiers/2017/36/5/1504882577-img-0089.jpg

    On voit pas grand chose mais de toute manière je pense qu'il est correct et mon gros problème se situe dans le code ^^

    Et donc le but est qu'au branchement de l'arduino, les 3 LEDs bleues font une série au hasard (par exemple milieu - bas - haut) bon là avec 3 LEDs il n'y a que 6 possibilités mais c'est simplement pour débuter. Après que cette série soit faite, on doit refaire la même série à l'aide des 3 boutons poussoirs. Et enfin soit la série est bonne dans ce cas là, la led verte s'allume, soit elle est fausse et la led rouge s'allume. Et on recommence à chaque fois, ce projet est donc semblable au jeu pour enfant où ils doivent appuyer sur les bonnes couleurs en fonction d'une série faite juste avant.

    Voici le code: 

    //Déclaration des variables globales
    const int pinLedBleu1 = 7;
    const int pinLedBleu2 = 6;
    const int pinLedBleu3 = 5;
    const int pinLedVerte = 4;
    const int pinLedRouge = 3;
    const int pinBouton1 = 8; 
    const int pinBouton2 = 9;
    const int pinBouton3 = 10;
    int etatBouton1; 
    int etatBouton2; 
    int etatBouton3;
    int randomLed1; 
    int randomLed2; 
    int randomLed3;
    String randomLettre1; 
    String randomLettre2; 
    String randomLettre3; 
    String resultatSerie;
    String resultatBouton;
    
    void setup() {
    
      //OUTPUT pour les 5 leds 
      for(int i=3; i<8; i++) { 
        pinMode(i, OUTPUT);
      }
    
      //INPUT pour les 3 boutons
      for(int j=8; j<11; j++) {
        pinMode(j, INPUT);
      }  
    Serial.begin(9600);
    }
    
    void loop() {
    
      //On allume une première LED au hasard
      randomLed1 = random(5, 8); 
      digitalWrite(randomLed1, HIGH);
      delay(500);
      digitalWrite(randomLed1, LOW);
      switch(randomLed1) {
        case 5:
        randomLettre1 = "c";
        break; 
        case 6: 
        randomLettre1 = "b";
        break;
        case 7:
        randomLettre1 = "a";
        break;
      }
    
      //On allume une deuxième LED au hasard 
      do {
      randomLed2 = random(5, 8); 
      if(randomLed2 != randomLed1) {
        digitalWrite(randomLed2, HIGH);
        delay(500);
        digitalWrite(randomLed2, LOW);
        switch(randomLed2) {
        case 5:
        randomLettre2 = "c";
        break; 
        case 6: 
        randomLettre2 = "b";
        break;
        case 7:
        randomLettre2 = "a";
        break;
      }
      }
      } while(randomLed2 == randomLed1);
     
    
      //On allume une troisième LED au hasard
      do {
        randomLed3 = random(5, 8); 
        if(randomLed3 != randomLed2 && randomLed3 != randomLed1) {
        digitalWrite(randomLed3, HIGH);
        delay(500);
        digitalWrite(randomLed3, LOW);
         switch(randomLed3) {
        case 5:
        randomLettre3 = "c";
        break; 
        case 6: 
        randomLettre3 = "b";
        break;
        case 7:
        randomLettre3 = "a";
        break;
        }
        }
      } while(randomLed3 == randomLed2 || randomLed3 == randomLed1);
         
      resultatSerie = randomLettre1 + randomLettre2 + randomLettre3; 
    
      etatBouton1 = digitalRead(pinBouton1);
      etatBouton2 = digitalRead(pinBouton2);
      etatBouton3 = digitalRead(pinBouton3);
    
     Serial.println("Résultat série:" + resultatSerie); //Test console
    
    while(resultatBouton.length() < resultatSerie.length()) {
     //*****************************************************
     } 
    
     Serial.println("Résultat bouton:" + resultatBouton); //Test console
     }
    
    //On vérifie si le résultat est bon ou pas. SI OUI -> Led verte /// SI NON -> Led Rouge
    if(resultatBouton == resultatSerie) {
     digitalWrite(pinLedVerte, HIGH);
        delay(2000);
        digitalWrite(pinLedVerte, LOW);
        delay(2000);
    }
    else {
      digitalWrite(pinLedRouge, HIGH); 
      delay(2000);
      digitalWrite(pinLedRouge, LOW);
      delay(2000);
    }
    }

    Bon comme vous pouvez le constater le code est pas très commenté alors je vais expliquer ici, de toute façon mon problème est concentré sur une partie précise du code et non le code dans sa globalité. Tout d'abord j'initialise toutes les variables dont j'aurais besoin pour éviter d'avoir à le faire à chaque passage dans la boucle. Dans le setup j'initialise simplement chaque pin en OUTPUT pour les LEDs et INPUT pour les boutons poussoirs. Dans la loop, au début je fais la série au hasard en m'assurant qu'une même led ne clignote pas deux fois, et je donne à chaque fois une lettre pour qu'au final on est une série de trois lettres (abc, acb, bac, bca, ...) que je mets dans une variable resultatSerie et qui permettra par la suite de vérifier si la série faite sur les boutons est bonne. Jusque là tout va bien. Le Serial.println() c'est simplement un test pour vérifier qu'on obtient bien la série de lettres. Et après c'est là mon problème (là où j'ai commenté //*********************), le moment où le joueur doit faire la série sur les boutons poussoirs. Je souhaiterais qu'en appuyant sur les boutons on obtienne une série de trois lettres à nouveau (avant de la comparer à resultatSerie en fin de code). Seulement je ne sais pas du tout comment m'y prendre, quand je mets des conditions qui ajoutent une lettre à resultatBoutons lorsque l'on appuie sur l'un d'eux, le while provoque une boucle infinie et appuyer sur les boutons ne fais rien. Je ne vois pas comment je pourrais "stopper" le code afin que le joueur puisse appuyer sur une série de boutons :/ 

    Auriez-vous une aide à m'apporter ? Si vous avez besoin d'informations supplémentaires il n'y a aucun problème. 

    Merci d'avance, Sam. 

    -
    Edité par Krelaw 8 septembre 2017 à 16:59:24

    • Partager sur Facebook
    • Partager sur Twitter

    Our democracy has been hacked

      9 septembre 2017 à 17:23:46

      Bonjour

      Dans la boucle

      while(resultatBouton.length() < resultatSerie.length()) {
       //*****************************************************
       }

      il n'y a aucune action, la condition ne peut donc jamais changer et la boucle devient infinie.

      • Partager sur Facebook
      • Partager sur Twitter
        9 septembre 2017 à 18:15:16

        clgbzh a écrit:

        Bonjour

        Dans la boucle

        while(resultatBouton.length() < resultatSerie.length()) {
         //*****************************************************
         }

        il n'y a aucune action, la condition ne peut donc jamais changer et la boucle devient infinie.

        Non mais justement le commentaire c'était pour indiquer que c'est là que ce situe mon problème ^^ J'avais mis un code DANS LA BOUCLE du genre: 

        if(etatBouton1 == 1) {

        resultatBouton += "a";

        }

        idem pour le bouton 2 et le bouton 3, pour que le joueur puisse faire la série de 3 lettres à l'aide des boutons, seulement les instructions sont comme "obsolètes" puisque ma boucle est infinie. Seulement je ne vois pas d'autre solution :/ 

        -
        Edité par Krelaw 9 septembre 2017 à 18:16:29

        • Partager sur Facebook
        • Partager sur Twitter

        Our democracy has been hacked

          9 septembre 2017 à 21:05:33

          Il faut donc mettre exactement ce qu'il y a dans la boucle, sinon ça va être difficile de trouver.
          • Partager sur Facebook
          • Partager sur Twitter
            10 septembre 2017 à 21:47:36

            clgbzh a écrit:

            Il faut donc mettre exactement ce qu'il y a dans la boucle, sinon ça va être difficile de trouver.


            Je ne comprends pas, c'est-à-dire ? Justement je n'ai rien trouvé comme initiative et c'est pour ça que je pose la question ici ^^
            • Partager sur Facebook
            • Partager sur Twitter

            Our democracy has been hacked

              11 septembre 2017 à 21:57:58

              Je cite :

              Non mais justement le commentaire c'était pour indiquer que c'est là que ce situe mon problème
              J'avais mis un code DANS LA BOUCLE du genre: 

              if(etatBouton1 == 1) {
                 resultatBouton += "a";
              }

              du "genre", mais quoi exactement ?

              • Partager sur Facebook
              • Partager sur Twitter
                11 septembre 2017 à 22:26:09

                Ah très bien ^^ euh c'était donc:

                while(resultatBouton.length() < resultatSerie.length()) {
                if(etatBouton1 == 1) {
                resultatBouton += "a";
                }
                else if (etatBouton2 == 1) {
                resultatBouton += "b"; 
                }
                else if (etatBouton3 == 1) {
                resultatBouton += "c";
                }
                }
                

                Mais de toute manière ça ne fonctionnait pas, les if et else..if étant répétés très rapidement en boucle :/ 

                • Partager sur Facebook
                • Partager sur Twitter

                Our democracy has been hacked

                  12 septembre 2017 à 20:00:30

                  Les variables etatBouton1, etatBouton2, etatBouton3 ne sont pas actualisées dans la boucle (pas de lecture des boutons) les tests restent indéfiniment dans le même état, la boucle est alors infinie.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 septembre 2017 à 16:51:38

                    Effectivement c'était bien ça le problème, merci beaucoup :) J'ai mis les 3 variables dans la boucle il m'a suffit de rajouter des délais à la fin de mes if sinon à l'appuie d'un seul bouton il me mettait 3x la même lettre très rapidement et puis de réinitialiser à chaque passage dans la loop la variable resultatBouton sinon on ne rentre pas dans le while. 

                    Encore merci ;) 

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Our democracy has been hacked

                    [Arduino] Besoin d'aide pour mon programme

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown