nrf24l01 pendant le confinement

Bonjour,

Cela faisait bien longtemps que je ne suis pas venu poser des questions sur ce forum.
Nous voila donc en confinement,et de ce fait j’espère que tout le monde va bien. C'est le moment de reprendre des activités cérébrale, ou bien continuer les projet arduino en stand by.

Je vous explique rapidement de quoi il en retourne.

Je souhaite simplement réaliser une centrale de température, en gros je voudrait mettre une sonde de température dans chaque pièce de la maison et faire le relever des températures dans chaque pièce.
Tout ceci en transmission sans fils bien sur.
j'ai pour cela opter pour des modules nrf24l01 et la librairie "Mirf".
Alors tout ce passe bien avec deux modules, je peux communiquer entre les deux sous forme de question réponse (ping...pong).
Là ou cela ce corse c'est quand je souhaite communiquer avec un 3éme module. Je n'ais pas saisie la méthode a utiliser.
pourtant dans l'explication de la librairie, il est écrit qu'il suffit de changer les adresses de transmission, mais ça ne marche pas.Cela doit surement être un problème de syntaxe.
Si quelqu'un d'entre vous aurait un exemple qui pourrait m'inspirer ou une méthode à utiliser.
Merci d'avance a la communauté et surtout bon courage a vous tous en cette période difficile.

jetez un oeil plutôt du côté de TMRh20 et par exemple la partie Network ou Mesh ou simplement RF24

Bonjour,

Même commentaire que J-M-L.

J'utilise la bibliothèque en question et je n'ai pas de problème pour associer plusieurs émetteurs grâce à la technique des canaux soft (pipe).

J'ai une question, comme c'est en environnement domestique et s'il y a une box dans le coin, pourquoi ne pas utiliser un ESP, 8266 ou 32 pour faire le job ?

Si tu as une RAPBERRY PI qui traîne tu peux te renseigner sur la librairie MySensors qui fera tout le boulot à ta place.
Ensuite un serveur du genre DOMOTICZ ou JEEDOM et voilà.

Le thermomètre MySensors :

La passerelle MySensors :

Dans les deux cas tu peux utiliser soit NRF24L01 soir RFM69 (433MGHz).

Un peu de lecture : mysensors-presentation

Je ne veux pas te décourager dans ta démarche mais si tu veux simplement afficher des températures sur un écran, un serveur domotique est la solution.
Le serveur pourra également piloter des actionneurs à relais si besoin, toujours avec un NRF24L01.

Le relay actuator :

Ma centrale de température :
un-afficheur-pour-domoticz-ou-jeedom

re,

merci pour toutes ces infos je vais m'attaquer la librairie TMRh20.
Je n'ai pas mis le code car je l'ai bidouiller et un peu trop découper dans tout les sens.( j'ai tester d'autre truc dessus).
je reviendrai avec un code propre et je le publierais.

merci encore je vous tiens au jus et courage a tous.

bonjour

Apres plusieurs tentative sur ce projet je n arrive toujours pas a faire communiquer mes 3 arduino nano entre eux
excepte entre deux.
une question se pose est il vraiment possible de faire communiquer 3 nano entre eux ou bien ces cartes ne le permettent pas.
de plus je ne trouve pas d'exemple que je comprenne bien sur lol.
voici le seul code qui fonctionne pour l instant.

emetteur:

/**
 * Exemple de code pour la bibliothèque Mirf – Client Ping Pong
 */
#include <SPI.h>      // Pour la communication via le port SPI
#include <Mirf.h>     // Pour la gestion de la communication
#include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // Pour la communication SPI
 
void setup() {
  Serial.begin(9600);
   
  Mirf.cePin = 9; // Broche CE sur D9
  Mirf.csnPin = 10; // Broche CSN sur D10
  Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
  Mirf.init(); // Initialise la bibliothèque

  Mirf.channel = 1; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
  Mirf.payload = sizeof(long); // Taille d'un message (maximum 32 octets)
  Mirf.config(); // Sauvegarde la configuration dans le module radio

  Mirf.setTADDR((byte *) "nrf02"); // Adresse de transmission
  Mirf.setRADDR((byte *) "nrf01"); // Adresse de réception
   
  Serial.println("Go !"); 
}
 
