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