nrf24L01 com 3 voies

bonjour a tous

j'ouvre un nouveau topic pour avoir votre aide

toujours sur mon projet de télécommande 3 voies j'ai repris le model de J-M-L ci dessous

pour mes besoins ce que j'ai besoin de faire c'est:

1 - séparer le code en deux (émetteur/récepteur)
2 - inclure un accuse de réception spécifique qui demande un nouvel appuie sur le bp sur l'emetteur et bloque le programme sur le récepteur
3 - intégrer écran LCD en remplacement de la console

j'ai commencé l’étape 1 et 2 et j'ai déjà un soucis....

  • l’émission et réception fonctionne bien mais je n'ai plus de retour "j'ai reçu" sur l’émetteur
    -j'ai intégré un message 204 que je recevait bien lorsque le programme était unique mais je le recevait systématiquement que le relais soit activé ou non

une idée?

// ************* La Radio recepteur *************
#include <SPI.h>
#include <RF24.h> // voir http://tmrh20.github.io/RF24/

// Configurer vos radio nRF24L01+ sur le bus SPI et mettre  CE sur D7 et CSN sur D8
RF24 radio(9, 10);

// Le nom des "pipes" de communication, un en lecture, un en écriture
const byte adresses[][6] = {"0pipe", "1pipe"}; // Pipes 1-5 should share the same address, except the first byte. Only the first byte in the array should be unique

uint8_t role;


// ****************** Les Boutons ******************
// library = https://github.com/mathertel/OneButton
// documentation = http://www.mathertel.de/Arduino/OneButtonLibrary.aspx

// *************  sorties *************
const byte LEDRX = 3;
const byte relaisp = 7;
const byte buzzer = 4;
const byte relaisADD1 = 2;
const byte relaisADD2 = 6;

// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// envoi d'un octet vers l'autre radio
// ----------------------------------------------------------------------------------------

void envoyerMessage(uint8_t nombre)
{
  radio.stopListening();   // On arrête d'écouter pour qu'on puisse émettre

  if (!radio.write( &nombre, sizeof(nombre) )) {
    Serial.println(F("erreur d'envoi"));
  }
  radio.startListening(); // On se remet en mode écoute
}

// ----------------------------------------------------------------------------------------
// vérifie si on a reçu une commande de la part de l'autre radio (1 octet)
// ----------------------------------------------------------------------------------------
uint8_t ecouterRadio()
{
  uint8_t message = 0; // 0 = pas de commande

  if ( radio.available()) {
    while (radio.available()) {
      radio.read( &message, sizeof(message) );  // on lit l'octet reçu (si plusieurs messages on ne conserve que le dernier)
    }
    Serial.print(F("J'ai recu ")); Serial.println(message);
  }
  return message;
}

// ----------------------------------------------------------------------------------------

void executerAction(uint8_t messageRecu)
{
  if (messageRecu >= 1 && messageRecu <= 4) {
    switch (messageRecu) {
      case 1:
        Serial.println(F("Action pdistant"));
        digitalWrite(LEDRX, HIGH);                                                      
        delay(1100);                                                                    
        digitalWrite(LEDRX, LOW);                                                       
        int a;
      a = digitalRead(relaisp);
      if (a == 0)
      {
      digitalWrite(buzzer, HIGH);                                                    
      Serial.println("signalisation p !");                                 
      delay(2100);                                                                   
      digitalWrite(buzzer, LOW);                                                      
      digitalWrite(relaisp, HIGH);                                                
      Serial.println("montée p !");                                         
      delay (2100);
      Serial.println("pret");
      delay (2100);
    }
    else
    {
    digitalWrite(buzzer, HIGH);                                                                                                                            
        Serial.println("signalisation p!");                                                                                                   
        delay(1100);                                                                                                                                        
        digitalWrite(buzzer, LOW);                                                                                                                           
        delay(2100);                                                                                                                                                                                                                                                   
        digitalWrite(buzzer, HIGH);                                                                                                                         
        delay(3000);                                                                                                                                       
        digitalWrite(buzzer, LOW);                                                                                                                         
        digitalWrite(relaisp, LOW);                                                                                                                   
        Serial.println("descente p!");                                                                                                         
        delay(1100);                                                                                                                                       
        Serial.println("pret"); }
         envoyerMessage((uint8_t) 200);
        delay (2100);
        break;
      case 2:
        
        break;
      case 3:
        Serial.println(F("Action Bouton 3 distant"));
        
        break;
    }
    // on envoie un accusé de réception qui vaut 100 + la valeur du message
    envoyerMessage((uint8_t) 100 + messageRecu);
  } else if (messageRecu >= 100) { // c'est un ACK d'une action distante
    Serial.print(F("Confiramtion Execution action distante Bouton "));
    Serial.println(messageRecu - 100);
  } else if (messageRecu = 204) { // c'est un ACK d'une action distante
    Serial.print(F("en attente de validation bp1"));
    Serial.println(messageRecu - 204);
  }

}

// ------------------------------------------------------------------
// ------------------------------------------------------------------
// ------------------------------------------------------------------

