problème de code pour télécommande 8 relais

reBonjour
je suis novice et je cherche a remplacé la liaison de commande filaire sur une machine agricole .
le système en place est un boitier de commande en cabine avec 8 interrupteur qui pilote 8 électrovannes monté sur la machine en 12v via un câble multiconducteur qui est monté et démonté de la cabine du tracteur plusieurs fois par jour
j’ai fabriqué une télécommande avec un arduino uno en 433 mhz avec 8 interrupteurs.
et j’ai aussi fabriqué un récepteur avec un uno + recepteur 433 mhz et un carte 8 relais

après plusieurs recherche j’ai trouvé un code, le problème est que je n’arrive pas a piloté les relais
je vous met les 2 codes ci dessous

émetteur

#include <VirtualWire.h>
int butPressed1 ; // pin2
int butPressed2 ; // pin3
int butPressed3 ; //pin4
int butPressed4 ; //pin5
int butPressed5 ; //pin6
int butPressed6 ; //pin7 
int butPressed7 ; //pin8
int butPressed8 ; // pin9


void setup() {
  vw_setup(2050);
  vw_set_tx_pin(11);

  pinMode(2, INPUT_PULLUP) ;
  pinMode(3, INPUT_PULLUP) ;
  pinMode(4, INPUT_PULLUP) ; 
  pinMode(5, INPUT_PULLUP) ;
  pinMode(6, INPUT_PULLUP) ;
  pinMode(7, INPUT_PULLUP) ; 
  pinMode(8, INPUT_PULLUP) ;
  pinMode(9, INPUT_PULLUP) ;

}

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

butPressed1 = digitalRead(2) ;
 
  if(butPressed1) {
      strcpy(message, "on1") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
  }
  else {
      strcpy(message, "off1") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;    
  }


 butPressed2 = !digitalRead(3) ;
 
  if(butPressed2) {
      strcpy(message, "on2") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
  }
  else {
      strcpy(message, "off2") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;    
  }

   butPressed3 = !digitalRead(4) ;
 
  if(butPressed3) {
      strcpy(message, "on3") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
  }
  else {
      strcpy(message, "off3") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;    
  }
butPressed4 = !digitalRead(5) ;
 
  if(butPressed4) {
      strcpy(message, "on4") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
  }
  else {
      strcpy(message, "off4") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;    
  }


 butPressed5 = !digitalRead(6) ;
 
  if(butPressed5) {
      strcpy(message, "on5") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
  }
  else {
      strcpy(message, "off5") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;    
  }


   butPressed6 = !digitalRead(7) ;
 
  if(butPressed6) {
      strcpy(message, "on6") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
  }
  else {
      strcpy(message, "off6") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;    
  }
butPressed7 = !digitalRead(8) ;
 
  if(butPressed7) {
      strcpy(message, "on7") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
  }
  else {
      strcpy(message, "off7") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;    
  }


 butPressed8 = !digitalRead(9) ;
 
  if(butPressed8) {
      strcpy(message, "on8") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;
  }
  else {
      strcpy(message, "off8") ;
      vw_send(message, taille_message) ;
      vw_wait_tx() ;    
  }



}

:
récepteur :

 #include "VirtualWire.h"
 
int PinRelay1 = 2 ;
int PinRelay2 = 3 ;
int PinRelay3 = 4 ;
int PinRelay4 = 5 ;
int PinRelay5 = 6 ;
int PinRelay6 = 7 ;
int PinRelay7 = 8 ;
int PinRelay8 = 9 ;

void setup() {
  vw_setup(2050);
  vw_set_rx_pin(11) ;
  vw_rx_start();

  pinMode(PinRelay1, OUTPUT) ;
  pinMode(PinRelay2, OUTPUT) ;
  pinMode(PinRelay3, OUTPUT) ;
  pinMode(PinRelay4, OUTPUT) ;
  pinMode(PinRelay5, OUTPUT) ;
  pinMode(PinRelay6, OUTPUT) ;
  pinMode(PinRelay7, OUTPUT) ;
  pinMode(PinRelay8, OUTPUT) ;
  
}

