Exemple de communication NRF24L01

Bonjour

je vois de nombreuses requêtes pour des montages à base de NRF24L01(+). Voici un petit code ultra simple qui va prendre ce que vous tapez dans la console Série ouverte 115200 bauds et l’envoyer de l’autre côté où ce sera imprimé sur l’autre moniteur série ==> ça va vous permettre de tester le montage

il faut installer la dernière version de RF24 et s’assurer que vos modules sont correctement alimentés et connectés. (il y a des tutos pour cela dans la partie Tutoriels et Cours du forum francophone).

Voici le code de l’émetteur:

// EMETTEUR (SENDER CODE)
#include <RF24.h> // voir https://nrf24.github.io/RF24/

const byte CEPin = 8;
const byte CSNPin = 7;
RF24 radio(CEPin, CSNPin);

uint8_t adresse[] = {0xCC, 0xCE, 0xCC, 0xCE, 0xCC};

// on déclare ce qui sera dans le message ici juste un octet au fil de l'eau
// dans le vrai code il faudrait transmettre un message midi
struct __attribute__ ((packed)) t_message {
  uint8_t payload;
} message;

void envoyerMessage(t_message &msg)
{
  if (!radio.write( &msg, sizeof(t_message) )) Serial.println(F("erreur d'envoi"));
  else Serial.print((char) message.payload);
}

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

  if (!radio.begin()) {
    Serial.println(F("radio absente!!"));
    while (true) ; // erreur
  }

  radio.setPALevel(RF24_PA_LOW);
  radio.setPayloadSize(sizeof(t_message));
  radio.openWritingPipe(adresse);
  radio.stopListening();
  Serial.println(F("**** ÉMETTEUR PRET ****"));
}

void loop() {
  int recu = Serial.read();
  if (recu != -1) { // -1 veut dire aucun caractèr ereçu
    message.payload = recu; 
    envoyerMessage(message);
  }
}

Voici le code du récepteur:

// RECEPTEUR (RECEIVER CODE)
#include <RF24.h> // voir https://nrf24.github.io/RF24/

const byte CEPin = 8;
const byte CSNPin = 7;
RF24 radio(CEPin, CSNPin);

uint8_t adresse[] = {0xCC, 0xCE, 0xCC, 0xCE, 0xCC};

struct __attribute__ ((packed)) t_message {
  uint8_t payload;
} message;

boolean ecouterRadio(t_message & msg)
{
  boolean messageRecu = false;
  if (radio.available()) {
    radio.read( &msg, sizeof(t_message));  // on lit le message
    messageRecu = true;
  }
  return messageRecu;
}

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

  if (!radio.begin()) {
    Serial.println(F("radio absente!!"));
    while (true) ; // erreur
  }

  radio.setPALevel(RF24_PA_LOW);
  radio.setPayloadSize(sizeof(t_message));
  radio.openReadingPipe(1, adresse);
  radio.startListening();
  Serial.println(F("**** RECEPTEUR PRET ****"));
}

void loop() {
  if (ecouterRadio(message)) Serial.print((char) message.payload);
}

Le code est un peu évolutif, ce qui est transmis c’est le contenu de la structure message

struct __attribute__ ((packed)) t_message {
  uint8_t payload;
} message;

qui ici ne contient qu’un seul octet (que l’on initialise avant envoi par ce que l’on a reçu sur le port série).

Si vous vouliez envoyer quelque chose de plus compliqué, il suffit de redéfinir la structure avec vos attributs et dans la boucle de remplir la structure puis de l’envoyer par envoyerMessage(message);