3 fonctions sur 3 canaux 433Mhz

Bonjour a tous

Je débute avec arduino. En utilisant 2 arduino leonardo et 2 modules TX/RX 433Mhz , je souhaiterai allumer et éteindre 3 LEDS :indépendamment les unes des autres ;avec 3 BP sur la carte TX;
J'ai déjà essayer de bricoler 2 programmes ,mais je n'arrive pas a comprendre pourquoi ca ne fonctionne qu'une LED après l'autre ;
je voudrais fabriquer un mini jeux de lumiere , je pense que je ne suis pas très loin ou peut être a des années lumières des bon programmes

si qqun peut m'aider
ci-joint les 2 sketch

CODE RX 433.txt (904 Bytes)

CODE TX 433.txt (856 Bytes)

salut, quelques pistes à creuser

dans les codes ...

  • il serait peut être utile de déclarer les broches sur lesquelles tu as branché l'émetteur et le récepteur (par defaut 11 en RX et 12 en TX ... mais c'est mieux de l'écrire en clair : vw_set_tx_pin (uint8_t pin) et vw_set_rx_pin (uint8_t pin)

dans le code RX ...

  • je mettrais des Serial.print aux endroits stratégiques pour voir ce que ton récepteur décode vraiment comme message (pour tester, tu laisseras donc le récepteur connecté au PC avec la console série allumée pendant que tu agiras sur l'émetteur...)
  • je déclarerais aussi les sorties led en OUTPUT dans le setup ... ça ne mange pas de pain

chez moi, la partie émission et réception fonctionne

#include <VirtualWire.h> 

#define bouton1 2
#define bouton2 3
#define bouton3 4
 
int Nombre;
 
char Message[10]; //un tableau de 10 chars suffit ! 
 
void setup() {
  vw_setup(2000);        
  vw_set_tx_pin(12); //emetteur sur pin 12
}
 
void loop() {  
  Nombre++; //pour test (je n'ai pas de boutons)
  // conversion de l'int en tableau de char 
  itoa(Nombre,Message,10);  // 10 car décimal
  vw_send((uint8_t *)Message, strlen(Message));
  vw_wait_tx(); // attend la fin de l'envoi
  delay(200); 
}

et en reception

#include <VirtualWire.h>
 
#define LED1 2
#define LED2 3
#define LED3 4

int Nombre;

#define msglen 10
char Message[msglen]; //suffit largement pour passer le message
 
void setup() {     
  Serial.begin(9600);
  vw_setup(2000);      
  vw_set_rx_pin(6); //recepteur sur pin 6
  vw_rx_start();       
}
 
void loop(){
  uint8_t buf[msglen];
  uint8_t buflen = msglen;
 
  if (vw_get_message(buf, &buflen))   {
    byte i; //0 à 255 ça suffit !
    for (i = 0; i < buflen; i++) Message[i] = char(buf[i]);
   
    Message[buflen] = '\0';
 
    // Conversion du tableau de chars en int:
    Serial.print("recu "); Serial.println(Message); 
    
    Nombre = atoi(Message);

    if (Nombre == 1){
      digitalWrite (LED1,HIGH);
      Serial.println("1 on");
    }
    if (Nombre == 2){
      digitalWrite (LED2,HIGH);
      Serial.println("2 on");
    }
    if (Nombre == 3){
      digitalWrite (LED3,HIGH);
      Serial.println("3 on");
    }
    if (Nombre == 4){
      digitalWrite (LED1,LOW);
      digitalWrite (LED2,LOW);
      digitalWrite (LED3,LOW);
      Serial.println("all off");
    }
  }
}

Bonjour,

Je pense qu'il faut utiliser un bit par led. Chaque bit reflète l'état de la commande de la led.
Ce qui donne
Transmission:

#include <VirtualWire.h> 
 
#define TxPin 12 
#define bouton1 2
#define bouton2 3
#define bouton3 4
 
int Nombre;
 
char Message[VW_MAX_MESSAGE_LEN]; 
 
 
void setup()
{
  vw_setup(2000);        
 
  pinMode(bouton1, INPUT); 
  digitalWrite(bouton1, HIGH);  
  pinMode(bouton2, INPUT);
  digitalWrite(bouton2, HIGH);
  pinMode(bouton3, INPUT); 
  digitalWrite(bouton3, HIGH);    
}
 
void loop()
{
  Nombre=0;  
  if (!digitalRead(bouton1)){
    Nombre|=1;
  }
  if (!digitalRead(bouton2)){
    Nombre|=2;
  }
  if (!digitalRead(bouton3)){
    Nombre|=4;
  }
 
  // convertion de l'int en tableau de char 
  itoa(Nombre,Message,10);  // 10 car décimal
 
  vw_send((uint8_t *)Message, strlen(Message));
  vw_wait_tx(); // Wait until the whole message is gone
  delay(200); 
 
}

Réception:

#include <VirtualWire.h>
 
#define LED1 2
#define LED2 3
#define LED3 4
 
int Nombre;
 
char Message[VW_MAX_MESSAGE_LEN]; 
 
void setup() {    
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);
 
  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++)
    {               
      Message[i] = char(buf[i]);
    }
 
    Message[buflen] = '\0';
 
    // Conversion du tableau de chars en int:
    Nombre = atoi(Message);
 
    if (Nombre&1)
      digitalWrite(LED1,HIGH);
    else
      digitalWrite(LED1,LOW);
 
    if (Nombre&2)
      digitalWrite(LED2,HIGH);
    else
      digitalWrite (LED2,LOW);
 
    if (Nombre&4)
      digitalWrite (LED3,HIGH);
    else
      digitalWrite (LED3,LOW);
  }
}