void loop() {
  byte message[27];
  byte taille_message = 27;
  
  vw_wait_rx() ;
  
  if(vw_get_message(message, &taille_message)) { 
   if( !strcmp((char*) message, "on1") ) {
      digitalWrite(PinRelay1, HIGH) ;
    }
    if( !strcmp((char*) message, "off1") ) {
      digitalWrite(PinRelay1, LOW) ;
    }  


    if( !strcmp((char*) message, "on2") ) {
      digitalWrite(PinRelay2, HIGH) ;
    }
    if( !strcmp((char*) message, "off2") ) {
      digitalWrite(PinRelay2, LOW) ;
    }  


     if( !strcmp((char*) message, "on3") ) {
      digitalWrite(PinRelay3, HIGH) ;
    }
    if( !strcmp((char*) message, "off3") ) {
      digitalWrite(PinRelay3, LOW) ;
    }  
    
     if( !strcmp((char*) message, "on4") ) {
      digitalWrite(PinRelay4, HIGH) ;
    }
    if( !strcmp((char*) message, "off4") ) {
      digitalWrite(PinRelay4, LOW) ;
    }  


    if( !strcmp((char*) message, "on5") ) {
      digitalWrite(PinRelay5, HIGH) ;
    }
    if( !strcmp((char*) message, "off5") ) {
      digitalWrite(PinRelay5, LOW) ;
    }  


     if( !strcmp((char*) message, "on6") ) {
      digitalWrite(PinRelay6, HIGH) ;
    }
    if( !strcmp((char*) message, "off6") ) {
      digitalWrite(PinRelay6, LOW) ;
    }  
    
     if( !strcmp((char*) message, "on7") ) {
      digitalWrite(PinRelay7, HIGH) ;
    }
    if( !strcmp((char*) message, "off7") ) {
      digitalWrite(PinRelay7, LOW) ;
    }  


    if( !strcmp((char*) message, "on8") ) {
      digitalWrite(PinRelay8, HIGH) ;
    }
    if( !strcmp((char*) message, "off8") ) {
      digitalWrite(PinRelay8, LOW) ;
    }  
 
    
  }
  
 }

je réédite le message comme demandé par "al7fch " ( il avait raison )

ce que je cherche a faire, c’est que lorsque j’active l’interrupteur 1 sur le boitier émetteur je veux que le récepteur active le relai 1 ( par exemple ) et ainsi de suite pour les 8 relais
je vous remercie d’avance pour votre aide pour me dire ce qu’il ne va pas
bardoux

Bonsoir

Sur ce forum on ne balance pas le code en vrac dans le texte du message on l'insère entre deux balises particulières Voir les messages épinglés en tête du forum.

Reprends ton message dans ce sens et il suscitera plus d'intérêt.

parmi les problèmes posés par un code publié comme tu l'as fait : l'apparition de smileys dans le code :
smiley.png

smiley.png

bonsoir merci de ta reponse , je vais faire comme tu as dit
seb