void loop() {
  unsigned long time_message = millis(); // On garde le temps actuel retourné par millis()
   
  Serial.print("Ping ... ");
  Mirf.send((byte *) &time_message); // On envoie le temps actuel en utilisant une astuce pour transformer le long en octets
  while(Mirf.isSending()); // On attend la fin de l'envoi
   
  // Attente de la réponse
  while(!Mirf.dataReady()) { // On attend de recevoir quelque chose
    if (millis() - time_message > 1000 ) { // Si on attend depuis plus d'une seconde
      Serial.println("Pas de pong"); // C'est le drame ...
      return;
    }
  }
  
  // La réponse est disponible
  Mirf.getData((byte *) &time_message); // On récupère la réponse
  
  // On affiche le temps de latence (sans division par deux)
  Serial.print("Pong: ");
  Serial.print(millis() - time_message); 
  Serial.println("ms");
  
  // Pas besoin de tester plus d'une fois par seconde
  delay(1000);
}

recepteur:

/**
 * Exemple de code pour la bibliothèque Mirf – Serveur Ping Pong
 */
#include <SPI.h>      // Pour la communication via le port SPI
#include <Mirf.h>     // Pour la gestion de la communication
#include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // Pour la communication SPI

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

  Mirf.cePin = 9; // Broche CE sur D9
  Mirf.csnPin = 10; // Broche CSN sur D10
  Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
  Mirf.init(); // Initialise la bibliothèque

  Mirf.channel = 1; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
  Mirf.payload = sizeof(long); // Taille d'un message (maximum 32 octets)
  Mirf.config(); // Sauvegarde la configuration dans le module radio

  Mirf.setTADDR((byte *) "nrf01"); // Adresse de transmission
  Mirf.setRADDR((byte *) "nrf02"); // Adresse de réception

  Serial.println("Go !"); 
}

void loop() {
  byte message[sizeof(long)];

  if(!Mirf.isSending() && Mirf.dataReady()){
    Serial.println("Ping !");
    Mirf.getData(message); // Réception du paquet
    Mirf.send(message); // Et on le renvoie tel quel
  }
}

ou bien les librairies RF24Network RX et TX

/*
 Copyright (C) 2012 James Coliz, Jr. <maniacbug@ymail.com>

 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 version 2 as published by the Free Software Foundation.
 
 Update 2014 - TMRh20
 */

/**
 * Simplest possible example of using RF24Network,
 *
 * RECEIVER NODE
 * Listens for messages from the transmitter and prints them out.
 */

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>


RF24 radio(7,8);                // nRF24L01(+) radio attached using Getting Started board 

RF24Network network(radio);      // Network uses that radio
const uint16_t this_node = 00;    // Address of our node in Octal format ( 04,031, etc)
const uint16_t other_node = 01;   // Address of the other node in Octal format

struct payload_t {                 // Structure of our payload
  unsigned long ms;
  unsigned long counter;
};


void setup(void)
{
  Serial.begin(115200);
  Serial.println("RF24Network/examples/helloworld_rx/");
 
  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 90, /*node address*/ this_node);
}

void loop(void){
  
  network.update();                  // Check the network regularly

  
  while ( network.available() ) {     // Is there anything ready for us?
    
    RF24NetworkHeader header;        // If so, grab it and print it out
    payload_t payload;
    network.read(header,&payload,sizeof(payload));
    Serial.print("Received packet #");
    Serial.print(payload.counter);
    Serial.print(" at ");
    Serial.println(payload.ms);
  }
}
/*
 Copyright (C) 2012 James Coliz, Jr. <maniacbug@ymail.com>

 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 version 2 as published by the Free Software Foundation.
 
 Update 2014 - TMRh20
 */

/**
 * Simplest possible example of using RF24Network 
 *
 * TRANSMITTER NODE
 * Every 2 seconds, send a payload to the receiver node.
 */

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

RF24 radio(7,8);                    // nRF24L01(+) radio attached using Getting Started board 

RF24Network network(radio);          // Network uses that radio

const uint16_t this_node = 01;        // Address of our node in Octal format
const uint16_t other_node = 00;       // Address of the other node in Octal format

const unsigned long interval = 2000; //ms  // How often to send 'hello world to the other unit

unsigned long last_sent;             // When did we last send?
unsigned long packets_sent;          // How many have we sent already


struct payload_t {                  // Structure of our payload
  unsigned long ms;
  unsigned long counter;
};

void setup(void)
{
  Serial.begin(115200);
  Serial.println("RF24Network/examples/helloworld_tx/");
 
  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 90, /*node address*/ this_node);
}

void loop() {
  
  network.update();                          // Check the network regularly

  
  unsigned long now = millis();              // If it's time to send a message, send it!
  if ( now - last_sent >= interval  )
  {
    last_sent = now;

    Serial.print("Sending...");
    payload_t payload = { millis(), packets_sent++ };
    RF24NetworkHeader header(/*to node*/ other_node);
    bool ok = network.write(header,&payload,sizeof(payload));
    if (ok)
      Serial.println("ok.");
    else
      Serial.println("failed.");
  }
}

