cherche tuto debutant 433Mhz

Parser .... tiens donc, une expression nouvelle (pour moi , biensur :cold_sweat:)
ok, merci pour cette info , je vais aller voir de ce coté la.

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.

Bonjour,

je reçoit correctement,

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

vassi974:
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

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:

#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
     }



}}

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.

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

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?

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 ?

#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
     }
  
          




}}

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

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

bonjour
"Mora mora" :grin:

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" ?

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. :disappointed_relieved:

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?

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

Peut tu preciser la question STP?

vassi974:
Rooooooo, un Malgache ! 8)
...

  • ç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 :grin: c'est (encore) un des plus beaux endroits de ce monde :grin:
...
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)

#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
     }
  
          




}}

Oui, je partage ton avis sur ce magnifique pays qu'est Madagascar. Le paradoxe de l'ocean Indien... (mais je vais arrêter la le hors sujet :stuck_out_tongue_closed_eyes:)
Question subsidiare: Connais tu la Reunion ?

Pour ce qui est du code sans le serial, je ne sais pas faire tous simplement ! pfffff :cold_sweat: d'ou le titre du topic > tuto 433mhz :*
je me suis basé sur le tuto de Skywodd, que j'ai essayé de bidouiller, et je m'y suis mal pris parceque sa fonctionne "presque"... (je deteste le "presque" !!!! ]:D)
Donc retour à la case depart. Mais oui, effectivement à terme mon but est de me passer de l'ordi pour rendre ce montage "autonome".
En fait ce que je veu est tous simple: une action sur la carte émettrice engendre une reaction sur la carte réceptrice.
Y'a bien quelqu'un ici qui a déjà recrée un module du style portail électrique, ou quelque chose du genre ?
merci d'avance.

vassi974:
...

Pour ce qui est du code sans le serial, je ne sais pas faire tous simplement !
...

Tu a testé "mon" code au dessus ?

Artouste:

vassi974:
...

Pour ce qui est du code sans le serial, je ne sais pas faire tous simplement !
...

Tu a testé "mon" code au dessus ?

Non, pas encore, mais j'ai hate, j'espere que sa marche.La je suis chez moi , j'ai pas les cartes pour essayer. Demain matin je teste ça arrivé au bureau et je te tiens au courant.Merci !!!! :smiley:

Ok, j'ai fais le test, c'est idem au code avec serial.
C'est à dire qu'il faut que je coupe l'alimentation et remette l'alimentation de la carte réceptrice pour que le nouveau code soit pris en compte, et donc que la led réagisse.

vassi974:
Ok, j'ai fais le test, c'est idem au code avec serial.
C'est à dire qu'il faut que je coupe l'alimentation et remette l'alimentation de la carte réceptrice pour que le nouveau code soit pris en compte, et donc que la led réagisse.

bonjour
pour etre sur que l'on se comprenne bien :

tu charge un code recepteur avec (exemple) la chaine pour la led = "LED1"
ON OFF de la carte receptrice
tu envoie "LED1" = action led OK

tu charge un nouveau code recepteur avec "LED2"
sans ON/OFF
tu envoi "LED2" = pas d'action sur la led , c'est ça ?
si tu envoi "LED1" , il y a encore action sur la led ?

Artouste:

vassi974:
Ok, j'ai fais le test, c'est idem au code avec serial.
C'est à dire qu'il faut que je coupe l'alimentation et remette l'alimentation de la carte réceptrice pour que le nouveau code soit pris en compte, et donc que la led réagisse.

bonjour
pour etre sur que l'on se comprenne bien :

tu charge un code recepteur avec (exemple) la chaine pour la led = "LED1"
ON OFF de la carte receptrice
tu envoie "LED1" = action led OK

tu charge un nouveau code recepteur avec "LED2"
sans ON/OFF
tu envoi "LED2" = pas d'action sur la led , c'est ça ?
si tu envoi "LED1" , il y a encore action sur la led ?

si j'envoie un nouveau code il n'est pas pris en compte (que se soit LED1 ou LED2).
La carte réceptrice conserve son état. Sauf si je coupe l'alimentation de l'émetteur: a ce moment la la led ne clignote plus. Et si je remet l'alimentation de l'émetteur elle ne se rallume pas.
pour resumer :
Si je reset la carte réceptrice , elle "rafraichira" avec le code reçu au moment de son allumage, après elle ne change plus d'état selon les différents codes qu'elle peu recevoir.
j'ai pensé que c'est le buffer qui reste en mémoire et qui ne serait pas écrasé par le nouveau code qui arrive. Alors dans Void Loop, j'ai mis toutess les variables a "0" en fin de programme (après le clignotement) mais sa n'a pas fonctionné. La je ne sais vraiment plus quoi faire. Je commence a perdre espoir, surtout pour une operation aussi basique (j'ai honte.... lol)

ok, j'ai trouvé un maniere de contourner le problème, bien plus longue mais qui fonctionne.
Par contre c'est pas tres propre.

#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
int led = 5;  //vert
int led2 = 6;  //rouge



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);     
    pinMode(led2, 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[0] == 'V')
    if (buf[1] == 'a')
    if (buf[2] == 's')
    if (buf[3] == 's')
    if (buf[4] == 'i')
     {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(500);               // wait for a second
     }

    if (buf[0] == 'r')
    if (buf[1] == 'i')
    if (buf[2] == 'e')
    if (buf[3] == 'n')
   // if (buf[4] == 'i')
{
   digitalWrite(led2, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);               // wait for a second
  digitalWrite(led2, LOW);    // turn the LED off by making the voltage LOW
  delay(500);               // wait for a second
}

}}

je suis sur que sa va arrcher les rétines des pros du forum qui vont maintenant me dire "mais pourquoi ta pas plutot fais comme ça...?!!! " XD