la première chose à faire, c'est de mettre un Serial.print() :

  • côté émetteur, avant d'envoyer chaque message (être sûr de ce que tu envoies)
  • côté récepteur, à chaque message reçu (être sûr de ce qu'il reçoit)

Il faut peut être aussi ajouter une temporisation à la fin de loop(), sinon ça débite en continu, pour rien.
Méfies toi aussi du problème des rebonds des boutons (mettre un petit delay(40) après chaque digitalRead() )

Enfin, tu peux certainement simplifier ton code en utilisant une boucle for ()

hello

le problème est que je n'arrive pas a piloté les relais

tu n'es pas assez explicite

quelle télécommande, (un lien)?
comment les as tu raccordées à tes platines arduino
elle émet bien?
elle reçoit bien?
tu ne sais pas décortiquer la commande reçue ?
...???

bonsoir a tous , merci de vos réponse

@biggil : j’ai essayé de mettre Serial.print () mais il m’indique une erreur
@dfgh : pour le moment j’ai fais un montage sur 2 breadbord avant de soudé définitivement sur la machine

pour la télécommande : actuellement j’ai un boitier en cabine avec 8 interrupteurs a bascule qui sont relié au électrovannes du bloc hydraulique de l’outil par un câble multiconducteur ( le câble est a remplacé car sur les 14 conducteurs disponible j’en est plus que 4 qui ne sont pas coupé a diverse endroit a force d’être monté et demonté de la cabine minimum 8 fois / jour ).
le tout est branché sur la batterie 12v du moteur .

je veux supprimé le câble multiconducteur et mettre dans le boitier en cabine un arduino uno avec les pins 2 à 9 relié a chacun des interrupteur du boitier et ajouté aussi un module RF433mhz afin qu’il transmette a un 2eme arduino nano équipé aussi d’un module RF433mhz les interrupteurs activé sur le boitiers en cabine .
ce 2eme arduino commandera les 8 relais de la carte relai https://www.amazon.fr/gp/product/B07QTJ7VW6/ref=ppx_yo_dt_b_asin_image_o04_s00?ie=UTF8&psc=1 ,
ces même relai via une alimentation externe vont activé les différentes électrovannes de l’outil

les relais doivent change d’etat tant que l’interrupteur est actif , si l’interrupteur revient a zero , le relais doit aussi revenir a zero ( ca revient a allumé une led qui si on appuie sur l’interrupteur , si on lache l’interrupteur la led s’eteint )

voila pour etre precis sur mon projet

  • le probléme pour le moment est que lorsque j’envoie du +5v a l’un des pins qui sera relié a l’un des interrupteur du boitier plus tard et je n’est aucun des 8 relais qui change d’etat via l’autre arduino.
    *pour ce qui est de l’emission reception je ne sais pas si ca fonction bien mais je pense a un probléme de code
    *pour la carte relai je sais qu’elle fonctionne car j’ai testé chacun des relai avec le +5v et je les ait aussi testé en faisant tourné le sketch blink en direct depuis un autre arduino

je vous remet les 2 codes que j’ai un peu modifié par rapport a mon 1er pour essayé de trouvé la solution a mon probléme , un pour l’emeteur et l’autre pour le recepteur

emeteur :

 #include <VirtualWire.h>
int avance = 2;
int recule = 3;
int rotagauche = 4;
int rotadroite = 5;
int montee = 6;
int descente = 7;
int telescope =8;
int serrage =9;

void setup() {
vw_setup (2000);
vw_set_tx_pin(12); // pin de data 12
pinMode (avance, INPUT); // que se soit input ou input_pullup , le probleme persiste
pinMode (recule, INPUT);// que se soit input ou input_pullup , le probleme persiste
pinMode (rotagauche, INPUT_PULLUP);// que se soit input ou input_pullup , le probleme persiste
pinMode (rotadroite, INPUT_PULLUP);// que se soit input ou input_pullup , le probleme persiste
pinMode (montee, INPUT_PULLUP);// que se soit input ou input_pullup , le probleme persiste
pinMode (descente, INPUT_PULLUP);// que se soit input ou input_pullup , le probleme persiste
pinMode (telescope, INPUT_PULLUP);// que se soit input ou input_pullup , le probleme persiste
pinMode (serrage, INPUT_PULLUP);// que se soit input ou input_pullup , le probleme persiste
}

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

//avance = !digitalRead (2);
if (avance == HIGH){
  strcpy (message, "on2");
  vw_send (message, taille_message);
  vw_wait_tx();
  }

else {
  strcpy(message,"off2");
  vw_send(message,taille_message);
  vw_wait_tx();
}
 //recule = !digitalRead (3);
if (recule == HIGH){
  strcpy (message, "on3");
  vw_send (message, taille_message);
  vw_wait_tx();
  }

else {
  strcpy(message,"off3");
  vw_send(message,taille_message);
  vw_wait_tx();
}
//rotagauche  = !digitalRead (4);
if (rotagauche){
  strcpy (message, "on4");
  vw_send (message, taille_message);
  vw_wait_tx();
  }

else {
  strcpy(message,"off4");
  vw_send(message,taille_message);
  vw_wait_tx();
}
//rotadroite = !digitalRead (5);
if (rotadroite){
  strcpy (message, "on5");
  vw_send (message, taille_message);
  vw_wait_tx();
  }

else {
  strcpy(message,"off5");
  vw_send(message,taille_message);
  vw_wait_tx();
}
//montee = !digitalRead (6);
if (montee){
  strcpy (message, "on6");
  vw_send (message, taille_message);
  vw_wait_tx();
  }

else {
  strcpy(message,"off6");
  vw_send(message,taille_message);
  vw_wait_tx();
}
//descente = !digitalRead (7);
if (descente){
  strcpy (message, "on7");
  vw_send (message, taille_message);
  vw_wait_tx();
  }

else {
  strcpy(message,"off7");
  vw_send(message,taille_message);
  vw_wait_tx();
}
//telescope = !digitalRead (8);
if (telescope){
  strcpy (message, "on8");
  vw_send (message, taille_message);
  vw_wait_tx();
  }

else {
  strcpy(message,"off8");
  vw_send(message,taille_message);
  vw_wait_tx();
}
//serrage = !digitalRead (9);
if (serrage){
  strcpy (message, "on9");
  vw_send (message, taille_message);
  vw_wait_tx();
  }

else {
  strcpy(message,"off9");
  vw_send(message,taille_message);
  vw_wait_tx();
}

}