Bonjour et merci ne m'avoir répondu aussi vite, vous êtes super sympa;
Et en plus ça fonctionne ! Je suis trop content car je vais pouvoir enfin finir mon mini projet et surement en démarrer d'autres !!
Pour parler du programme :j'avais essaye de mettre un delay sur chaque LED mais ça ne faisait rien;
Le bit dont tu parles a quoi correspond t'il dans le sketch?

C'est un bit dans ta variable nombre qui reflète l'état de chaque poussoir.
Au lieu d'affecter à ta variable une valeur pour chaque bouton comme dans ton sketch initial, dans le nouveau sketch on affecte un bit à chaque bouton ce qui permet de gérer plusieurs boutons enfoncés (donc plusieurs leds allumées)
exemple:
bouton 1 enfoncé -> nombre = 1
bouton 3 enfoncé _> nombre = 4
bouton 1 et bouton 3 enfoncés -> nombre = 5

et on fait l'inverse au décodage si nombre = 5 ça veux dire qu'on doit allumer les leds 1 et 3

Merci pour cette explication très claire

Bonjour

J'ai essayer de rajouter 1 canal (passer de 3 a 4 canaux) mais en prenant : Nombre:6 ou 7 pour le 4eme canal j'ai 2 canaux qui réagisse en meme temps cote RX

qqun peut m'aider svp ?

FAb433:
Bonjour

J'ai essayer de rajouter 1 canal (passer de 3 a 4 canaux) mais en prenant : Nombre:6 ou 7 pour le 4eme canal j'ai 2 canaux qui réagisse en meme temps cote RX

qqun peut m'aider svp ?

bonjour

Il faut prendre 8
ça doit etre une puissance de 2
1 2 4 8 16 32 64 128

BRAVO merci ça fonctionne

Bonjour

J'ai reussi a faire fonctionner mon mini jeux de lumieres avec VirtualWire mais je voudrais securiser ma connection car si je fais fonctionner deux ou trois montages en meme temps un emmetteur active tous les autres recepteurs.
J'ai bidouiller mes deux sketch en ulilisant RCSWITCH mais ca ne donne rien

Si qqun peut jeter un oeil
merci

RCSWITCH RX.txt (915 Bytes)

RCSWITCH TX.txt (869 Bytes)