et vu mon niveau d'anglais et de prog je suis pas aidé lol.

merci d'avance pour le coup de pouce.

bonjour a tous

me revoilà avec un code qui fonctionne en m inspirant de tous vos différents conseils.
Vous me pardonnerez l’état brouillon du code mais je cherche a le fignoler et a le rendre plus efficace.
voici le 3 codes
1 récepteur et 2 transmetteurs.

recepteur:

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <Servo.h>
#define led 2
RF24 radio(7, 8);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 00;   // Address of our node in Octal format ( 04,031, etc)
const uint16_t node01 = 01;    // Address of the other node in Octal format
const uint16_t node02 = 02;
void setup() {
  Serial.begin(115200);
  SPI.begin();
  radio.begin();
  network.begin(90, this_node); //(channel, node address)
  radio.setDataRate(RF24_2MBPS);
 Serial.println("demarrage");
  
}
void loop() {
  
    
  network.update();
  //===== Receiving =====//
  while ( network.available() ) {     // Is there any incoming data?
   RF24NetworkHeader header;
    network.peek(header); 
    Serial.print("Received packet #");
    Serial.println();
    delay(1000);
    Serial.print("From ");
    Serial.println(header.from_node,OCT);
    Serial.print("Header Type: ");
   Serial.println((char)header.type);
//    Serial.println(header.from_node);
 unsigned long incomingData1;
    
    if(header.from_node ){
    network.read(header, &incomingData1, sizeof(incomingData1)); // Read the incoming data
    Serial.println(incomingData1);
    
    delay(1000);}
}
  }

transmetteur 1:

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#define button 2
#define led 3
RF24 radio(7, 8);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 03;   // Address of this node in Octal format ( 04,031, etc)
const uint16_t master00 = 00;      // Address of the other node in Octal format


void setup() {
  Serial.begin(115200);
  SPI.begin();
  radio.begin();
  network.begin(90, this_node);  //(channel, node address)
  radio.setDataRate(RF24_2MBPS);

}
void loop() {
  network.update();
 
  //===== Sending =====//
  // Servo control at Node 01
  unsigned long potValue = 1000;
  Serial.println(potValue);
  RF24NetworkHeader header1(master00);     // (Address where the data is going)
  bool ok = network.write(header1, &potValue, sizeof(potValue));} // Send the data
  /* LED Control at Node 012
  unsigned long buttonState = digitalRead(button);
  RF24NetworkHeader header4(node012);    // (Address where the data is going)
  bool ok3 = network.write(header4, &buttonState, sizeof(buttonState)); // Send the data
  // LEDs control at Node 022
  unsigned long pot2Value = analogRead(A1);
  RF24NetworkHeader header3(node022);    // (Address where the data is going)
  bool ok2 = network.write(header3, &pot2Value, sizeof(pot2Value)); // Send the data
}*/

transmetteur 2 :

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#define button 2
#define led 3
RF24 radio(7, 8);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 02;   // Address of this node in Octal format ( 04,031, etc)
const uint16_t master00 = 00;      // Address of the other node in Octal format


void setup() {
  Serial.begin(115200);
  SPI.begin();
  radio.begin();
  network.begin(90, this_node);  //(channel, node address)
  radio.setDataRate(RF24_2MBPS);

}
void loop() {
  network.update();
  
  //===== Receiving =====//
  while ( network.available() ) {     
    RF24NetworkHeader header2;
    
    unsigned long incomingData;
    network.read(header2, &incomingData, sizeof(incomingData));
    Serial.println(header2.from_node);
    delay(1000);}// Read the incoming data
    //Serial.println(incomingData);    // PWM output to LED 01 (dimming)
  
  //===== Sending =====//
  // Servo control at Node 01
  unsigned long potValue = analogRead(A0);
  Serial.println(potValue);
  
  RF24NetworkHeader header2(master00);     // (Address where the data is going)
  bool ok = network.write(header2, &potValue, sizeof(potValue));delay(100);} // Send the data
 ; // Send the data
}*/

j'ai vu dans un exemple trouver sur le net une "commande" que souhaiterai utiliser mais j'avoue ne pas comprendre comment, voici cette ligne qui m'intrigue:

