Есть Arduino 2шт.
Есть nrf24l01 2шт.
Есть дисплей 16х2
Одна ардуинка работает как пульт, другая на машинке р/у. Решил выводит напряжение аккума на экран в пульте.
Проблема в том, что везде говорят, но не рассказывают как сделать двустороннюю связь. В моем понимание, прием и передача должны работать по очереди.
То есть допустим каждые 2с приемник должен стать передатчиком и отправить сигнал. Но как получить этот сигнал на пульте?
// RX \\
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
byte recieved_data[4];
byte thr = 5;
byte thr1 = 6;
byte rudl = 3;
byte rudr = 2;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
void setup() {
pinMode(thr, OUTPUT);
pinMode(thr1, OUTPUT);
pinMode(rudl, OUTPUT);
pinMode(rudr, OUTPUT);
Serial.begin(9600); //открываем порт для связи с ПК
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, address[0]);
radio.openWritingPipe(address[0]); //ТУТ Я НЕ УВЕРЕН
radio.openReadingPipe(1, address[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() {
volatile long timer = millis();
byte pipeNo, gotByte;
float voltage = (float)analogRead(0) / 1023 * 5;
while (millis() - timer < 2000) {
while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб
radio.read(&recieved_data, sizeof(recieved_data) );
analogWrite(thr, recieved_data[1]);
analogWrite(thr1, recieved_data[2]);
digitalWrite(rudr, recieved_data[3]);
digitalWrite(rudl, recieved_data[0]);
}
}
while (millis() - timer >2000) {
radio.write(&voltage,sizeof(voltage)); // И ТУТ ТОЖЕ
timer = millis();
}
}
// RX \\
// TX \\
#include <SPI.h> // библиотека для работы с шиной SPI
#include "nRF24L01.h" // библиотека радиомодуля
#include "RF24.h" // ещё библиотека радиомодуля
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
int a;
byte thr = 1;
byte rudr =2;
byte rudl = 3;
boolean flag;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte transmit_data[4]; // массив, хранящий передаваемые данные
void setup() {
pinMode(rudr, INPUT_PULLUP);
pinMode(rudl, INPUT_PULLUP);
Serial.begin(9600); //открываем порт для связи с ПК
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, address[0]); // ТУТ Я НЕ УВЕРЕН
// 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.startListening(); // В передатчике тогда тоже надо слушать эфир?
}
void loop() {
volatile long timer = millis();
byte pipeNo, gotByte;
float voltage;
transmit_data[1] = rev();
transmit_data[2] = drive();
transmit_data[3] = !digitalRead(rudl);
transmit_data[0] = !digitalRead(rudr);
Serial.println(voltage);
radio.write(&transmit_data, sizeof(transmit_data));
while (millis() - timer >2000) { // Вот тут полная непонятка
while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб
radio.read(&voltage, sizeof(voltage) );
}
}}
int drive(){
int f = map(analogRead(thr),520,1023,0,255);
if(f >= 25){
return f;
delay(50);
} else { return 0;}
}
int rev(){
int f = map(analogRead(thr),515,0,0,255);
if(f >= 25){
return f;
delay(50);
} else { return 0;}
}
// TX \\