Partage
  • Partager sur Facebook
  • Partager sur Twitter

comparer un signal 433mhz arduino

Sujet résolu
Anonyme
    30 décembre 2014 à 17:47:17

    Bonjour, je suis débutant en Arduino.

    Je suis entrain de réaliser un projet qui consiste à allumer 2 led a distance avec 2 interupteur.

    j'utilise la bibliothèque VirtualWire et une paire d'émetteur/récepteur 433mhz.

    mon problème est que je n'arrive pas a comparer le signal reçu, il entre dans le premier if quoi qu'il arrive.

    j'utilise un code pour allumer les led:

    11 -> led 1 allumer

    10 -> led 1 eteinte

    22 -> led 2 allumer

    20 -> led 2 eteinte

    mon code:

    #include <VirtualWire.h>
    
       
    
      int ledR1 = 3;
    
      int ledR2 = 4;
    
       
    
      void setup()
    
      {
    
          Serial.begin(9600); 
    
          pinMode(ledR1, OUTPUT);
    
          pinMode(ledR2, OUTPUT);
    
          vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds
    
          vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
    
      }
    
       
    
      void loop() // Fonction loop()
    
      {
    
        uint8_t buf[VW_MAX_MESSAGE_LEN]; // Tableau qui va contenir le message reçu (de taille maximum VW_MAX_MESSAGE_LEN)
    
        uint8_t buflen = VW_MAX_MESSAGE_LEN; // Taille maximum de notre tableau
    
          if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
    
          {
    
              if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
    
              {
    
                  buf[buflen] = '\0';
    
                  for (byte i = 0; i < buflen; i++) // Si il n'est pas corrompu on l'affiche via Serial
    
                   {
    
                     Serial.print(buf[i]- '0');   //Conversion ASCII des chiffres 0-9
    
                   }
    
                   
    
                   if (strcmp("11﹨0",(char*) buf)) {
    
                     digitalWrite(ledR1, HIGH);
    
                     Serial.println("led 1 allumer");
    
                   }
    
                   else if (strcmp("22﹨0",(char*) buf)) {
    
                     digitalWrite(ledR2, HIGH);
    
                     Serial.println("led 2 allumer");
    
                   }
    
                   else if (strcmp("10﹨0",(char*) buf)) {
    
                     digitalWrite(ledR1, LOW);
    
                     Serial.println("led 1 eteinte");
    
                   }
    
                   else if (strcmp("20﹨0",(char*) buf)) {
    
                     digitalWrite(ledR2, LOW);
    
                     Serial.println("led 2 eteinte");
    
                   }
    
                   else {
    
                     Serial.println("riens");
    
                   }
    
              }
    
          }
    
      }
    



    merci de vos réponses

    -
    Edité par Anonyme 31 décembre 2014 à 10:57:48

    • Partager sur Facebook
    • Partager sur Twitter
      30 décembre 2014 à 23:10:58

      Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention plus facilement.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Merci d'utiliser les balises de code



      Bonjour,

      Les forums du Site du Zéro disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source. Tu as posté un code source sans utiliser cette fonctionnalité. Édite ton message en mettant ton code en forme en utilisant le bouton Image . Si tu utilises l'éditeur en version Markdown, tu dois utiliser les balises <pre class="brush: c;">Votre code ici</pre>. Cela aura pour effet de *colorer* ton code et donc d'en faciliter grandement la lecture. Tu auras ainsi beaucoup plus de chances d'avoir des réponses. Voici un exemple de code non coloré : Citation (code C) :
      int main(int argc, char *argv[])
      {
      long choixOperation;
      
      printf("Choisissez l'operation a effectuer");
      /* etc. */
      }
      Voici maintenant le même code coloré :
      int main(int argc, char *argv[])
      {
          long choixOperation;
       
          printf("Choisissez l'operation a effectuer");
          /* etc. */
      }
      C'est plus clair n'est-ce pas ? :)

      Merci de ta compréhension.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        31 décembre 2014 à 11:30:35

        Premier point : strcmp renvoie 0 lorsque les deux chaines sont identiques.

        Du coup, si tu ne fais pas une comparaison par rapport à 0, ta condition aura l'effet inverse.

        Second point : tu n'es pas obligé de rajouter un \0 dans tes chaines de caractères de strcmp.

        Tes if devraient donc être : if (strcmp("20",(char*) buf) == 0)

        Par contre, j'avoue ne pas trop comprendre pourquoi tu utilises 2 caractères pour si peu...

        Pourquoi ne pas en utiliser un seul du genre :

        1 -> led 1 allumer
        2 -> led 1 eteinte
        3 -> led 2 allumer
        4 -> led 2 eteinte

        PS: si ton problème persiste, donne nous aussi le code de l'émetteur, il pourrait nous être utile.

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          31 décembre 2014 à 11:39:47

          Merci beaucoup, Lorio.

          ça marche.

          j'utilise 2 caractère car  je veut pouvoir faire queque chose comme ça avec le recepteur

          Quel led?         led 1

          puis je colle a la chaine l'état.

          état?               allumer donc 1

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            31 décembre 2014 à 13:06:22

            OOOuups!:-° Je me suis trompé ça marche toujours pas!

            Maintenant ça rentre dans le else quoi qu'il arrive.

            Peut-etre c'est q'un petit truc mais je suis vraiment débutant :).

              #include <VirtualWire.h>
               
              int ledR1 = 3;
              int ledR2 = 4;
            
              void setup()
              {
                  Serial.begin(9600); 
                  pinMode(ledR1, OUTPUT);
                  pinMode(ledR2, OUTPUT);
                  vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
                  vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
              }
               
              void loop() // Fonction loop()
              {
                uint8_t buf[VW_MAX_MESSAGE_LEN]; // Tableau qui va contenir le message reçu (de taille maximum VW_MAX_MESSAGE_LEN)
                uint8_t buflen = VW_MAX_MESSAGE_LEN; // Taille maximum de notre tableau
                  if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
                  {
                      if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
                      {
                          for (byte i = 0; i < buflen; i++) // Si il n'est pas corrompu on l'affiche via Serial
                           {
                             Serial.print(buf[i]- '0');   //Conversion ASCII des chiffres 0-9
                           }
                           
                           if (strcmp("11",(char*) buf) == 0) {
                             digitalWrite(ledR1, HIGH);
                             Serial.println("led 1 allumer");
                           }
                           else if (strcmp("21",(char*) buf) == 0) {
                             digitalWrite(ledR2, HIGH);
                             Serial.println("led 2 allumer");
                           }
                           else if (strcmp("10",(char*) buf) == 0) {
                             digitalWrite(ledR1, LOW);
                             Serial.println("led 1 eteinte");
                           }
                           else if (strcmp("20",(char*) buf) == 0) {
                             digitalWrite(ledR2, LOW);
                             Serial.println("led 2 eteinte");
                           }
                           else {
                             Serial.println("riens");
                           }
                      }
                  }
              }


            Merci de vos réponses.

            • Partager sur Facebook
            • Partager sur Twitter
              31 décembre 2014 à 14:15:33

              lorrio a écrit:

              PS: si ton problème persiste, donne nous aussi le code de l'émetteur, il pourrait nous être utile.

              Par contre, tu as supprimé buf[buflen] = '\0'; alors qu'il fallait impérativement le laisser.

              Je t'ai dis de supprimer le \0 de tes chaines strcmp mais pas ce \0 sur buf[buflen] ;)

              En effet, la transmission de données par le module 433MHz n'inclue pas le \0 donc il te faut impérativement le rajouter.

              En revanche, quand tu écris une chaine de caractère dans ton code, le compilateur l'ajoute automatiquement donc tu n'as besoin de le rajouter.

              -
              Edité par lorrio 31 décembre 2014 à 14:20:10

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                31 décembre 2014 à 16:21:59

                Super, là ça marche vraiment.

                Merci beaucoup.

                • Partager sur Facebook
                • Partager sur Twitter

                comparer un signal 433mhz arduino

                × 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