void setup() {
  pinMode(relaisp, OUTPUT);
  pinMode(relaisADD1, OUTPUT);
  pinMode(relaisADD2, OUTPUT);
  pinMode(LEDRX, OUTPUT);
  pinMode(buzzer, OUTPUT);

  Serial.begin(115200);

  role = 0;
  Serial.print(F("\nMon Role = ")); Serial.println(role);

  // On configure la radio
  radio.begin();
  // pour le test on règle le niveau d'énergie à RF24_PA_LOW pour éviter les interférences
  // mettre à RF24_PA_MAX si on veut la puissance d'émission max
  radio.setPALevel(RF24_PA_LOW);

  // On ouvre un pipe de lecture et un d'écriture avec des noms opposés en fonction du rôle
  // comme ça un parle sur "pipe0" et l'autre écoute sur "pipe0"
  // et l'autre parle sur "pipe1" tandisque Le premier écoute sur "pipe1"

  radio.openWritingPipe(adresses[role]); // role doit être 0 ou 1
  radio.openReadingPipe(1, adresses[1 - role]); // 1 - role = l'autre adresse

  // Start the radio listening for data
  radio.startListening();
}
// ------------------------------------------------------------------

void loop() {
  uint8_t messageRecu;

  if (messageRecu = ecouterRadio()) // si on a reçu un message
    executerAction(messageRecu);    // on execute l'action associée
}
// ************* La Radio emetteur *************
#include <SPI.h>
#include <RF24.h> // voir http://tmrh20.github.io/RF24/

// Configurer vos radio nRF24L01+ sur le bus SPI et mettre  CE sur D7 et CSN sur D8
RF24 radio(9, 10);

// Le nom des "pipes" de communication, un en lecture, un en écriture
const byte adresses[][6] = {"0pipe", "1pipe"}; // Pipes 1-5 should share the same address, except the first byte. Only the first byte in the array should be unique

uint8_t role;

// ****************** Les Boutons ******************
// library = https://github.com/mathertel/OneButton
// documentation = http://www.mathertel.de/Arduino/OneButtonLibrary.aspx

#include <OneButton.h>
#include <LiquidCrystal.h>         // on importe la bibliothèque LCD

OneButton BPp(5, true); // true pour le mettre en INPUT_PULLUP
OneButton BPADD1(4, true);
OneButton BPADD2(3, true);
LiquidCrystal LCD(A0,A1,A2,A3,A4,A5); // on active l'ecran

// ----------------------------------------------------------------------------------------

void BPpClick()
{
  Serial.println(F("BPp local, envoi du message 1"));
  envoyerMessage((uint8_t)1);
}

void  BPADD1Click()
{
  Serial.println(F("BPADD1 local, envoi du message 2"));
  envoyerMessage((uint8_t) 2);
}

void BPADD2Click()
{
  Serial.println(F("Bouton 3 local, envoi du message 3"));
  envoyerMessage((uint8_t) 3);
}

void bouton4Click()
{
  Serial.println(F("BPADD2 local, envoi du message 4"));
  envoyerMessage((uint8_t) 4);
}

// ----------------------------------------------------------------------------------------

void verifierBoutons()
{
  BPp.tick();
  BPADD1.tick();
  BPADD2.tick();
}

// ----------------------------------------------------------------------------------------
// envoi d'un octet vers l'autre radio
// ----------------------------------------------------------------------------------------

void envoyerMessage(uint8_t nombre)
{
  radio.stopListening();   // On arrête d'écouter pour qu'on puisse émettre

  if (!radio.write( &nombre, sizeof(nombre) )) {
    Serial.println(F("erreur d'envoi"));
  }
  radio.startListening(); // On se remet en mode écoute
}

// ----------------------------------------------------------------------------------------
// vérifie si on a reçu une commande de la part de l'autre radio (1 octet)
// ----------------------------------------------------------------------------------------
uint8_t ecouterRadio()
{
  uint8_t message = 0; // 0 = pas de commande

  if ( radio.available()) {
    while (radio.available()) {
      radio.read( &message, sizeof(message) );  // on lit l'octet reçu (si plusieurs messages on ne conserve que le dernier)
    }
    Serial.print(F("J'ai recu ")); Serial.println(message);
  }
  return message;
}

// ------------------------------------------------------------------

void setup() {

  Serial.begin(115200);

  role = 1;
  Serial.print(F("\nMon Role = ")); Serial.println(role);

  // On configure la radio
  radio.begin();
  // pour le test on règle le niveau d'énergie à RF24_PA_LOW pour éviter les interférences
  // mettre à RF24_PA_MAX si on veut la puissance d'émission max
  radio.setPALevel(RF24_PA_LOW);

  // On ouvre un pipe de lecture et un d'écriture avec des noms opposés en fonction du rôle
  // comme ça un parle sur "pipe0" et l'autre écoute sur "pipe0"
  // et l'autre parle sur "pipe1" tandisque Le premier écoute sur "pipe1"

  radio.openWritingPipe(adresses[role]); // role doit être 0 ou 1
  radio.openReadingPipe(1, adresses[1 - role]); // 1 - role = l'autre adresse

  // Start the radio listening for data
  radio.startListening();

  // On attache la fonction boutonXClick() comme callBack en cas de simple click rapide
  // ou si le bouton est tenu longtemps appuyé (au relachement)
  // il existe 3 callback attachLongPressStart, attachLongPressStop, attachDuringLongPress
  BPp.attachClick(BPpClick);  BPp.attachLongPressStop(BPpClick);
  BPADD1.attachClick(BPADD1Click);  BPADD1.attachLongPressStop(BPADD1Click);
 BPADD2.attachClick(BPADD2Click);  BPADD2.attachLongPressStop(BPADD2Click);
}

// ------------------------------------------------------------------

void loop() {
  uint8_t messageRecu;
  verifierBoutons(); // regarde si les boutons sont enfoncés et déclenche une action dans ce cas
}