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
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 ,saludos.