Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] TP zParking

test du code

Sujet résolu
    28 septembre 2013 à 20:40:44

    Bonjour à tous,

    Je viens de coder ce TP mais n'ayant pas ma carte actuellement je ne peux le tester.

    Quelqu'un peut-il me dire au moins s'il est bien codé? J'ai un doute sur les interruptions.

    merci d'avance.

    // Interruptions
    const int bp_In = 2;
    const int bp_Out = 3;
    
    // Afficheurs
    const int bit_A = 5;
    const int bit_B = 6;
    const int bit_C = 7;
    const int bit_D = 8;
    const int alim_Dizaine = 9;
    const int alim_Unite = 10;
    
    // Leds
    const int led_Rouge = 12;
    const int led_Verte = 13;
    
    // Divers
    long temps = 0;
    boolean afficheur = false;
    char place_Dispo = 99;
    
    void setup()
    {
      // Gestion des sorties
      pinMode(bit_A, OUTPUT);
      pinMode(bit_B, OUTPUT);
      pinMode(bit_C, OUTPUT);
      pinMode(bit_D, OUTPUT);
      pinMode(led_Rouge, OUTPUT);
      pinMode(led_Verte, OUTPUT);
    
      digitalWrite(bit_A, LOW);
      digitalWrite(bit_B, LOW);
      digitalWrite(bit_C, LOW);
      digitalWrite(bit_D, LOW);
      digitalWrite(alim_Dizaine, LOW);
      digitalWrite(alim_Unite, LOW);
    
      digitalWrite(led_Rouge, HIGH);
      digitalWrite(led_Verte, HIGH);
      
      // Interruptions
      attachInterrupt(0, compte_Place, LOW); // bp_In
      attachInterrupt(1, compte_Place, LOW); // bp_Out
    }
    
    void loop()
    {
      allume_Led(place_Dispo);
      
      // Rafraichissement de l'affichage toutes les 10ms
      if((millis() - temps) > 10)
      {
        afficheur = !afficheur;
        affiche_Place(place_Dispo, afficheur);
        temps = millis();
      }
    }
    
    void allume_Led(char nombre)
    {
      digitalWrite(led_Rouge, HIGH); 
      digitalWrite(led_Verte, HIGH);
    
      if(nombre == 0) // Le parking est plein
      {
        digitalWrite(led_Rouge, LOW);
      }
      else
      {
        digitalWrite(led_Verte, LOW);
      }
    }
    
    void affiche_Place(char nombre, boolean etat)
    {
      char unite = 0, dizaine = 0;
      
      if(nombre > 9)
        dizaine = nombre / 10;
      
      unite = nombre - (dizaine * 10);
      
      if(etat)
      {
        digitalWrite(alim_Unite, LOW);
        afficher(dizaine);
        digitalWrite(alim_Dizaine, HIGH);
      }
      else
      {
        digitalWrite(alim_Dizaine, LOW);
        afficher(unite);
        digitalWrite(alim_Unite, HIGH);
      }
    }
    
    void afficher(char chiffre)
    {
      if(chiffre >= 8)
      {
        digitalWrite(bit_D, HIGH);
        chiffre = chiffre - 8;
      }
      if(chiffre >= 4)
      {
        digitalWrite(bit_C, HIGH);
        chiffre = chiffre - 4;
      }
      if(chiffre >= 2)
      {
        digitalWrite(bit_B, HIGH);
        chiffre = chiffre - 2;
      }
      if(chiffre >= 1)
      {
        digitalWrite(bit_A, HIGH);
        chiffre = chiffre - 1;
      }
    }
    
    void compte_Place()
    {
      if(digitalRead(bp_In) == LOW)
      {
        place_Dispo--;
        if(place_Dispo < 0)
          place_Dispo = 0;
      }
    
      if(digitalRead(bp_Out) == LOW)
      {
        place_Dispo++;
        if(place_Dispo > 99)
          place_Dispo = 99;
      }
    }

    PS: Je viens de corriger quelques petites erreurs.

    -
    Edité par stoads 29 septembre 2013 à 15:05:06

    • Partager sur Facebook
    • Partager sur Twitter

    Celui qui aime à apprendre est bien près du savoir " Confucius

      30 septembre 2013 à 18:54:55

      Bonjour,je viens de commander le matos pour le cours.

      J'attends que ça arrive pour le bosser en détail.

      un truc me chagrine :

      if(nombre > 9)
      dizaine = nombre / 10;

      ça m'étonnerai que ça marche, ou si ça tolère c'est pas élégant. Je pense que si le résultat est supérieur à 1,5, calé dans un entier tu auras 2.

      un indice : sert toi du modulo.

      Pas besoin d'initialiser unite et dizaine non plus puisque tu les écrases juste derrière. En électronique, l'économie est la norme :). (dîtes le moi si je me trompe)

      -
      Edité par Julien Grall 30 septembre 2013 à 18:58:27

      • Partager sur Facebook
      • Partager sur Twitter
        12 octobre 2013 à 12:26:12

        Julien Grall a écrit:

        un truc me chagrine :

        if(nombre > 9)
        dizaine = nombre / 10;

        ça m'étonnerai que ça marche, ou si ça tolère c'est pas élégant. Je pense que si le résultat est supérieur à 1,5, calé dans un entier tu auras 2.

        un indice : sert toi du modulo.


        Non, je ne pense pas, il gardera en mémoire le chiffre des dizaines c'est à dire 1 pour ton exemple.

        Le modulo est le restant de la division et c'est pas ce que je veux.

        L'initialisation des variables: C'est une règle de base que j'ai toujours appris et je l'applique.

        • Partager sur Facebook
        • Partager sur Twitter

        Celui qui aime à apprendre est bien près du savoir " Confucius

          20 octobre 2013 à 20:55:50

          Bonsoir à tous,

          Mes interruptions ne fonctionnant pas j'ai simplifié mon code afin de comprendre:

          // Interruptions
          const int bp_In = 2;
          const int bp_Out = 3;
          
          // Afficheurs
          const int bit_A = 7;
          const int bit_B = 8;
          const int bit_C = 9;
          const int bit_D = 10;
          const int bit_E = 11;
          const int bit_F = 12;
          const int bit_G = 13;
          
          // Leds
          //const int led_Rouge = 12;
          //const int led_Verte = 13;
          
          // Nombre de place disponible
          int placeDispo = 9;
          
          void setup()
          {
            // Gestion des sorties
            pinMode(bit_A, OUTPUT);
            pinMode(bit_B, OUTPUT);
            pinMode(bit_C, OUTPUT);
            pinMode(bit_D, OUTPUT);
            pinMode(bit_E, OUTPUT);
            pinMode(bit_F, OUTPUT);
            pinMode(bit_G, OUTPUT);
            
            //pinMode(led_Rouge, OUTPUT);
            //pinMode(led_Verte, OUTPUT);
          
            digitalWrite(bit_A, HIGH);
            digitalWrite(bit_B, HIGH);
            digitalWrite(bit_C, HIGH);
            digitalWrite(bit_D, HIGH);
            digitalWrite(bit_E, HIGH);
            digitalWrite(bit_F, HIGH);
            digitalWrite(bit_G, HIGH);
          
            //digitalWrite(led_Rouge, HIGH);
            //digitalWrite(led_Verte, HIGH);
            
            // Interruptions
            attachInterrupt(0, vehiculeIn, LOW); // bp_In
            attachInterrupt(1, vehiculeOut, LOW); // bp_Out
          }
          
          void loop(){
            
            affichePlace(placeDispo);
            
          }
          
          void vehiculeIn(){
            
            if(digitalRead(bp_In) == LOW){
              placeDispo -= 1;
              
              if(placeDispo < 0)
                placeDispo = 0;
            }
            
          }
          
          void vehiculeOut(){
            
            if(digitalRead(bp_Out) == LOW){
              placeDispo += 1;
            
              if(placeDispo > 9)
                placeDispo = 9;
            }  
            
          }
          
          void affichePlace(int nombre){
            switch (nombre){
              case 0:
              digitalWrite(bit_A, LOW);
              digitalWrite(bit_B, LOW);
              digitalWrite(bit_C, LOW);
              digitalWrite(bit_D, LOW);
              digitalWrite(bit_E, LOW);
              digitalWrite(bit_F, LOW);
              digitalWrite(bit_G, HIGH);
              break;
              case 1:
              digitalWrite(bit_A, HIGH);
              digitalWrite(bit_B, LOW);
              digitalWrite(bit_C, LOW);
              digitalWrite(bit_D, HIGH);
              digitalWrite(bit_E, HIGH);
              digitalWrite(bit_F, HIGH);
              digitalWrite(bit_G, HIGH);
              break;
              case 2:
              digitalWrite(bit_A, LOW);
              digitalWrite(bit_B, LOW);
              digitalWrite(bit_C, HIGH);
              digitalWrite(bit_D, LOW);
              digitalWrite(bit_E, LOW);
              digitalWrite(bit_F, HIGH);
              digitalWrite(bit_G, LOW);
              break;
              case 3:
              digitalWrite(bit_A, LOW);
              digitalWrite(bit_B, LOW);
              digitalWrite(bit_C, LOW);
              digitalWrite(bit_D, LOW);
              digitalWrite(bit_E, HIGH);
              digitalWrite(bit_F, HIGH);
              digitalWrite(bit_G, LOW);
              break;
              case 4:
              digitalWrite(bit_A, HIGH);
              digitalWrite(bit_B, LOW);
              digitalWrite(bit_C, LOW);
              digitalWrite(bit_D, HIGH);
              digitalWrite(bit_E, HIGH);
              digitalWrite(bit_F, LOW);
              digitalWrite(bit_G, LOW);
              break;
              case 5:
              digitalWrite(bit_A, LOW);
              digitalWrite(bit_B, HIGH);
              digitalWrite(bit_C, LOW);
              digitalWrite(bit_D, LOW);
              digitalWrite(bit_E, HIGH);
              digitalWrite(bit_F, LOW);
              digitalWrite(bit_G, LOW);
              break;
              case 6:
              digitalWrite(bit_A, HIGH);
              digitalWrite(bit_B, HIGH);
              digitalWrite(bit_C, LOW);
              digitalWrite(bit_D, LOW);
              digitalWrite(bit_E, LOW);
              digitalWrite(bit_F, LOW);
              digitalWrite(bit_G, LOW);
              break;
              case 7:
              digitalWrite(bit_A, LOW);
              digitalWrite(bit_B, LOW);
              digitalWrite(bit_C, LOW);
              digitalWrite(bit_D, HIGH);
              digitalWrite(bit_E, HIGH);
              digitalWrite(bit_F, HIGH);
              digitalWrite(bit_G, LOW);
              break;
              case 8:
              digitalWrite(bit_A, LOW);
              digitalWrite(bit_B, LOW);
              digitalWrite(bit_C, LOW);
              digitalWrite(bit_D, LOW);
              digitalWrite(bit_E, LOW);
              digitalWrite(bit_F, LOW);
              digitalWrite(bit_G, LOW);
              break;
              case 9:
              digitalWrite(bit_A, LOW);
              digitalWrite(bit_B, LOW);
              digitalWrite(bit_C, LOW);
              digitalWrite(bit_D, LOW);
              digitalWrite(bit_E, HIGH);
              digitalWrite(bit_F, LOW);
              digitalWrite(bit_G, LOW);
              break;
            }
          }
              

          Voici mon problème:

          lorsque j'appuie sur bp_In, l'afficheur affiche 0;

          lorsque j'appuie sur bp_Out, l'afficheur affiche 9.

          Question:

          pourquoi ma variable placeDispo ne décrémente pas ou incrémente pas de 1?

          Merci pour votre aide.

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui aime à apprendre est bien près du savoir " Confucius

            20 octobre 2013 à 21:36:41

            Peut-être parce que ton bouton est LOW à chaque cycle où tu appuies dessus, donc à chaque cycle tu appelles tes fonctions qui incrémentent ou décrémentent.

            EDIT:

            http://arduino.cc/en/Reference/attachInterrupt

            Essai avec FALLING, ta fonction sera appelée uniquement au passage de HIGH vers LOW (on appelle ça aussi un front descendant)

            EDIT2:

            Tu peux aussi appeler ta fonction d'affichage à la fin de tes fonctions vehiculeIN et OUT. Comme ça tu la retires de ta loop().

            Quel intérêt de lancer la fonction d'affichage si la valeur de change pas :).

            -
            Edité par Julien Grall 20 octobre 2013 à 22:26:22

            • Partager sur Facebook
            • Partager sur Twitter
              22 octobre 2013 à 20:59:16

              Bonsoir Julien,

              un grand merci pour tes informations, cela rejoint ce que j'avais vu, en tout cas pour le FALLING. Quelle erreur stupide de ma part!

              Julien Grall a écrit:

              EDIT2:

              Tu peux aussi appeler ta fonction d'affichage à la fin de tes fonctions vehiculeIN et OUT. Comme ça tu la retires de ta loop().

              Quel intérêt de lancer la fonction d'affichage si la valeur de change pas :).

              -
              Edité par Julien Grall le 20 octobre 2013 à 22:26:22


              L'intérêt est de voir constamment le nombre de place disponible. Non?! Ou je me trompe?

              Merci à toi en tout cas. 

              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui aime à apprendre est bien près du savoir " Confucius

                23 octobre 2013 à 11:52:22

                Bonsoir, oui mais dans ta loop, ta fonction affichage va être faite à chaque cycle, alors que ta valeur change uniquement quand ton véhicule entre ou sort.

                Essai tu verras. Met l'appel de ta fonction à la fin de ton setup, et à la fin de tes deux fonctions IN et OUT, puis retire la de ta loop.

                -
                Edité par Julien Grall 23 octobre 2013 à 11:56:40

                • Partager sur Facebook
                • Partager sur Twitter
                  24 octobre 2013 à 21:06:32

                  Bonsoir Julien,

                  Je vais suivre tes conseils. Je te tiens au courant.

                   Merci.

                  EDIT 1:

                  OK j'ai saisie la subtilité.

                  Si je peux me permettre une petite question au passage? Le mieux dans la définition est de coder:

                  #define bit_A 7
                  
                  // OU
                  
                  const int bit_A = 7;



                  -
                  Edité par stoads 24 octobre 2013 à 21:22:56

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Celui qui aime à apprendre est bien près du savoir " Confucius

                    24 octobre 2013 à 21:40:08

                    Pour moi c'est fissa fissa, dans les deux cas ça te déclarera pas de variable en mémoire, mais en dur dans ton code compilé.

                    Traditionnellement, je réserve le #define pour du paramétrage, et const int pour le reste ou du "localisé".

                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 octobre 2013 à 13:17:24

                      OK merci Julien.

                      Je clos le post.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Celui qui aime à apprendre est bien près du savoir " Confucius

                      [Arduino] TP zParking

                      × 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