[solucionado]Problema modulo nrf2401

Muy buenas tengo un problema con estos módulos ,mi finalidad es conectar 3 arduinos(un mega y dos Uno ) mediante los modulos de RF , los dos arduinos Uno enviaran datos de sensores y el arduino mega los almacenara .

Tengo 3 nrf2401 conectados , uno a cada arduino,el caso es que en una comunicación bidireccional no tengo problema , ya sea mega <-> Uno Uno<->Uno ... Bien el problema me viene al realizar la comunicación de los 3 .

Mi código esta planteado de la siguiente manera , declaro los canales de comunicación , en un principio todos escuchan , cuando Mega quiere los datos se posiciona en modo escritura llama a canal 1 o 2 , cuando este acepta ,automáticamente cambia a escucha y el nodo seleccionado cambia a trasmitir

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <DHT.h>
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#define CE_PIN   9
#define CSN_PIN 10

struct N_DHT22 {
  float T_amb;
  float HR_amb;
}DHT_N;

struct N_DHT24 {
  float T_amb;
  float HR_amb;
}DHT_24;


const uint64_t  Emisor[2] ={ 0xE8E8F0F0E1LL ,  0xE8E8F0F0E8LL }; //donde escribe 
const uint64_t  Receptor[2] ={ 0x38E8F0F0E1LL ,0x38E8F0F0E8LL }; //donde escuchamos  
//CONFIGURACIÓN NR24L01
RF24 radio(CE_PIN, CSN_PIN); // Pines de conexion de radio 




/****** SETUP ******/
void setup()   
{
  Serial.begin(9600);
  delay(1000);
  Serial.println("Nrf24L01 Nodo Maestro ");
  Wire.begin();
  radio.begin();
  //repetimos el envio en caso de error 
 radio.setRetries(15,15);
  int i;//usada para bucle 
  for ( i=1;i<=2;i++){ 
    radio.openReadingPipe(i,Receptor[i-1]); 
    }
  //Se abre canal de comunicación
  //los nodos comienzan escuchando 
  radio.startListening();
      
}//--(end setup )---
  
  
  void loop() 
  {
   delay(2000);//tiempo para esperar emisor trasmita 
  
   int i;
   for(i=1;i<=2;i++)
      {Serial.print("Comienza trasmisión con Nodo  .......");
       Serial.println(i);
       despertar_n(i);//despierta a los nodos , solo a uno 
       radio.startListening();//cambia a escuchar MEGA 
       delay(2000);
       leer_n(i);//lee datos de los nodos 
      
       }
  
}



//Nodo_i cambia de receptor a trasmisor 
void despertar_n(int nodo)
 {
   //deja de escuchar para comenzar a trasmitir 
   radio.stopListening();
   radio.openWritingPipe(Emisor[nodo-1]);
   
   bool ok=false;
   do{  
     ok=radio.write( &nodo, sizeof(nodo) );
     //enviamos "nodo", contiene numero de nodo , para que el receptor 
     // pueda saber si le toca su turno  
     if(ok)
     {
        Serial.print("aviso enviado correctamente a nodo :");
        Serial.println(nodo);
     }
     else  
     {
        Serial.print("aviso NO enviado correctamente a nodo :");
        Serial.println(nodo);
        delay(100);
            
     } 
   }while(!ok);
}


void leer_n(int nodo)
{  
   while( radio.available()!=1 ) 
   {
      Serial.println(" nada qe leer en el canal");
      delay(20);  // Para dar tiempo al emisor 
   }
   if(nodo==1)
   {
      radio.read(&DHT_N, sizeof(struct N_DHT22) ); 
     
   }  
   else 
   {
    radio.startListening();
    radio.read(&DHT_24, sizeof(struct N_DHT24) ); 
     
   }
   delay(1000);         
}

Codigo de arduino Uno 1

//elimino definiciones** 

#define NODO   1
// estructura para datos de dht22

struct N_DHT22 {
  float T_amb;
  float HR_amb;
  }DHT_N;

const uint64_t  Emisor[2] ={ 0x38E8F0F0E1LL ,0x38E8F0F0E8LL }; //donde escuchamos  
const uint64_t Receptor[2] ={ 0xE8E8F0F0E1LL ,0x38E8F0F0E8LL }; //donde escribe 
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
DHT dht(DHTPIN, DHTTYPE);
void setup()   /****** SETUP ******/
{
  Serial.begin(9600);
  radio.begin();//inicializacion comunicacion radio 
  dht.begin(); // inicialización del sensor dht22
  radio.setRetries(15,15);
  radio.openWritingPipe(Emisor[NODO-1]);
  radio.openReadingPipe(NODO,Receptor[NODO-1]);//el escucha por este canal 
  radio.startListening();
}


