module 433mhz

Bonjours, j'aimerai fabriquer un une petite voiture toute simple a l'aide d'un module 433mhz, le probleme est que jarrive un envoyer un message de l'emmeteur au recepteur, mais ce message et tout le temp le meme "0" alors que le message qui est censer etre envoyer est "avant", "arriere", "droite" ou "gauche".

Voici mon code(émetteur):

#include <VirtualWire.h>


int EtatBouton1 = 0;
int EtatBouton2 = 0;
int EtatBouton3 = 0;
int EtatBouton4 = 0;

void setup() {
  
  vw_setup(2000);
  vw_set_tx_pin(2);
  
  pinMode(10,INPUT); //Bouton
  pinMode(11,INPUT); //Bouton
  pinMode(12,INPUT); //Bouton
  pinMode(13,INPUT); //Bouton

 Serial.begin(9600);
}

void loop(){
  byte message[27];
  byte taille_message = 27;
  
  EtatBouton1 = digitalRead(10);
  EtatBouton2 = digitalRead(11);
  EtatBouton3 = digitalRead(12);
  EtatBouton4 = digitalRead(13);

  if(EtatBouton1 == HIGH){
Serial.println(1);
      strcpy(message, "avant") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
   }

  if(EtatBouton2 == HIGH){
Serial.println(2);
      strcpy(message, "arriere") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
   }
   
  if(EtatBouton3 == HIGH){
Serial.println(3);
      strcpy(message, "droite") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
   } 
   
  if(EtatBouton4 == HIGH){
Serial.println(4);
      strcpy(message, "gauche") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
   }
}

Et voici le code recepteur:

#include <VirtualWire.h>


void setup() {
  vw_setup(2000);
  vw_set_rx_pin(7) ;
  vw_rx_start();
  Serial.begin(9600);
}

void loop() {
  byte message[27];
  byte taille_message = 27;
  
  vw_wait_rx() ;
  

  if(vw_get_message( message, &taille_message)) {
 
      Serial.println(message[27]);
  

  }
  


}

Bonjour,

Avec: Serial.println(message[27]); tu affiche uniquement le 28 ième caractère de la chaine 'message', qui doit être '\0'.

De plus, pourquoi faire: vw_send(message, taille_message) ; avec taille_message=27, au lieu de
vw_send(message, strlen(message)) ;
En effet le 'message ne fait pas toujours 27 cars.

Quand vous faites Serial.println(message[27]);vous demandez d’imprimer le 28eme octet du tableau (qui n’est même pas dans le tableau qui va de 0 à 26). Il faut faireSerial.println(message);

bilbo83:
De plus, pourquoi faire: vw_send(message, taille_message) ; avec taille_message=27, au lieu de
vw_send(message, strlen(message)) ;
En effet le 'message ne fait pas toujours 27 cars.

Ce n’est pas optimal d’envoyer plus d’octets que nécessaire (ça fonctionnera) mais il faut envoyer le ‘\0’ pour que le buffer reçu soit bien une c-String sinon risque de bugs en fonction de ce qu’il y aura dans la mémoire. Donc au moins envoyer strlen(message)+1 octets

J'ai changer le code émetteur:

#include <VirtualWire.h>


int EtatBouton1 = 0;
int EtatBouton2 = 0;
int EtatBouton3 = 0;
int EtatBouton4 = 0;

void setup() {
  
  vw_setup(2000);
  vw_set_tx_pin(2);
  
  pinMode(10,INPUT); //Bouton
  pinMode(11,INPUT); //Bouton
  pinMode(12,INPUT); //Bouton
  pinMode(13,INPUT); //Bouton

 Serial.begin(9600);
}

void loop(){
  byte message;

  
  EtatBouton1 = digitalRead(10);
  EtatBouton2 = digitalRead(11);
  EtatBouton3 = digitalRead(12);
  EtatBouton4 = digitalRead(13);

  if(EtatBouton1 == HIGH){
Serial.println(1);
      strcpy(message, "avant") ;
      vw_send(message,strlen(message)) ;
      vw_wait_tx() ;
   }

  if(EtatBouton2 == HIGH){
Serial.println(2);
      strcpy(message, "arriere") ;
      vw_send(message, strlen(message)) ;
      vw_wait_tx() ;
   }
   
  if(EtatBouton3 == HIGH){
Serial.println(3);
      strcpy(message, "droite") ;
      vw_send(message, strlen(message)) ;
      vw_wait_tx() ;
   } 
   
  if(EtatBouton4 == HIGH){
Serial.println(4);
      strcpy(message, "gauche") ;
      vw_send(message,strlen(message)) ;
      vw_wait_tx() ;
   }
   
}

Et-il juste?

Et pour ce qui est du code récepteur, je ne sait pas quoi faire de tout ce qui concerne la taille du message, est-ce indispensable?

Voici le code:

#include <VirtualWire.h>


void setup() {
  vw_setup(2000);
  vw_set_rx_pin(7) ;
  vw_rx_start();
  Serial.begin(9600);
}

void loop() {
  byte message;
//  byte taille_message = 27;
  
  vw_wait_rx() ;
  

  if(vw_get_message( message,/* &taille_message*/)) {
 
      Serial.println(message);
  

  }
  


}

En enlevant "taille message" je ne peut pas compiler le code...

Plusieurs choses:

  • votre loop va tourner super vite, vous allez donc balancer plein de fois un message pour le même appui sur un bouton.

