Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Problème code dans les variables

Sujet résolu
    8 août 2012 à 19:57:45

    Bonjour chers Arduiniens,

    Dans mon projet de domotique, un module principal (branché sur ma box) envoie une commande sans fil grâce à la libraire VirtualWire, puis le module recevant exécute une action en fonction de la commande envoyée.

    Dans l'exemple de cette libraire (sur lequel je me base), la commande reçue est affichée grâce à la fonction Serial.print, sauf que dans mon cas, j'aimerais stocker la commande reçue dans une variable puis la comparer à des mots clés qui permettent de définir l'action à mener.

    Mais je n'y arrive pas ! Un peu d'aide svp ?! :euh:
    *1 à la fin de for, Serial.print affiche la totalité de la commande. Comment peut-on la stocker dans la variable msg ?

    Voici mon code :
    #include <VirtualWire.h>
    
    boolean etat;
    const char msg;
    
    void setup()
    {
      Serial.begin(9600);
      vw_setup(2000); 
      vw_rx_start(); 
      etat = 1;
      msg = 0;
    }
    
    void loop()
    {
      uint8_t buf[VW_MAX_MESSAGE_LEN];
      uint8_t buflen = VW_MAX_MESSAGE_LEN;
      if (vw_get_message(buf, &buflen))
      {
        int i;
        for (i = 0; i < buflen; i++)
         {
           Serial.print(buf[i], HEX); //*1
         }
        if(msg == "5")
        {
          digitalWrite(9, etat);
          etat = !etat;
        }
      }
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
    Faites un tour sur www.nawrasg.fr :)
      8 août 2012 à 22:10:20

      Ton message est déjà dans une variable qui est le tableau "buf"... (qui est un tableau de uint8_t, qui je pense doit etre un typedef de char...)
      Tu peux ensuite faire des comparaisons avec la fonction "strcmp" (string compare) par exemple...
      • Partager sur Facebook
      • Partager sur Twitter
        8 août 2012 à 22:40:59

        Si tout le message se trouve dans buf, pourquoi le décortiquer avec la fonction for ?!

        Pour strcmp, elle s'utilise de cette manière ? :

        if (strcmp(buf, "exemple") == 0)

        J'ai essayé avec ce code mais rien ne se passe :(
        #include <VirtualWire.h>
        
        boolean etat;
        char msg[10];
        
        void setup()
        {
          Serial.begin(9600);
          vw_setup(2000); 
          vw_rx_start(); 
          etat = 1;
        }
        
        void loop()
        {
          uint8_t buf[VW_MAX_MESSAGE_LEN];
          uint8_t buflen = VW_MAX_MESSAGE_LEN;
          if (vw_get_message(buf, &buflen))
          {
            int i;
            for (i = 0; i < buflen; i++)
             {
               Serial.print(buf[i], HEX);
               msg[i] = buf[i];
             }
            if(msg[1] == 5)
            {
              digitalWrite(9, etat);
              etat = !etat;
            }
          }
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
        Faites un tour sur www.nawrasg.fr :)
          9 août 2012 à 13:48:55

          Tu essais de comparer avec quoi comme "valeur de commande possible" ?
          • Partager sur Facebook
          • Partager sur Twitter
            9 août 2012 à 21:16:15

            Le module principal envoie une commande x? dont ? est égale à 1 jusqu'à 5 en fonction des pièces pour allumer la lumière. (5 dans l'exemple)
            • Partager sur Facebook
            • Partager sur Twitter
            Faites un tour sur www.nawrasg.fr :)
              9 août 2012 à 21:27:11

              Alors pour tester 5 fait
              msg[1] == '5'
              plutôt que
              msg[1] == 5

              Le premier test avec le caractère 5 tandis que le second test avec la valeur 5, c'est différent !
              • Partager sur Facebook
              • Partager sur Twitter
                10 août 2012 à 0:30:01

                Toujours rien ! Je dois avouer que ça commence à être un peu frustrant !!!
                J'ai même essayé avec une condition toute simple qu'il soit différent de 5 mais toujours rien !
                • Partager sur Facebook
                • Partager sur Twitter
                Faites un tour sur www.nawrasg.fr :)
                  10 août 2012 à 11:03:56

                  Si tu es frustré pour si peu va ptet falloir changer de boulot ^^

                  ton Serial.print il affiche quoi exactement ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 août 2012 à 11:54:00

                    Bonjour,
                    Pourquoi mettre buf dans msg ?
                    Essaye ce code :
                    #include <VirtualWire.h>
                    
                    void setup()
                    {
                      Serial.begin(9600);
                      vw_setup(2000); 
                      vw_rx_start(); 
                    }
                    
                    void loop()
                    {
                      uint8_t buf[VW_MAX_MESSAGE_LEN];
                      uint8_t buflen = VW_MAX_MESSAGE_LEN;
                      if (vw_get_message(buf, &buflen))
                      {
                        int i;
                        for (i = 0; i < buflen; i++)
                         {
                           Serial.print(buf[i], HEX);
                         }
                        if(buf[1] == 5)
                        {
                          Serial.print("5");
                        }
                      }
                    }
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                    2b||!2b   sqrt(4b²)
                      10 août 2012 à 14:11:59

                      Le problème c'est que le récepteur est un DIY donc impossible de voir un écran le Serial.print !

                      Pour y remédier, j'attends de recevoir les condensateurs qui me manquent pour monter un émetteur DIY et pouvoir utiliser mon arduino avec le même code que le récepteur DIY et donc afficher le contenu Serial !

                      Frustré parce qu'à chaque changement de code, je dois démonter les 2 microcontrôleurs (arduino et DIY), uploader le nouveau puis les ré-installer :-°

                      By the way, c'est quoi la différence entre caractère et valeur ?! (pour le post un peu plus haut)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Faites un tour sur www.nawrasg.fr :)
                        11 août 2012 à 0:21:07

                        Un caractère à une valeur particulière XD

                        Plus clairement, une variable 'a' vaut 5, on peut donc dire que sa valeur est de 5 (la valeur stockée en mémoire est 5).
                        Une variable 'b' vaut le caractère '5', sa valeur est "le caractère 5" mais en terme informatique sa valeur est "le code ascii du caractère '5'" (soit une valeur stockée en mémoire de 53).
                        Donc tester avec 5 (le chiffre) ou avec '5' (le caractère) se n'est pas la même chose.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          11 août 2012 à 22:57:52

                          J'ai essayé avec ce code et bizarrement ça fonctionne o_O

                          #include <VirtualWire.h>
                          
                          boolean etat;
                          
                          void setup()
                          {
                            Serial.begin(9600);
                            vw_setup(2000); 
                            vw_rx_start(); 
                            etat = 1;
                            pinMode(9, OUTPUT);
                            
                          }
                          
                          void loop()
                          {
                            uint8_t buf[VW_MAX_MESSAGE_LEN];
                            uint8_t buflen = VW_MAX_MESSAGE_LEN;
                            if (vw_get_message(buf, &buflen))
                            {
                              if (buf[0] == 'x' && buf[1] == '5')
                              {
                                digitalWrite(9, etat);
                                etat = !etat;
                              } 
                            } 
                          }
                          
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Faites un tour sur www.nawrasg.fr :)
                            11 août 2012 à 23:01:00

                            Pourquoi bizarrement ? Comme je te l'ai indiqué plus tôt ta variable 'buf' devait surement etre un type char (renommé) donc c'est plutot logique que le test fonctionne ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              11 août 2012 à 23:13:24

                              D'accord !
                              En cherchant un peu, j'ai trouvé la fonction atoi, je présume qu'on peut l'utiliser pour pouvoir travailler avec des chiffres ?!
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Faites un tour sur www.nawrasg.fr :)
                                12 août 2012 à 0:18:24

                                ouaip, pas forcément utile dans ton cas (encore que) mais sinon effectivement atoi prend en parametre la chaine de caractère (pointeur sur un char) et retourne un int (le nombre trouvé)...
                                (attention, il faut que la chaine finisse correctement par un '\0' pour être sur de fonctionner, sinon ca plante (exemple)).
                                • Partager sur Facebook
                                • Partager sur Twitter

                                [Arduino] Problème code dans les variables

                                × 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