Hallo Zusammen,
ich möchte meine Arduinos per Funk verbinden und die RX/TX_Address dabei "verschlüsseln", bzw per zufall generieren.
Am Anfang gebe ich eine feste Adresse und lege mir schon einmal ein Array an, welche die verschlüsselte Adresse enthalten soll.
const byte teachAddress [5] = {'A','B','C','D','E'};
byte cryptAddress [5] = {'R','A','N','D',0};
Ich öffne die radio.openWritingPipe(teachAddress); und sende Daten an diese Adresse.
Der Empfänger öffnet radio.openReadingPipe (1, teachAddress) und empfängt die Daten.
Dann sendet der Empfänger per Acknowledge eine Zufallszahl an den Sender.
Der Empfänger speichert die Zufallszahl noch bei cryptAddress [4] = randNumber; ein
Der Sender empfängt die Zufallszahl als Acknowledgment und speichert ebenfalls cryptAddress [4] randNumber; ein.
Dann öffnet der Empfänger radio.openReadingPipe (1, cryptAddress) und der Sender radio.openWritingPipe(cryptAddress).
Wenn alles erfolgreich ist, soll am Empfänger eine LED leuchten. Sobald der Empfänger nämlich Daten = 30 empfängt soll dies geschehen. Es passiert jedoch nichts.
Habe mich an diesem Tutorial bedient. Arduino NRF24L01+ Communications. For this walkthrough, we’ll be looking… | by Ben Fraser | Medium
Kann mir hier einer sagen, wo mein Denkfehler ist? Anbei ist der Code.
---- Sender ---
#include <RF24.h>
#include <SPI.h>
#include <nRF24l01.h>
RF24 radio(18,17);
const byte teachAddress [5] = {'A','B','C','D','E'};
byte cryptAddress [5] = {'R','A','N','D',0};
unsigned char randNumber=0;
unsigned char teach_abgeschlossen=0;
int Daten=0;
void setup() {
// begin radio object
radio.begin();
// set power level of the radio
radio.setPALevel(RF24_PA_LOW);
// set RF datarate - lowest rate for longest range capability
radio.setDataRate(RF24_250KBPS);
// set radio channel to use - ensure all slaves match this
radio.setChannel(0x66);
// set time between retries and max no. of retries
radio.setRetries(4, 10);
// enable ackpayload - enables each slave to reply with data
radio.enableAckPayload();
// setup write pipe to remote node - must match node listen address
radio.openWritingPipe(teachAddress);
}
void loop()
{
Teach();
radio.write(&Daten, sizeof(Daten));
delay(200);
}
void Teach(void)
{
if(teach_abgeschlossen==0)
{
Daten=20;
bool tx_sent;
tx_sent = radio.write(&Daten, sizeof(Daten));
if (tx_sent)
{
if (radio.isAckPayloadAvailable())
{
radio.read(&randNumber, sizeof(randNumber));
cryptAddress [4] = randNumber;
radio.openWritingPipe(cryptAddress);
Daten=30;
radio.write(&Daten, sizeof(Daten));
teach_abgeschlossen=1;
}
}
}
}
Empfänger
#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
RF24 radio(4,3);
const int LED = 13;
const byte teachAddress [5] = {'A','B','C','D','E'};
byte cryptAddress [5] = {'R','A','N','D',0};
unsigned char randNumber=0;
int Daten=0;
unsigned char teach_abgeschlossen=0;
void setup() {
pinMode(LED,OUTPUT); //LED
randomSeed(analogRead(0));
randNumber = random(255);
cryptAddress [4] = randNumber;
radio.begin();
// set power level of the radio
radio.setPALevel(RF24_PA_LOW);
// set RF datarate
radio.setDataRate(RF24_250KBPS);
// set radio channel to use - ensure it matches the target host
radio.setChannel(0x66);
// open a reading pipe on the chosen address - matches the master tx
radio.openReadingPipe(1, teachAddress);
// enable ack payload - slave replies with data using this feature
radio.enableAckPayload();
// preload the payload with initial data - sent after an incoming message is read
radio.writeAckPayload(1, &randNumber, sizeof(randNumber));// put your setup code here, to run once:
}
void loop()
{
Teach();
if(teach_abgeschlossen==1)
{
if ( radio.available() )
{
radio.read( &Daten, sizeof(Daten) );
if(Daten==30)
{
digitalWrite(LED, HIGH);
}
}
}
}
void Teach(void)
{
if(teach_abgeschlossen==0)
{
if ( radio.available() )
{
radio.read( &Daten, sizeof(Daten) );
if(Daten==20)
{
radio.writeAckPayload(1, &randNumber, sizeof(randNumber));
radio.openReadingPipe(1, cryptAddress);
if(Daten==30)
teach_abgeschlossen=1;
}
}
}
}