Работа с двумя и более nRF24L01

IVAN222
Offline
Зарегистрирован: 19.04.2017

Всем привет. Не могу настроить работу со второй nRF24L01.  Ардуино с nRF24L01 отправляет сигнал первой ардуино, та опрашивает состояния реле и отправляет обратно сигнал в зависимости от сигнала в ком порт идет соответствующая команда. Это все работает, нормально. Когда отправляет второй ардуино она его не принимает. Вчем может быть дело, что я делаю не так?

Меня больше интересует последний блок.

код:

#include <SPI.h>  // библиотека для работы с шиной SPI
#include "nRF24L01.h"  // библиотека радиомодуля
#include "RF24.h"  // ещё библиотека радиомодуля
#include <SoftwareSerial.h> // библиотека Serial

RF24 radio(9, 10);  // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53);  // для Меги

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};  //возможные номера труб

byte massiv[4];
SoftwareSerial Serial1(2, 3);  //RX, TX
int val = 0;
int data[2];

void setup() {
  Serial.begin(9600);  //открываем порт для связи с ардуино МЕГА
  radio.begin();  //активировать модуль
  radio.setAutoAck(1);  //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);  //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();  //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);  //размер пакета, в байтах

  radio.openWritingPipe(address[0]);  //мы - труба 0, открываем канал для передачи данных
  //radio.openReadingPipe(0,address[1]);  //хотим слушать трубу 1
  //radio.openReadingPipe(0,address[2]);  //хотим слушать трубу 2
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX);  //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS);  //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp();  //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop(){
  //  Принимаем с порта и передаем по радио 
  if(Serial.available() > 0){  //Принимаем с порта
      val = Serial.read();  //читаем данные
      if (val=='A'){  // Включить котел
          radio.stopListening();  //не слушаем радиоэфир, мы передатчик
          massiv[0] = 115;
          radio.write(massiv, 1);  //передаем 115 (Включить котел)
          radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
          radio.openReadingPipe(0,address[1]);  //хотим слушать трубу 1
          delay(50);
          if(!radio.available()){  //если получаем пустой ответ
              Serial.println("G");  //отправляем в порт
              }
          else{
              while(radio.available()){  // если в ответе что-то есть
              radio.read(massiv, 1); 
              if(massiv[0] == 116){  //принимаем 116 (Включаю котел)
                  Serial.println("A");  //отправляем в порт
                  }
              if(massiv[0] == 117){  //принимаем 117 (Котел уже включен)
                  Serial.println("B");  //отправляем в порт
                  }
              }        
          }
      }
      if (val=='B'){  // Отключить котел
          radio.stopListening();  //не слушаем радиоэфир, мы передатчик
          massiv[0] = 155;
          radio.write(massiv, 1);  //передаем 155 (Отлючить котел)
          radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
          radio.openReadingPipe(0,address[1]);  //хотим слушать трубу 1
          delay(50);
          if(!radio.available()){  //если получаем пустой ответ
              Serial.println("G");  //отправляем в порт
              }
          else{
              while(radio.available()){  // если в ответе что-то есть
              radio.read(massiv, 1); 
              if(massiv[0] == 156){  //принимаем 156 (Выключаю котел)
                  Serial.println("C");  //отправляем в порт
                  }
              if(massiv[0] == 157){  //принимаем 157 (Котел уже выключен)
                  Serial.println("D");  //отправляем в порт
                  }
              }        
          }
      }
      if (val=='C'){  // Состояние котла
          radio.stopListening();  //не слушаем радиоэфир, мы передатчик
          massiv[0] = 125;
          radio.write(massiv, 1);  //передаем 125 (Состояние котла)
          radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
          radio.openReadingPipe(0,address[1]);  //хотим слушать трубу 1
          delay(50);
          if(!radio.available()){  //если получаем пустой ответ
              Serial.println("G");  //отправляем в порт
              }
          else{
              while(radio.available()){  // если в ответе что-то есть
              radio.read(massiv, 1); 
              if(massiv[0] == 126){  //принимаем 126 (Котел включен)
                  Serial.println("E");  //отправляем в порт
                  }
              if(massiv[0] == 127){  //принимаем 127 (Котел выключен)
                  Serial.println("F");  //отправляем в порт
                  } 
              }        
          }
      } 
      if (val=='D'){  // Какая температура, влажность 
          radio.stopListening();  //не слушаем радиоэфир, мы передатчик
          massiv[0] = 118;
          radio.write(massiv, 1);  //передаем 118 (Какая температура, влажность)
          radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
          radio.openReadingPipe(0,address[2]);  //хотим слушать трубу 2
          delay(50);
          if(!radio.available()){  //если получаем пустой ответ
              Serial.println("H");  //отправляем в порт
              }
          else{
              while(radio.available()){  // если в ответе что-то есть
              radio.read(&data, sizeof(data)); // читаем данные и указываем сколько байт читать
              Serial.print("Humidity (%): ");
              Serial.println(data[1]);
              Serial.print("Temperature (oC): ");
              Serial.println(data[0]); 
              //radio.read(massiv, 1); 
              //if(massiv[0] == 118){  //принимаем 118 
               //   Serial.println("O");  //отправляем в порт
                 // }
              } 
         }
     }
     
     
  }
}

 

код второй ардуино:

#include <SPI.h>  //библиотека для работы с шиной SPI
#include "nRF24L01.h"  //библиотека радиомодуля
#include "RF24.h"  //ещё библиотека радиомодуля
#include <dht11.h>

RF24 radio(9,10);  //"создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53);  //для Меги

byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб
byte massiv[4];

dht11 sensor;

void setup(){
  radio.begin();  //активировать модуль
  radio.setAutoAck(1);  //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0,15);  //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();  //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);  //размер пакета, в байтах
  
  radio.openWritingPipe(address[2]);  //мы - труба 2, открываем канал для передачи данных
  radio.openReadingPipe(2,address[0]);  //хотим слушать трубу 0
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX);  //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS);  //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  
  radio.powerUp();  //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop() {
 int data[2];
 if(radio.available()>0){  //Принимаем по радио не пришло ли чего в буфер
     radio.read(massiv, 1);  //читаем данные
     if(massiv[0] == 118){  //если пришло 118 (Какая темп. влажность) 
             
             radio.stopListening();  //не слушаем радиоэфир, мы передатчик 
             sensor.read(8);  // читаем градусник
             delay(50);
             data[0] = int(sensor.temperature); // заполняем массив
             data[1] = int(sensor.humidity);
             //massiv[0] = 118;  
             radio.write(&data, sizeof(data)); // отправляем данные и указываем сколько байт пакет
             delay(10);
             }                  
   }
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль 
  radio.openReadingPipe(2,address[0]);  //хотим слушать трубу 0
}

 

IVAN222
Offline
Зарегистрирован: 19.04.2017

На одном канале может работать, передатчик только одна труба и приемников 6 штук, а у меня каждая нрэфка и принемает и передает, значит на одном канале может работать только две нрэфки, а третья лишняя. Она может работать только на другом канале. Вот я в последнем блоке задал другой канал. С тало работать как надо. ВСЕ!