void loop()   /****** LOOP******/
{ 
   radio.startListening();//cada ciclo vuelve a escuchar 

   
   Serial.println("Vamos a escuchar.."); 
   escuchar();
   radio.stopListening();
   
   leer_datos();
   Enviar_datos();
    
}
   
   
void escuchar()
{   int aviso;
    bool done=false; 
    while( radio.available()!=1 ) {
         delay(20);
         }
    while( !done) {
         done=radio.read(&aviso, sizeof(aviso) );
         }     
    if(aviso==NODO) { 
         
         return;  }
           else { escuchar();  }
    //si la petición no es la esperada,, seguira escuchando...    
         
}



       
void leer_datos(){
     DHT_N.HR_amb= dht.readHumidity();                                   
     DHT_N.T_amb= dht.readTemperature(); 
     if (isnan(DHT_N.HR_amb) || isnan(DHT_N.T_amb)) {
        Serial.println("FALLO DE LECTURA");
         leer_datos();//cambio con respecto anterior version
         //return;
        }
     return;
}


void Enviar_datos(){
  bool ok=false;
  while(ok!=1){ 
      ok=radio.write( &DHT_N, sizeof( struct N_DHT22) );}
      //si se envia correctamente nos devuelve un 1 sino un 0
      
     if(ok){
              Serial.println("ENVIADO.correctamente..");
              Serial.print("HR: ");
              Serial.print(DHT_N.HR_amb);
              Serial.print(" %\t");
              Serial.print("Temperatura: ");
              Serial.print(DHT_N.T_amb);
              Serial.println(" *C ");
              }
      else{     
              Serial.print(" No se pudo enviar  ");
          }   
}

en el nodo 1 , tengo el sensor DHT22 , por eso esa función de mas

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <DHT.h>

#define DHTPIN 2     //PIN DE DATOS SENSOR 
#define DHTTYPE DHT22  // MODELO A UTILIZAR 
#define CE_PIN   9
#define CSN_PIN 10
#define NODO   2//defino que es el nodo 2 


struct N_DHT22 {
  float T_amb=25.30;
  float HR_amb=55.30;
  }DHT_N;
//de momento estos valores fijos , puesto no tengo más sensores los debo de comprar 
const uint64_t  Emisor[2] ={ 0x38E8F0F0E1LL ,0x38E8F0F0E8LL  }; //donde escuchamos  
const uint64_t Receptor[2] ={ 0xE8E8F0F0E1LL ,0xE8E8F0F0E8LL }; //donde escribe 
RF24 radio(CE_PIN, CSN_PIN); 
void setup()   /****** SETUP ******/
{
  Serial.begin(9600);
  radio.begin();//inicializacion comunicacion radio 
  radio.setRetries(15,15);
  radio.openWritingPipe(Emisor[NODO-1]);
  radio.openReadingPipe(NODO,Receptor[NODO-1]);//el escucha por este canal 
  radio.startListening();
}


void loop()   /****** LOOP******/
{ 
   radio.startListening();//cada ciclo vuelve a escuchar 
   
   //ESPERA PARA CALIBRACION
   Serial.println("Vamos a escuchar.."); 
   escuchar();
   radio.stopListening();
   delay(2000);
   Enviar_datos();
    
}

   

   
void escuchar()
{   int aviso;
    bool done=false; 
   Serial.println(radio.available());

    while( radio.available()!=1 ) {
         delay(100);
         }
    while( !done) {
         done=radio.read(&aviso, sizeof(aviso) );
         }     
    if(aviso==NODO) { 
                 return;  }
           else { escuchar();  }
    //si la petición no es la esperada,, seguira escuchando...       
}

           
void  Enviar_datos(){
  
   bool ok=false;
      

  
   while(ok!=1){ 
      ok=radio.write( &DHT_N, sizeof( struct N_DHT22) );
       delay(20);
           
}
      
   if(ok)
   {
      Serial.print("ENVIADO a maestro ..nodo 2");
   }
    
}

En este nodo creo una estructura igual , para siimular que tengo el sensor .
El problema resulta en la comunicación como siempre ... El primer nodo no tiene ningún problema en cambio con el segundo nodo a veces lo despierta , y consigue entrar a la función de enviar datos .
El caso es que si funciona bien toda la comunicación con el nodo 1 porque no con el nodo 2 ,pues no esta nunca 2 trasmitiendo a la vez , o eso creo .

Creo que esta todo bien , llevo muchas horas perdidas en esto , sino no hubiese posteado nada .

No se si el fallo esta en el MEGA o en el nodo 2 ... si sirve de algo los tengo los 3 juntos ,alimentando los arduinos por USB .
Por ejemplo la siguiente captura , no llega a enviarse el mensaje de despertar nodo2
captura de arduino mega

imagen

Pero lo curioso es que ,lo mismo a las 2 h vuelvo y esta vez si pasa el mensaje lo despierta pero el nodo 2 no contesta .
Si alguien quiere mis códigos o algunos códigos sencillos no dude en pedirlos :wink: ,saludos.

Por favor, edita tu mensaje y pega la imagen como se pide en las normas del foro. Las mismas las puedes encontrar arriba de todo de este mismo subforo.
Gracias de antemano!