Pour simplifier votre gestion des boutons, éventuellement utilisez la librairie de @bricoleau

  • quand vous émettez une trame, il faut absolument donner la longueur du buffer à envoyer. L'arduino se fiche de savoir s'il y a quelque chose de pertinent dans tout le buffer, il prend le nombre d'octets que vous spécifiez et c'est ça qu'il balance sur les ondes. De l'autre côté il faut bien sûr une variable qui va être gérée par la partie réception des données et qui sera initialisée à la taille du message reçu. donc il vous faut bien une variable dans la partie réception.

Ce que voulait dire @bilbo83 c'est que si vous envoyez le message "gauche" c'est 6 caractères plus un caratère nul pour marquer la fin de la chaîne; Donc vous n'avez pas besoin d'envoyer sur les ondes 27 caractères, en envoyer que 7 peut suffire pour que le message soit bien transmis. 7 correspond à ce que je disais plus haut, strlen(message)+1 c'est à dire la nombre de caractères dans le message plus 1 pour le caractère nul de fin.

c'est plus clair ?

J'ai essayer d'apporter quelque modification mais ca ne marche pas... Je ne suis pas sur de comprendre ce que vous me disait...

Voici mes codes:

#include <VirtualWire.h>


int EtatBouton1 = 0;
int EtatBouton2 = 0;
int EtatBouton3 = 0;
int EtatBouton4 = 0;

void setup() {
  
  vw_setup(2000);
  vw_set_tx_pin(2);
  
  pinMode(10,INPUT); //Bouton
  pinMode(11,INPUT); //Bouton
  pinMode(12,INPUT); //Bouton
  pinMode(13,INPUT); //Bouton

 Serial.begin(9600);
}

void loop(){
  byte message;

  
  EtatBouton1 = digitalRead(10);
  EtatBouton2 = digitalRead(11);
  EtatBouton3 = digitalRead(12);
  EtatBouton4 = digitalRead(13);

  if(EtatBouton1 == HIGH){
Serial.println("1");
      strcpy(message, "avant") ;
      vw_send(message,strlen(message)+1) ;
      vw_wait_tx() ;

   }

  if(EtatBouton2 == HIGH){
Serial.println("2");
      strcpy(message, "arriere") ;
      vw_send(message, strlen(message)+1) ;
      vw_wait_tx() ;
            
   }
   
  if(EtatBouton3 == HIGH){
Serial.println("3");
      strcpy(message, "droite") ;
      vw_send(message, strlen(message)+1) ;
      vw_wait_tx() ;
   
   } 
   
  if(EtatBouton4 == HIGH){
Serial.println("4");
      strcpy(message, "gauche") ;
      vw_send(message,strlen(message)+1) ;
      vw_wait_tx() ;
    
   }

   delay(1);
}

Et

#include <VirtualWire.h>


void setup() {
  vw_setup(2000);
  vw_set_rx_pin(7) ;
  vw_rx_start();
  Serial.begin(9600);
}

void loop() {
  byte message;
  byte taille_message = 27;
  
  vw_wait_rx() ;
  

  if(vw_get_message( message, &taille_message)) {
 
      Serial.println(message);
  

  }
  


}

Essayez avec

void loop() {
  byte taille_message = 27;
  char message[taille_message];
...

Si vous ne lui donnez pas une zone mémoire réservée où écrire le message quand il le reçoit (donc une adresse mémoire) ça ne peut pas fonctionner

Désolée de ne pas avoir répondu avant...
Je vient d'apporter les modifications que vous m'avez suggéré a mon programme mais ca ne marche toujours pas...
Voici mes codes:
émetteur:

#include <VirtualWire.h>


void setup() {
  vw_setup(2000);
  vw_set_rx_pin(6) ;
  vw_rx_start();
  Serial.begin(9600);
  

  
}

void loop() {

 byte taille_message = 27;
 char message[taille_message];
  vw_wait_rx() ;
  

 
 
  if(vw_get_message( message, &taille_message)) {
 
      Serial.println(message);
  

  }
  


}

récepteur:

#include <VirtualWire.h>


int EtatBouton1 = 0;
int EtatBouton2 = 0;
int EtatBouton3 = 0;
int EtatBouton4 = 0;

void setup() {
  
  vw_setup(2000);
  vw_set_tx_pin(2);
  
  pinMode(10,INPUT); //Bouton
  pinMode(11,INPUT); //Bouton
  pinMode(12,INPUT); //Bouton
  pinMode(13,INPUT); //Bouton

 Serial.begin(9600);
}

void loop(){
  
  byte message;
  byte taille_message = 27;
  
  EtatBouton1 = digitalRead(10);
  EtatBouton2 = digitalRead(11);
  EtatBouton3 = digitalRead(12);
  EtatBouton4 = digitalRead(13);

  if(EtatBouton1 == HIGH){
Serial.println("1");
      strcpy(message, "avant") ;
      vw_send(message, &taille_message) ;
      vw_wait_tx() ;

   }

  if(EtatBouton2 == HIGH){
Serial.println("2");
      strcpy(message, "arriere") ;
      vw_send(message, &taille_message) ;
      vw_wait_tx() ;
            
   }
   
  if(EtatBouton3 == HIGH){
Serial.println("3");
      strcpy(message, "droite") ;
      vw_send(message, &taille_message) ;
      vw_wait_tx() ;
   
   } 
   
  if(EtatBouton4 == HIGH){
Serial.println("4");
      strcpy(message, "gauche") ;
      vw_send(message, &taille_message) ;
      vw_wait_tx() ;
    
   }

   delay(1);
}

Peut être y a t-il un problème dans le branchement?

Non - le pb c’est que vous n’avez pas fait la modif (dans les 2 codes)

Effectivement...
Je vais essayer ca devrai mieux marcher...