Problema con envió de datos en módulos nrf24L01

Estoy tratando de hacer una red de comunicación con módulos nrf24L01, tengo dos transmisores y un receptor, la comunicación que quiero es sencilla, que los transmisores envíen los datos de un sensor de humedad y un sensor de presión, hago el envío de los datos mediante structs, esto me ha funcionado con comunicaciones mas sencillas, entre dos módulos solamente, pero mi problema llega al querer recibir más datos de otro módulo, intenté incluso con la librería de RF24Network, pero salió peor, porque con el método que había ideado el único problema era que los datos llegaban mezclados, pero si llegaban. Dejo los códigos para quienes los necesiten revisar
Código del receptor:

// Nodo 00 MAESTRO RECEPTOR
#include <SPI.h>
#include <RF24.h>
#include <RF24Network.h>
RF24 radio(8, 7); // nRF24L01 (CE, CSN)
//RF24Network RED(radio);
const uint16_t this_node = 00;
const uint64_t addresses[] = {0x7878787878LL, 0xB3B4B5B6F1LL};

float h;
float C;
double PresionBase;
double Presion = 0;
double Altura = 0;
double Temperatura = 0;
const int ledTemp = 2;
const int ledHum = 3;
const int ledPre = 4;
const int ledAlt = 5;

struct recibir {
  float h;
  float C;
  double PresionBase;
  double Presion = 0;
  double Altura = 0;
  double Temperatura = 0;
};
recibir datos;

void setup() {
  Serial.begin(9600);
  pinMode(ledTemp, OUTPUT);
  pinMode(ledHum, OUTPUT);
  pinMode(ledPre, OUTPUT);
  pinMode(ledAlt, OUTPUT);
  SPI.begin();
  radio.begin();
  //RED.begin(90, this_node);
  radio.openReadingPipe(0, addresses[0]); // ENVIAR
  radio.openReadingPipe(1, addresses[1]); // ENVIAR
  radio.setPALevel(RF24_PA_LOW);
  radio.setDataRate(RF24_2MBPS);
  radio.startListening();
}

void loop() {
 
  while (radio.available()) {
    radio.read(&datos, sizeof(recibir));
    h = datos.h;
    C = datos.C;
    PresionBase = datos.PresionBase;
    Presion = datos.Presion;
    Altura = datos.Altura;
    Temperatura = datos.Temperatura;
  }

  if (h >= 16) {
    digitalWrite(ledHum, HIGH);
  } else {
    digitalWrite(ledHum, LOW);
  }
  if (C >= 31) {
    digitalWrite(ledTemp, HIGH);
  } else {
    digitalWrite(ledTemp, LOW);
  }
  if (Presion >= 903.1) {
    digitalWrite(ledPre, HIGH);
  } else {
    digitalWrite(ledPre, LOW);
  }
  Serial.print(h); Serial.print("  ");
  Serial.print(C); Serial.print("  ");
  Serial.print(Temperatura); Serial.print("  ");
  Serial.print(Presion); Serial.print("  ");
  Serial.println(Altura);
}

Código del primer nodo con el sensor de húmedad

#include <SPI.h>
#include <RF24.h>
#include <RF24Network.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTpin 3
#define DHTtype DHT11
DHT Dht(DHTpin, DHTtype); //inicializamos el sensor
RF24 radio(8, 7); // nRF24L01 (CE, CSN)
RF24Network RED(radio);
const uint64_t address = 0x7878787878LL;
const unsigned long interval = 1000;
unsigned long last_sent;

struct nodoA {
  float h;
  float C;
};
nodoA datos;

void setup() {
  Serial.begin(9600);
  Dht.begin();
  radio.begin();
  //RED.begin(90, this_node);
  radio.openWritingPipe(address); // ENVIAR
  radio.setPALevel(RF24_PA_LOW);
  radio.setDataRate(RF24_2MBPS);
}

void loop() {
  radio.stopListening();
  unsigned long now = millis();
  if (now - last_sent >= interval) {
    last_sent = now;
    datos.h = Dht.readHumidity(); //leemos la humedad relativa
    datos.C = Dht.readTemperature(); //leemos la temperatura ( en grados Celsius por defecto)
    radio.write(&datos, sizeof(nodoA));
  }
}

Código del segundo nodo con el sensor de presión:

#include <SPI.h>
#include <RF24.h>
#include <RF24Network.h>
RF24 radio(8, 7); // nRF24L01 (CE, CSN)
RF24Network RED(radio);
#include <SFE_BMP180.h>
#include <Wire.h>
//Se declara una instancia de la librería
SFE_BMP180 pressure;
const unsigned long interval = 1000;
unsigned long last_sent;
const uint64_t address = 0xB3B4B5B6F1LL;

struct nodoB {
  double PresionBase;
  double Presion = 0;
  double Altura = 0;
  double Temperatura = 0;
};
nodoB datos2;

char status;

void setup() {
  Serial.begin(9600);
  radio.begin();
  //RED.begin(90, this_node);
  radio.openWritingPipe(address); // ENVIAR
  radio.setPALevel(RF24_PA_LOW);
  radio.setDataRate(RF24_2MBPS);
  //Se inicia el sensor y se hace una lectura inicial
  SensorStart();
}

void loop() {
   unsigned long now = millis();
  radio.stopListening();
  if (now - last_sent >= interval) {
    last_sent = now;
    ReadSensor();
    radio.write(&datos2, sizeof(nodoB));  
  }
}
void SensorStart() {
  //Secuencia de inicio del sensor
  if (pressure.begin())
    Serial.println("BMP180 init success");
  else
  {
    Serial.println("BMP180 init fail (disconnected?)\n\n");
    while (1);
  }
  //Se inicia la lectura de temperatura
  status = pressure.startTemperature();
  if (status != 0)  {
    delay(status);
    //Se lee una temperatura inicial
    status = pressure.getTemperature(datos2.Temperatura);
    if (status != 0)    {
      //Se inicia la lectura de presiones
      status = pressure.startPressure(3);
      if (status != 0)
      {
        delay(status);
        //Se lee la presión inicial incidente sobre el sensor en la primera ejecución
        status = pressure.getPressure(datos2.PresionBase, datos2.Temperatura);
      }
    }
  }
}
void ReadSensor() {
  //En este método se hacen las lecturas de presión y temperatura y se calcula la altura
  //Se inicia la lectura de temperatura
  status = pressure.startTemperature();
  if (status != 0)
  {
    delay(status);
    //Se realiza la lectura de temperatura
    status = pressure.getTemperature(datos2.Temperatura);
    if (status != 0)
    {
      //Se inicia la lectura de presión
      status = pressure.startPressure(3);
      if (status != 0)
      {
        delay(status);
        //Se lleva a cabo la lectura de presión,</span>
        //considerando la temperatura que afecta el desempeño del sensor</span>
        status = pressure.getPressure(datos2.Presion, datos2.Temperatura);
        if (status != 0)
        {
          //Cálculo de la altura en base a la presión leída en el Setup
          datos2.Altura = pressure.altitude(datos2.Presion, datos2.PresionBase);
        }
        else Serial.println("Error en la lectura de presion\n");
      }
      else Serial.println("Error iniciando la lectura de presion\n");
    }
    else Serial.println("Error en la lectura de temperatura\n");
  }
  else Serial.println("Error iniciando la lectura de temperatura\n");
}

No sé lo que me esté causando ese problema al recibir los datos, ya intenté otras cosas pero sin éxito alguno. Espero puedan ayudarme

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.