recepteur :

 #include "VirtualWire.h"
 
int pinrelay1 = 2 ;
int pinrelay2 = 3 ;
int pinrelay3 = 4 ;
int pinrelay4 = 5 ;
int pinrelay5 = 6 ;
int pinrelay6 = 7 ;
int pinrelay7 = 8 ;
int pinrelay8 = 9 ;

void setup() {
  vw_setup(2000);
  vw_set_rx_pin(11) ;
  vw_rx_start();

  pinMode(pinrelay1, OUTPUT) ;
  pinMode(pinrelay2, OUTPUT) ;
  pinMode(pinrelay3, OUTPUT) ;
  pinMode(pinrelay4, OUTPUT) ;
  pinMode(pinrelay5, OUTPUT) ;
  pinMode(pinrelay6, OUTPUT) ;
  pinMode(pinrelay7, OUTPUT) ;
  pinMode(pinrelay8, OUTPUT) ;
  
}

void loop() {
  byte message[27];
  byte taille_message = 27;
  
  vw_wait_rx() ;
  
  if(vw_get_message(message, &taille_message)) { 
   if( !strcmp((char*) message, "on1") ) {
      digitalWrite(pinrelay1, HIGH) ;
    }
    else {
      digitalWrite(pinrelay1, LOW) ;
    }  


    if( !strcmp((char*) message, "on2") ) {
      digitalWrite(pinrelay2, HIGH) ;
    }
    else {
      digitalWrite(pinrelay2, LOW) ;
    }  


     if( !strcmp((char*) message, "on3") ) {
      digitalWrite(pinrelay3, HIGH) ;
    }
    else {
      digitalWrite(pinrelay3, LOW) ;
    }  
    
     if( !strcmp((char*) message, "on4") ) {
      digitalWrite(pinrelay4, HIGH) ;
    }
    else {
      digitalWrite(pinrelay4, LOW) ;
    }  


    if( !strcmp((char*) message, "on5") ) {
      digitalWrite(pinrelay5, HIGH) ;
    }
    else {
      digitalWrite(pinrelay5, LOW) ;
    }  


     if( !strcmp((char*) message, "on6") ) {
      digitalWrite(pinrelay6, HIGH) ;
    }
    else {
      digitalWrite(pinrelay6, LOW) ;
    }  
    
     if( !strcmp((char*) message, "on7") ) {
      digitalWrite(pinrelay7, HIGH) ;
    }
    else {
      digitalWrite(pinrelay7, LOW) ;
    }  


    if( !strcmp((char*) message, "on8") ) {
      digitalWrite(pinrelay8, HIGH) ;
    }
    else {
      digitalWrite(pinrelay8, LOW) ;
    }  
 
    
  }
  
 }

