Go Down

Topic: cherche tuto debutant 433Mhz (Read 3308 times) previous topic - next topic

vassi974

Bonjour a tous,
j'ai lu et appliqué l'excellent tuto se Skywodd sur les émetteur récepteur 433Mhz
http://skyduino.wordpress.com/2011/12/29/tutoriel-arduino-et-emetteurrecepteur-433mhz-virtualwire/
Mais voilà.....
au lieu d'émettre et recevoir des message texte , j'aimerais pouvoir sur le récepteur actionner une led par exemple, à la reception d'un message.
Du style "led ON" > allume une led .
J'ai cherché un peu partout, et testé pas mal de truc mais rien n'a fonctionné chez moi.
Connaitriez vous un tuto tres simple qui détaille ça, ou un ptit code qui me permettrais de comprendre ?
merci d'avance.
Merci !!!!!

Artouste

#1
Nov 27, 2012, 01:10 pm Last Edit: Nov 27, 2012, 01:13 pm by Artouste Reason: 1

Bonjour a tous,
j'ai lu et appliqué l'excellent tuto se Skywodd sur les émetteur récepteur 433Mhz
http://skyduino.wordpress.com/2011/12/29/tutoriel-arduino-et-emetteurrecepteur-433mhz-virtualwire/
Mais voilà.....
au lieu d'émettre et recevoir des message texte , j'aimerais pouvoir sur le récepteur actionner une led par exemple, à la reception d'un message.
Du style "led ON" > allume une led .
J'ai cherché un peu partout, et testé pas mal de truc mais rien n'a fonctionné chez moi.
Connaitriez vous un tuto tres simple qui détaille ça, ou un ptit code qui me permettrais de comprendre ?
merci d'avance.

bonjour
le tuto de skywodd est par definition ... un tuto  :smiley-mr-green:
à toi d'extraire/parser (lire et agir) selon le contenu de  buf[]

vassi974

J'en ai peu être pas l'air mais j'essaie vraiment de comprendre et ne post pas pour avoir un code tous fait.
Faut vraiment que je soit bloqué pour me permettre de poster.
voila ce que j'avais cru comprendre mais le resultat escompté n'y est pas.





Code: [Select]
#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
int led = 5;


void setup()
{
    Serial.begin(9600);    // On initialise "le serial monitor", j'ai laissé 9600 bauds ici car c'est la valeur par défaut mais vous pouvez la modifier. Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
    vw_setup(2000);                 // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
    vw_set_rx_pin(11);             // C'est sur cette broche que l'on reliera les broches DATA du récepteur, vous pouvez changez de broche si vous le désirez.
    vw_rx_start();                    // On démarre le récepteur.
    pinMode(led, OUTPUT);     

}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
    {
    int i;
     // Un message est reçu.

    for (i = 0; i < buflen; i++)
    {
        Serial.write(buf[i]);  // On affiche le message lettre par lettre. Par exemple buf[4] sera égale à la 5ème lettre du mot envoyé (Snootlab donc "t") car on compte le zéro ici.
        }
    Serial.println(""); // On saute une ligne afin d'avoir plus de clarté.
     }

   if (strcmp("Snootlab",(char*) buf) == 0)
   {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
     




}}
Merci !!!!!

vassi974

Parser .... tiens donc, une expression nouvelle (pour moi , biensur  :smiley-roll-sweat:)
ok, merci pour cette info , je vais aller voir de ce coté la.
Merci !!!!!

infobarquee

bonjour,
question comme ca, lorsque tu envoie des données sur le récepteur, les leds de la carte clignotent?
tu as peut être un problème au niveau des antennes et tout n'est pas recu ou envoyé simplement.

vassi974

Bonjour,

je reçoit correctement,

-les leds clignotent
-le moniteur serie me transmet le message complet

Merci !!!!!

Artouste


Bonjour,

je reçoit correctement,

-les leds clignotent
-le moniteur serie me transmet le message complet



bonjour
probleme de comparaison de chaine ?
déjà pour veridier si le circuit led "fonctionne"
fait un simple test sur une seule position de buf[] , par exemple si buf[2] contient une valeur determinée alors led = allumée
tu envoi des msg qui en theorie doivent faire correspondre ou pas buf[2] à cette valeur

