Module RF 433 2 boutons - 2 leds

Bonjour, j'aimerais bien que quelqu'un puisse m'aider a régler mon soucie avec mon module RF 433 MHz . Je vous explique le contexte : j'ai 2 arduino uno , un emetteur connecté sur D12 et un recepteur connecté sur D12 ( de l'autre arduino ). Sur mon arduino-emetteur, il y a le buttonA sur D13 et buttonB sur D9 . Celui du recepteur , la LEDA sur D9 et LEDB sur D7.

Mon problème est que mon code doit permettre à ce que le bouton poussoir B allume la LEDB si on appuie et eteint la LEDB si on appuie pas sur le bouton B . Meme principe que le A. Le code marche bien en B ( meme si il ne faut appuyer trop vite sinon la ledB ne s allume pas parfois mais ce n'est pas important ) . Par contre en A , quand j'appuie sur bouton A, la LEDA s'allume et s'eteint à interval de 1 sec environ.

voici le code emetteur :

#include <VirtualWire.h>
char controller;
const int buttonA = 13;
const int buttonB = 9;
const char
CMD_BUTTON_A = "BPAxxxx" ;
const char* CMD_BUTTON_B = "BPB" ;
const char* CMD_BUTTON_NUL = "NUL" ;
int buttonState1 = 0;
int buttonState2 = 0;

void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(buttonA, INPUT);
pinMode(buttonB, INPUT);
//pinMode(13,OUTPUT);
vw_set_ptt_inverted(true); //
vw_set_tx_pin(12);
vw_setup(4500);// speed of data transfer Kbps// plus petit, meilleur porté.
// a changer si besoin ameliorer le signal emis
//delay(100);
}
void loop()
{
//byte message[VW_MAX_MESSAGE_LEN];
buttonState1 = digitalRead(buttonA);
buttonState2 = digitalRead(buttonB);
Serial.println(controller);
if (buttonState1 == HIGH)
{
controller="1" ;
vw_send((byte*) CMD_BUTTON_A, strlen(CMD_BUTTON_A) + 1);
vw_wait_tx(); // Wait until the whole message is gone
//digitalWrite(13,LOW);
}
if (buttonState2 == HIGH)
{
controller="2" ;
vw_send((byte*) CMD_BUTTON_B, strlen(CMD_BUTTON_B) + 1);
vw_wait_tx(); // Wait until the whole message is gone
//digitalWrite(13,LOW);
}
else
{
controller="0" ;
vw_send((byte*) CMD_BUTTON_NUL, strlen(CMD_BUTTON_NUL) + 1);
vw_wait_tx(); // Wait until the whole message is gone
//digitalWrite(13, HIGH);
}
}

Voici le recepteur :

#include <VirtualWire.h>

const byte PIN_LED_A = 9;
const byte PIN_LED_B = 7;
const char* CMD_BUTTON_A = "BPAxxxx";
const char* CMD_BUTTON_B = "BPB" ;
const char* CMD_BUTTON_NUL = "NUL";

void setup()
{
vw_set_ptt_inverted(true); // Required for DR3100
vw_set_rx_pin(12);
vw_setup(4500); // Bits per sec
Serial.begin(9600);
pinMode(PIN_LED_A, OUTPUT);
pinMode(PIN_LED_B, OUTPUT);
vw_rx_start(); // Start the receiver PLL running
}
void loop()
{
byte message[VW_MAX_MESSAGE_LEN];
byte taille_message = VW_MAX_MESSAGE_LEN;
//est la taille max en octet d un message
//fourni par la bibliotheque Virtualwire
Serial.println();
if (vw_get_message(message, &taille_message)) // Non-blocking//recois le message
{
if (strcmp((char*) message, CMD_BUTTON_A) == 0)
{
digitalWrite(9,HIGH);
//digitalWrite(7,);
}
if (strcmp((char*) message, CMD_BUTTON_B) == 0)
{
//digitalWrite(9,LOW);
digitalWrite(7,HIGH);
}
if (strcmp((char*) message, CMD_BUTTON_NUL) == 0)
{
digitalWrite(9,LOW);
digitalWrite(7,LOW);
}
}
}

Pour ceux qu'ils l'auraient remarqué, que ce soit le A ou le B , les operations sont les même donc je ne comprend pas pourquoi A ne fonctionne pas alors que B parfaitement. J'ai mis des "controle" pour voir si arduino emetteur emets bien le message , en B il envoie bien "2" quand j'appuie mais en A , il affiche tout le temps "0" . Je pense que A clignote car il sent que le bouton A est appuyer mais ne recois pas le message .

Voila vous avez toutes les infos et tout aide est la bienvenue.

Bonjour, problème intéressant, mais commence s'il te plaît par éditer ton message et mettre les deux codes entre balises de code afin qu'il soit plus lisible.

Tout est expliqué dans le message épinglé en haut du forum.
Merci

La seule différence que je vois c'est d'un côté BPAxxxx et de l'autre BPB. Tu devrais simplifier et envoyer simplement 'A' et 'B'.

Bonjour,

C'est normal puisque tu envoies un messagequi éteint les deux leds quand le bouton B n'est pas enfoncé.
Il faut que tu gères un message qui éteint la led A quand le bouton A n'est pas enfoncé et qui éteint la led B quand le bouton B n'est pas enfoncé.

Comme le dit @lesept mets ton code entre balises de code.
Pourquoi la structure du message de commande de la led A est différent de celui de commande de la led B?
Pourquoi tu définis des constantes pour les numéros de pins et tu utilises des nombres dans ton programme?

Bonjour oui désolé de la balise c'est la premier fois que j'utilise ce forum . Sinon mon problème est résolu. D'abord pour répondre à lesept , BPAxxxx et BPB sont des messages envoyé par emetteur et recu par recepteur , il n y a pas de probleme de ce coté là car c est des message converti .
Il y aurait eu un probleme si l'emetteur et recepteur n'avait pas le meme message ( car condition du recepteur etait que le message recu doit parfaitement correspondre à ce que le recepteur connait comme message

kamill , où vois tu que mes structure de commande ne marche pas ? pour la constante my bad mais ca ne change rien au final et les nombre je suppose que tu parle de controle , tu peux l'ignorer car c'etait les premier message a envoyer ( 1 si bouton appuyé et 0 sinon ) avant d'avoir mis les autres message ( BPB et l autre )

Mon problème a été resolu simplement en rajoutant "else" avant les if ( sauf le premier if ) dans le code emtteur . j'ai teste avec 3 bouton et le resultat : si c est " if {..} else if {..} if {...} else {...}" , 1 bouton marche et 2 clignote . Quand cest " if {...} else if {..} else if {....} else {...} " , les 3 boutons marchent

Oui... Quand on n'est pas trop exigeant.

Appuie sur le bouton A, en maintenant le bouton A enfoncé appuie sur le bouton B. Les deux leds sont allumées. Relâche le bouton B, la led B ne s'éteint pas.