je pense que je n’ai pas fait d’erreur dans la nomination et la fonction de chaque pin nécessaire, je pense que j’ai un problème de code dans l’envoie et la réception.
si quelqu’un pourrait et voudrait m’écrire un bout de code pour l’émission et la réception des 2 premiers interrupteur après je pourrait complété pour les 6 autres interrupteur :wink: ( mais si il veut relevé le défi pour les 8 fonctions , sa serait avec un grand plaisir :smiley: :smiley: )

je vous remercie d’avance pour votre aide .
je suis novice je sait allumé une une led depuis une carte mais le language sans fil reste un probléme pour l’instant

bardoux

Il ne faut pas mettre Serial.print() avec rien entre les parenthèses !
entre les parenthèses, tu peux mettre

  • du texte fixe entre ""
  • une variable dont tu veux connaitre la valeur
    exemple
Serial.print ( "message reçu = " );
Serial.println ( message );

Bonjour biggil

Ok, donc dans mon cas il faudrait que je mette quelle code pour vérifier que les pin des interrupteur correspondant emetteur passe de la position HIGH et LOW ou vérifier la variation de tension
Et qu'il envoi les messages on et off correspondant à chaque interrupteur

Il faudrait que je mette quelle code au récepteur pour vérifier les messages reçu

Merci pour ton aide
Bardoux

les entrees interrupteurs doivent etre input_pullup

il vaudrait mieux tester les exemples emitter et receiver de la biblio virtualwire à la maison en éloignant l'emetteur et le récepteur de 4-5 metres, y'a-t-il des "antennes" à l'émetteur et au récepteur ?
l'alimentation de l'émetteur est relié au +5v de l'arduino ?

un lien sur les modules 433mhz utilisés ?
un schema sommaire serait utile pour avoir des réponses ciblées

@elektrax
*que je mette INPUT ou INPUT_PULLUP ca change rien
*j'ai changé l'alim au +5v , ca change rien
*module rf :

j'ai fait un shema en JPEG , mais je ne sais pas le coller dans cette reponse
comment faire?

il y a quelque mois j'avais fait un montage rf sur breadbord avec 2 interrupteur d'un coté et 2 led de l'autre et ca fonctionné
j'ai juste rajouté des entré sortie au programme et renomé les entré sortie depuis .
je vais essayé de refaire le montage d'origine et retrouvé le code mais je vous tient au fait

Bonjour,

Les modules que tu as choisi sont vraiment ce qu’il y a de plus bas de gamme (en particulier le récepteur). Il y a peu de chance que tu arrives à avoir une communication fiable.
Pour le même type de modules, ceux ci sont beaucoup plus qualitatifs.

Pour insérer une image tu cliques sur ‘REPLY’ et en dessous de la zone de saisie tu cliques sur ‘Attachments and other options’

pour le débogage :
l'exemple que je donne en #6 fait afficher sur le moniteur série:

message reçu = (la valeur de la variable appelée "message")

Donc côté emetteur, tu ajoutes ces deux lignes juste après avoir calculé une variable (le message à envoyer, par exemple, ou autre)
côté récepteur, tu les ajoutes juste après avoir reçu le message

