Code pour télécommande RF (433 MHz)

Bonjour à tous,

Voilà, je suis débutant en arduino et je cherche à fabriquer une télécommande RF à l’aide de 2 arduino nano et de modules RF 433 MHz.
J’ai passé beaucoup de temps à chercher comment je pouvais faire. J’ai trouvé une bibliothèque (VirtualWire) qui permet de gérer plus facilement le code pour les modules 433 MHz ( Site de la bibliothèque ).

J’ai également essayé de commencer la programmation mais ça ne marche pas (certains vont peut-être prendre peur en voyant le code xD)

Emetteur:

//Bibliothèques
#include <VirtualWire.h>

//nom des entrées & sorties
const char BUZZER = 3;
const char LED_R = 5;
const char LED_G = 6;
const char BOUTON = 4;
//const char DATA = 2; //communication avec le module radio 433 MHz


// variables 
int etatBouton; // Etat du bouton
long temps; //variable du temps (ms)

void setup() {
 // *Initialisation logique*
 //Initialisation des différentes entrées/sorties
  pinMode(BUZZER, OUTPUT);
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(BOUTON, INPUT);
 //Initialisation de l'étatdes broches
  digitalWrite(LED_R, LOW);
  digitalWrite(LED_G, LOW);
  digitalWrite(BUZZER, LOW);
  digitalWrite(BOUTON, HIGH);
 //Initialisation des variables
  etatBouton = HIGH; 
  temps = millis();
  vw_set_tx_pin(2);
  
 //Initialisation moniteur série
  Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
    Serial.println("Début communication"); 
                                             
    vw_setup(2000);     // initialisation de la librairie VirtualWire à 2000 bauds

  digitalWrite(BUZZER, HIGH); 
  delay(30);
  digitalWrite(BUZZER, LOW); 
  digitalWrite(LED_G, HIGH);  
}

void loop() {

  etatBouton = digitalRead(BOUTON);

   if (etatBouton == LOW) //test si le bouton a un niveau logique HAUT
    {
      if ((millis() - temps) > 1000){
        digitalWrite(LED_G,LOW);
        digitalWrite(LED_R,HIGH);
        digitalWrite(BUZZER,HIGH);
      


          const char *msg="envoi : 106493"; //message à envoyer.
   vw_send((uint8_t *)msg, strlen(msg));
   vw_wait_tx();                                          
  

        digitalWrite(LED_G,HIGH);
        digitalWrite(LED_R,LOW);
        digitalWrite(BUZZER,LOW);

        delay(100);  
      }

    }
    else  //test si le bouton a un niveau logique différent de HAUT (= BAS)
    {
        digitalWrite(LED_G,HIGH);
        digitalWrite(LED_R,LOW);
        digitalWrite(BUZZER,LOW);
    }

    
}

Récepteur:

//Bibliothèques
#include <VirtualWire.h>

//nom des entrées & sorties
const char BUZZER = 12;
const char RELAI = 11;
const char LED_R = 9;
const char LED_G = 8;
const char LED_B = 10;
//const char DATA = 2; //communication avec le module radio 433 MHz


// variables 


