Работа с двумя и более 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 штук, а у меня каждая нрэфка и принемает и передает, значит на одном канале может работать только две нрэфки, а третья лишняя. Она может работать только на другом канале. Вот я в последнем блоке задал другой канал. С тало работать как надо. ВСЕ!