vassi974

Salut Artouste !
Alors oui de cette façon sa marche (j'avais essayé déjà).
Ce que je ne sais pas faire c'est "enregistrer" le buffer (un mot) , donc si j'ai bien compris sous forme de "string"
et le comparer a une variable.
Si le resultat est identique > commande du style "digital.Write" ou quelque chose de classique.
j'ai essayé les "strcmp" et consorts mais je ne m'en sort pas.
je crois que je m'y prend mal pour incrémenter le buffer caractère par caractère, à chaque fois j'ai une erreurs de compilation.
Je ne comprend pas trop le message d'erreur mais c'est quelque chose du genre "la conversion de string en int n'est pas possible" ....
voici la base de code sur laquelle je suis:
Code: [Select]
#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
int led = 5;



void setup()
{
    Serial.begin(9600);    // On initialise "le serial monitor", j'ai laissé 9600 bauds ici car c'est la valeur par défaut mais vous pouvez la modifier. Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
    vw_setup(2000);                 // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
    vw_set_rx_pin(11);             // C'est sur cette broche que l'on reliera les broches DATA du récepteur, vous pouvez changez de broche si vous le désirez.
    vw_rx_start();                    // On démarre le récepteur.
    pinMode(led, OUTPUT);     

}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
    {
    int i;
     // Un message est reçu.

    for (i = 0; i < buflen; i++) // on recoit le msg lettre par lettre
    {
        Serial.write(buf[i]);  // On affiche le message lettre par lettre. Par exemple buf[4] sera égale à la 5ème lettre du mot envoyé (Snootlab donc "t") car on compte le zéro ici.
    }
     
    Serial.println(""); // On saute une ligne afin d'avoir plus de clarté.
   

   
 
   
     if (buf[2] =='a')
     {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
     }



}}

Merci !!!!!

Artouste


Salut Artouste !
Alors oui de cette façon sa marche (j'avais essayé déjà).
Ce que je ne sais pas faire c'est "enregistrer" le buffer (un mot) , donc si j'ai bien compris sous forme de "string"
et le comparer a une variable.



ok pour le test sur une position de buf[]
probleme de nul /0 (terminateur de string) pour finaliser la comparaison ?

vassi974

ahhh , surement , la aussi j'ai essayé pa mal de trucs...

le buffer dans mon code actuel contient t'il le message en entier ?
ou le stocker afin de le comparer ?
et bien sur de quelle façon le comparer?

Merci !!!!!

vassi974

alors voila ou j'en suis : sa fonctionne seulement si j'ouvre le moniteur serie.
Si je change le code de l'émetteur, le terminal serie affiche le nouveau code mais la led ne réagit pas.
Pour qu'elle reagisse je dois fermer et réouvrir le moniteur serie. Quelqu'un a t'il un debut d'explication ?


Code: [Select]
#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
int led = 5;
char inData[4]; // Allocate some space for the string
char inChar=-1; // Where to store the character read
byte index = 0; // Index into array; where to store the character




void setup()
{
   Serial.begin(9600);    // On initialise "le serial monitor", j'ai laissé 9600 bauds ici car c'est la valeur par défaut mais vous pouvez la modifier. Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
   vw_setup(2000);                 // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
   vw_set_rx_pin(11);             // C'est sur cette broche que l'on reliera les broches DATA du récepteur, vous pouvez changez de broche si vous le désirez.
   vw_rx_start();                    // On démarre le récepteur.
   pinMode(led, OUTPUT);    

}

void loop()
{
   uint8_t buf[VW_MAX_MESSAGE_LEN];
   uint8_t buflen = VW_MAX_MESSAGE_LEN;

   if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
   {
   int i;
    // Un message est reçu.

   for (i = 0; i < buflen; i++) // on recoit le msg lettre par lettre
   {
       Serial.write(buf[i]);  // On affiche le message lettre par lettre. Par exemple buf[4] sera égale à la 5ème lettre du mot envoyé (Snootlab donc "t") car on compte le zéro ici.
   
if(index < 3) // One less than the size of the array
       {
           inChar = buf[i]; // Read a character
           inData[index] = inChar; // Store it
           index++; // Increment where to write next
           inData[index] = '\0'; // Null terminate the string
       }  


}
   
     
   Serial.println(""); // On saute une ligne afin d'avoir plus de clarté.
 

   
 
 
  if(strcmp("aaa", (char*)inData) == 0)                         // if (inData=='aaa')
    {
 digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(1000);               // wait for a second
 digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
 delay(1000);               // wait for a second
    }
 
         




}}
Merci !!!!!

vassi974

un petit up !! toujours personne pour m'aider ?!  :D
Merci !!!!!

Artouste


un petit up !! toujours personne pour m'aider ?!  :D

bonjour
"Mora mora"   :smiley-mr-green:

Quote
alors voila ou j'en suis : sa fonctionne seulement si j'ouvre le moniteur serie.
Si je change le code de l'émetteur, le terminal serie affiche le nouveau code mais la led ne réagit pas.
Pour qu'elle reagisse je dois fermer et réouvrir le moniteur serie. Quelqu'un a t'il un debut d'explication ?


- probleme de reset apres upload ?
- ça donne quoi en supprimant dans le code "de réception" , toutes les références "serial" ?



vassi974

Rooooooo, un Malgache !  8)