voila j'espere que je suis arrivé a mettre l'image et quelle vous est clair de mon projet

nouvelle essai >:( avec une image de- 2 mo

youpi merci @kamill

Tu as plusieurs problèmes dans tes programmes:

  • dans la partie émetteur tu confonds le numéro de pin avec l’état de la pin
  • dans la partie récepteur tu traites mal la réception. Quand tu reçoit un message n, tu remets à LOW toutes les sorties précédentes.
  • la numérotation commence à 2 en émission et 1 en réception.

Si tu utilises INPUT_PULLUP il faut relier tes switchs au GND et non au 5V

Tu aurais tout intérêt d'utiliser une boucle for pour l'émission au lieu d'écrire 8 fois la même chose.

Je te laisse corriger, mais si tu veux je te mets des programmes tels que je les aurai faits pour exemple.

merci kamill de ta réponse

j'ai regardé l'histoire de numérotation mais je ne trouve pas.

j'ai déjà utilisé les boucles FOR WHILE mais c'était il y a 25 ans a l'école sur les calculatrices casio ............
depuis je n'est plus pratiqué

puisque tu me le propose , je vais abusé de ta gentillesse :smiley: :smiley: je veut bien bien que tu me mette des programmes comme tu aurai fait.
ce que veut c'est que lorsque il y a appui sur l'interrupteur coté émission , le relai correspondant coté réception s'active et si je lâche l'interrupteur ; le relai se désactive ( je préfère le précisé avant que tu commence a écrire )

je te remercie d'avance pour le temp passé
et je vais apprendre en plus :smiley:

bardoux

émetteur

#include <VirtualWire.h>
const byte pinSwitchs[] = {2, 3, 4, 5, 6, 7, 8, 9};
const byte NB_SWITCHS = sizeof pinSwitchs;

void setup()
{
  vw_setup (2000);
  vw_set_tx_pin(12); // pin de data 12
  for (byte i = 0; i < NB_SWITCHS; i++)
    pinMode(pinSwitchs[i], INPUT_PULLUP);
}

void loop()
{
  char message[20];

  for (byte i = 0; i < NB_SWITCHS; i++)
  {
    if (digitalRead(pinSwitchs[i]) == LOW)
      sprintf(message, "on%d", i);
    else
      sprintf(message, "off%d", i);
    vw_send((byte *)message, strlen(message) + 1);
    vw_wait_tx();
  }

  delay(100);
}

récepteur

#include "VirtualWire.h"

const byte pinRelays[] = {2, 3, 4, 5, 6, 7, 8, 9};
const byte NB_RELAYS = sizeof pinRelays;

void setup() {
  Serial.begin(115200);

  vw_setup(2000);
  vw_set_rx_pin(11) ;
  vw_rx_start();

  for (byte i = 0; i < NB_RELAYS; i++)
    pinMode(pinRelays[i], OUTPUT) ;
}

void loop() {
  char message[20];
  byte taille_message = sizeof message;

  vw_wait_rx() ;
  if (vw_get_message((byte *)message, &taille_message))
  {
    Serial.println(message);
    byte nRelai = atoi(message + taille_message - 2);

    if (strncmp(message, "on", 2) == 0)
      digitalWrite(pinRelays[nRelai], LOW) ;  // suppose que les relais sont commandés à l'état bas.
    else                                      // A inverser dans le cas contraire
      digitalWrite(pinRelays[nRelai], HIGH) ;
  }
}

Je te rappelle que les switchs doivent être reliés au GND et non au 5V

@kamill : concernant tes module 433 , tu n'aurais pas un fournisseur Français ou européen par ce que le délai de 1 mois c'est long et je n'est pas trouvé le même modèle sur amazon , bangood

merci de ta réponse
bardoux

C’est surtout le récepteur qui est de piètre qualité.
Tu peux utiliser un RXB6 de bien meilleure qualité. Je pense que tu peux en trouver sur Amazon.