Всем привет,не так давно я выкладывал пост Нужна помощь с модулем NRF24L01 там я описал свою проблему,но естественно никто мне не помог,как говорится сидят там диванные эксперты,лишь бы побазарить о том что всё не так, я возращаюсь теперь сюда с решением своей проблемы,спросите меня зачем я это выкладываю,ведь я решил свою проблему,да потому что найдётся та часть людей с такой же проблемой, и я хочу им помочь.
Использую Arduino Mega 2560(выступает в качестве платы исполнения(приёмник)), Arduino Nano(выступает в качестве платы управления(передатчик)), два модуля NRF24L01 и 8-релейный модуль.
Кстати о подключении NRF24L01 к Arduino Nano: CE-D9, CSN-D10, SCK-D13, MO-D11, MI-D12,а к Arduino Mega 2560: CE-D10, CSN-D53, SCK-D52, MO-D51, MI-D50.(У меня модули подключены через специальные стабилизирующие платы на 3.3 вольта).
На пинах Arduino Megs 2560 2,3,4,5,6,7,8,9 подключены реле,а на передатчике Arduino Nano кнопки подключены к пинам D2,D3,D4,D5,D6,D7,D8,A0(Со стягивающим резистором к 5В).(Все пины замыкаются на землю).
Код:
RX (приёмник):
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(10,53); // "создать" модуль на пинах 9 и 10 Для Уно 9,53 для Меги
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб
byte recieved_data[8];
byte relay1 = 2; // реле на 2 цифровом
byte relay2 = 3; // реле на 3 цифровом
byte relay3 = 4; // реле на 4 цифровом
byte relay4 = 5; // реле на 5 цифровом
byte relay5 = 6; // реле на 6 цифровом
byte relay6 = 7; // реле на 7 цифровом
byte relay7 = 8; // реле на 8 цифровом
byte relay8 = 9; // реле на 9 цифровом
void setup(){
pinMode(relay1, OUTPUT); // настроить пин реле как выход
pinMode(relay2, OUTPUT); // настроить пин реле как выход
pinMode(relay3, OUTPUT); // настроить пин реле как выход
pinMode(relay4, OUTPUT); // настроить пин реле как выход
pinMode(relay5, OUTPUT); // настроить пин реле как выход
pinMode(relay6, OUTPUT); // настроить пин реле как выход
pinMode(relay7, OUTPUT); // настроить пин реле как выход
pinMode(relay8, OUTPUT); // настроить пин реле как выход
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0,15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1,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() {
byte pipeNo;
while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб
radio.read( &recieved_data, sizeof(recieved_data) ); // чиатем входящий сигнал
digitalWrite(relay1, recieved_data[0]); // подать на реле сигнал с 0 места массива
//то бишь 0 или 1
digitalWrite(relay2, recieved_data[1]); // подать на реле сигнал с 1 места массива
//то бишь 0 или 1
digitalWrite(relay3, recieved_data[2]); // подать на реле сигнал с 2 места массива
//то бишь 0 или 1
digitalWrite(relay4, recieved_data[3]); // подать на реле сигнал с 3 места массива
//то бишь 0 или 1
digitalWrite(relay5, recieved_data[4]); // подать на реле сигнал с 4 места массива
//то бишь 0 или 1
digitalWrite(relay6, recieved_data[5]); // подать на реле сигнал с 5 места массива
//то бишь 0 или 1
digitalWrite(relay7, recieved_data[6]); // подать на реле сигнал с 6 места массива
//то бишь 0 или 1
digitalWrite(relay8, recieved_data[7]); // подать на реле сигнал с 7 места массива
//то бишь 0 или 1
}
}
TX(передатчик):
#include <SPI.h> // библиотека для работы с шиной SPI
#include "nRF24L01.h" // библиотека радиомодуля
#include "RF24.h" // ещё библиотека радиомодуля
RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte transmit_data[8];
byte button1 = 2; // кнопка на 2 цифровом
byte button2 = 3; // кнопка на 3 цифровом
byte button3 = 4; // кнопка на 4 цифровом
byte button4 = 5; // кнопка на 5 цифровом
byte button5 = 6; // кнопка на 6 цифровом
byte button6 = 7; // кнопка на 7 цифровом
byte button7 = 8; // кнопка на 8 цифровом
int button8 = 0; // кнопка на 0 аналоговом
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //время между попыткой достучаться, число попыток
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
pinMode(button1, INPUT_PULLUP); // настроить пин кнопки
pinMode(button2, INPUT_PULLUP); // настроить пин кнопки
pinMode(button3, INPUT_PULLUP); // настроить пин кнопки
pinMode(button4, INPUT_PULLUP); // настроить пин кнопки
pinMode(button5, INPUT_PULLUP); // настроить пин кнопки
pinMode(button6, INPUT_PULLUP); // настроить пин кнопки
pinMode(button7, INPUT_PULLUP); // настроить пин кнопки
pinMode(button8, INPUT_PULLUP); // настроить пин кнопки
radio.openWritingPipe(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.stopListening(); //не слушаем радиоэфир, мы передатчик
}
void loop() {
transmit_data[0] = digitalRead(button1); // сигнал с кнопки
transmit_data[1] = digitalRead(button2); // сигнал с кнопки
transmit_data[2] = digitalRead(button3); // сигнал с кнопки
transmit_data[3] = digitalRead(button4); // сигнал с кнопки
transmit_data[4] = digitalRead(button5); // сигнал с кнопки
transmit_data[5] = digitalRead(button6); // сигнал с кнопки
transmit_data[6] = digitalRead(button7); // сигнал с кнопки
transmit_data[7] = analogRead(button8); // сигнал с кнопки
radio.write(&transmit_data, sizeof(transmit_data)); //отправляем получившийся массив
}