void setup() {
 // *Initialisation logique*
 //Initialisation des différentes entrées/sorties
  pinMode(BUZZER, OUTPUT);
  pinMode(RELAI, OUTPUT);
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
 //Initialisation de l'étatdes broches
  digitalWrite(RELAI, HIGH);
  digitalWrite(LED_R, LOW);
  digitalWrite(LED_G, LOW);
  digitalWrite(LED_B, LOW);
  digitalWrite(BUZZER, LOW);
 //moniteur en série
   Serial.begin(9600); // Initialisation du port série
    Serial.println("Début communication");
 //radio
   vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds
   vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
   vw_set_rx_pin(2);
    
  //*Initialisation physique*
  digitalWrite(BUZZER, HIGH);
  delay(20);  
  digitalWrite(BUZZER, LOW); 

   digitalWrite(LED_B, HIGH);
   delay(500);
   digitalWrite(LED_B, LOW);
   delay(500); //1s
   digitalWrite(LED_B, HIGH); 
   delay(500);
   digitalWrite(LED_B, LOW);
   delay(500);
   digitalWrite(LED_B, HIGH); 
   delay(500); //2s
   digitalWrite(LED_B, LOW);
   delay(500);
   digitalWrite(LED_B, HIGH);
   delay(500); //3s
   digitalWrite(LED_B, LOW);
   delay(500);
   digitalWrite(LED_B, HIGH);
   delay(500); //4s
   digitalWrite(LED_B, LOW);
   delay(500);
   digitalWrite(LED_B, HIGH);
   delay(500); //5s
   digitalWrite(LED_B, LOW);
   delay(500);

  digitalWrite(BUZZER, HIGH);
  delay(20);  
  digitalWrite(BUZZER, LOW);
  delay(100);
  digitalWrite(BUZZER, HIGH);
  delay(20);  
  digitalWrite(BUZZER, LOW);
  
  digitalWrite(LED_G, HIGH);
   
}



void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    if (vw_get_message(buf, &buflen)) 
    {// Un message est reçu.
      int i;

        for (i = 0; i < buflen; i++)
        {
          Serial.write(buf[i]);  
        }
      Serial.println(""); 
     }
}

Pourriez-vous m’aider à trouver une solution à mon problème? (problème assez dur à résoudre seul pour un débutant)

Merci d’avance! :smiley:

if (etatBouton == [color=red]LOW[/color]) //test si le bouton a un niveau logique [color=red]HAUT[/color

Vous utilisez des pull up?

Oui

Zyaxi: ... J'ai passé beaucoup de temps à chercher comment je pouvais faire. J'ai trouvé une bibliothèque (VirtualWire) qui permet de gérer plus facilement le code pour les modules 433 MHz ( Site de la bibliothèque ).

bonsoir Pour faire une telecommande , le plus simple est d'utiliser la lib rc-switch

d'accord! merci pour votre aide! je vais essayer et je vous tient au courrent du résultat

J’ai essayé la librairie, et je n’ai pas très bien compris son fonctionnement: rien ne se passe ni pour l’émetteur et le récepteur ni dans le moniteur série.

Si ça peut vous aider, j’ai fait les schémas de l’émetteur et du récepteur (des éléments du schéma ne servent pas encore car je préfère me concentrer sur le principal en premier)

Et voici les codes:

Emetteur:

#include <RCSwitch.h>
const int buttonPin = 4;
int buttonState = 0;
const int buttonPin2 = 2;
int buttonState2 = 0;
RCSwitch mySwitch = RCSwitch();
void setup() {
 pinMode(buttonPin, INPUT);
 pinMode(buttonPin2, INPUT);
  Serial.begin(9600);

mySwitch.enableTransmit(2);
 

}
void loop() {
buttonState = digitalRead(buttonPin);
buttonState2 = digitalRead(buttonPin2);
if (buttonState == HIGH) {

  mySwitch.send(9, 24);
  delay(100);

}
else {
  if (buttonState2 == HIGH) {

  mySwitch.send(5, 24);
  delay(100);

// turn LED off:
  }
}
  delay(200);
}

Récepteur:

#include <RCSwitch.h>


int led = 13;
RCSwitch mySwitch = RCSwitch();
#define pressed1 9   
#define pressed2 5


void setup() {
  Serial.begin(9600);
 mySwitch.enableReceive(0);  
}
void loop() {


  digitalWrite(led,LOW);
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
      }
if (mySwitch.getReceivedValue())

{
    process();



}

mySwitch.resetAvailable();


Serial.println("  ");  
}
  digitalWrite(led,LOW);
  
  delay(100);
  
}
void process()
{
  unsigned long res = mySwitch.getReceivedValue();
  
  switch (res){
    case pressed1:
     Serial.println("pressed 1");
     break;
     case pressed2:
     Serial.println("pressed 2");
     break;
     
  }
}