Pour le reset apres ulpoad, je pense pas car le nouveau message est bien reçu par le moniteur serie.
Mon problème   est que justement , si le moniteur serie n'est pas ouvert, ma led ne réagit pas.
Et si je change le message , je dois "rafraichir" le moniteur serie en l'ouvrant et le refermant. J'ai inclus un Serial.end()et un Serial.begin dans Void Loop mais rien n'y fait.
Je pensait que les fonctions "Serials" fonctionnaient meme si le moniteur serie est fermé. Apparemment ce n'est pas le cas. :smiley-sad-blue:

Pour rappel, je cherche juste a commander une led par l'intermediaire du couple émetteur-récepteur 433Mhz.
Bon ok, je pourrais utiliser juste un caractere pour une action. Mais quand meme , vu que je peu recevoir un message entier, pourquoi se limiter a une lettre?

Quote
- ça donne quoi en supprimant dans le code "de réception" , toutes les références "serial" ?


Peut tu preciser la question STP?




Merci !!!!!

Artouste


Rooooooo, un Malgache !  8)
...
Quote
- ça donne quoi en supprimant dans le code "de réception" , toutes les références "serial" ?


Peut tu preciser la question STP?


De coeur certainement et déjà depuis quelques... décennies  :smiley-mr-green:  c'est (encore) un des plus beaux endroits de ce monde  :smiley-mr-green:
...
le code de reception qui une fois uploadé, n'appelle pas de gestion de serial, mais se limite à reception 433 et action led
NB : testé compil OK , mais pas sur cible  8)

Code: [Select]
#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
int led = 5;
char inData[4]; // Allocate some space for the string
char inChar=-1; // Where to store the character read
byte index = 0; // Index into array; where to store the character




void setup()
{
    //Serial.begin(9600);    // On initialise "le serial monitor", j'ai laissé 9600 bauds ici car c'est la valeur par défaut mais vous pouvez la modifier. Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
    vw_setup(2000);                 // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
    vw_set_rx_pin(11);             // C'est sur cette broche que l'on reliera les broches DATA du récepteur, vous pouvez changez de broche si vous le désirez.
    vw_rx_start();                    // On démarre le récepteur.
    pinMode(led, OUTPUT);     

}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
    {
    int i;
     // Un message est reçu.

    for (i = 0; i < buflen; i++) // on recoit le msg lettre par lettre
    {
        //Serial.write(buf[i]);  // On affiche le message lettre par lettre. Par exemple buf[4] sera égale à la 5ème lettre du mot envoyé (Snootlab donc "t") car on compte le zéro ici.
   
if(index < 3) // One less than the size of the array
        {
            inChar = buf[i]; // Read a character
            inData[index] = inChar; // Store it
            index++; // Increment where to write next
            inData[index] = '\0'; // Null terminate the string
        } 


}
   
     
    //Serial.println(""); // On saute une ligne afin d'avoir plus de clarté.
   

   
 
   
   if(strcmp("aaa", (char*)inData) == 0)                         // if (inData=='aaa')
     {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
     }
 
         




}}

Go Up