Работа с двумя и более nRF24L01
- Войдите на сайт для отправки комментариев
Вс, 21/01/2018 - 19:37
Всем привет. Не могу настроить работу со второй 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
}
На одном канале может работать, передатчик только одна труба и приемников 6 штук, а у меня каждая нрэфка и принемает и передает, значит на одном канале может работать только две нрэфки, а третья лишняя. Она может работать только на другом канале. Вот я в последнем блоке задал другой канал. С тало работать как надо. ВСЕ!