if (header.from_node == 0) {    // If data comes from Node 02

dans l'exemple que j'exploite, cette commande est utiliser pour différencier les données arrivant de tel ou tel carte.

ce que je ne comprend pas c'est que "==0" correspond a l'adresse du "node 02" et l'autre ligne c'est
if (header.from_node == 10) {    // If data comes from Node 012

quel est le rapport entre ces 2 valeurs et comment les définir, comment savoir quelle valeur correspond a
l'adresse du node.
quelque chose m’échappe mais quoi......
y'a t il une conversion a faire j'avoue ne pas y arriver.

par contre pour recevoir toutes les donnes arrivant des autres nodes pas de soucis je reçois tout, mais j 'aimerai les différencié voila pourquoi je m'en remets a vous.

bien cordialement

voici la page dont je me suis inspiré:

pour une raison sans doute à la noix (lié peut-être au nombre de canaux) ils utilisent de l'octal (nombre en base 8) pour représenter les nombres.. le compilateur reconnaît un nombre écrit en octal s'il commence par un zéro: 0.... (binaire c'est 0b...., hexadécimal 0x..., décimal c'est les autres).

Donc 02(oct) c'est 21 = 2(dec) en décimal mais 012(oct) c'est 18+2 = 10(dec) d'où le if (header.from_node == 10) {    // If data comes from Node 012
pour être cohérent il aurait dû faire le test en octal aussiif (header.from_node == 012) {    // If data comes from Node 012

--> bref méfiez vous des nombres qui commencent par un 0, c'est de l'octal...

hello

Merci J-M-L pour d avoir éclairé ma lanterne. Effectivement j ai fait les tests et ça marche aussi avec 012.
si je comprends bien si j adressais mes node en hexa genre 0x111, je devrait écrire dans ma commande

if(header.node== 0x111)...
cela fonctionnerait aussi?

En gros il suffit simplement de recopier l'adresse déclarer dans le node transmetteur et ça fonctionne si je comprend bien.

petite question.
dans mon programme qui est toujours a l’état de brouillon, je pense que les données envoyées se télescope car j 'ai de temps en temps des pertes.
Est il judicieux de cadencer mes envois sur les transmetteur ou bien simplement de mettre mon récepteur sur un switch case afin d’écouter chaque transmetteur l'un après l'autre.
il me semble que le modules nrfl24 est capable d’écouter jusqu’à 6 canaux en même temps, mais la je me trompe peut être.

oui suffit de mettre le bon nombre, quelle que soit la base utilisée pour le représenter :slight_smile:

En effet avec le "multi-channel data receive" on a la possibilité d'utiliser les différents canaux. C'est une bonne idée si vous avez moins de 6 "clients", sinon faudra de toutes façons gérer les re-emissions

La bibliothèque RF24 sait faire cela pour vous.

bonjour

merci encore a vous J-M-L pour toutes ces précisions.

J'ai essayé de reproduire la même chose avec la bibliothèque RF24 mais rien n'y fait je n'y parviens pas.

pourtant comme vous dites cette bibliothèque parait beaucoup plus simple a utiliser mais moi je n y arrive pas lol surement un truc que je fais mal ou que je n'ai pas compris.

j'ai donc écris un tout petit bout de code très simple juste avec un récepteur et un transmetteur.
mais je n'arrive pas a émettre et a recevoir.
voici ce mini code(c'est juste un test simple):
récepteur:(qui ne fait que lire)

#include <SPI.h>
#include "RF24.h"

RF24 radio(7,8);

byte adresses [][6] = {"node1","node2"};

void setup (){
    radio.begin();
   Serial.begin(115200); 
    radio.openReadingPipe(1,adresses[1]);
    
    radio.startListening();
    delay(1000);}
 void loop(){
  
     byte donneeRecu;
      
      if(radio.available()){
      radio.read(&donneeRecu,1);
      Serial.println(donneeRecu);
      //Serial.println(hello);
      
      delay(1000);}}

transmetteur:(qui ne qu'envoyer les valeurs lu sur A0)

#include <SPI.h>
#include "RF24.h"

RF24 radio(7,8);

byte adresses [][6] = {"node1","node2"};

void setup (){
   radio.begin();
   Serial.begin(115200); 
   radio.openWritingPipe(adresses[0]);
  
  
 delay(1000);
}

void loop() {
  
  int donneeEnvoyee= analogRead (A0);
  Serial.println(donneeEnvoyee);
  //radio.startListening();
 
delay(1000);
 
  if(radio.write(&donneeEnvoyee,1)){
 Serial.println("donnee envoyee");

 delay(1000);}
}

je me suis inspiré des exemples de la bibliothèque RF24. Bon j ai toujours la possibilité de passer sur mon programme précédant qui lui fonctionne mais celui la m'intrigue aussi et j'aimerais bien le comprendre aussi.

Alors merci d'avance pour vos petits conseils qui valent de l'or pour moi :slight_smile: