nRF24l01, wo ist mein Fehler?

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;
       }
    }
  }
}

Soll in dieser Zeile die LED angehen?

           digitalWrite(BUZZER, HIGH);

dann versuchs mal mit

           digitalWrite(LED, HIGH);

was soll BUZZER sein? ist nirgendwo definiert.

[EDIT]
hatte noch den alten Code gesehen
[/EDIT]

Habe vergessen hier im Code BUZZER zu LED zu ändern.
In meiner Endanwendung ist an diesem pin ein Buzzer angeschlossen, habe aber derzeitig zur veranschaulichung eine LED angeschlossen.

Trotz ändern des Codes tut sich leider nichts.

Wo ist das startListening() des Empfängers?

Stimmt... Das hat mir schon einmal total gefehlt. Nachdem ich startListening() hinzugefügt habe kann ich nun wenigstens Daten von A nach B senden. Trotzdem krieg ich es einfach nicht hin, die RX und TX Adressen zu ändern.

Gebe ich beiden Mikrocontroller die selbe Adresse (ABCDE) und ich einfach nur daten hin und her schicke, diese abfrage und mir als Status die LED anzeigen lass funktioniert es.

Wenn ich aber nach erfolgreicher Übertragung den Befehl: radio.openReadingPipe(1, cryptAddress); ausführe, und dann Daten hin und herschicke passiert nichts mehr.

Ich weiß, er sieht nicht sehr schön aus, aber ich möchte damit nur testen, ob es möglich ist, während das Programm läuft die Write/Read Pipes zu ändern. Funktioniert einfach nicht.
Für cryptAddress habe ich nun bei Sender & Empfänger den gleichen Wert (CRYPT)
Habe im Empfänger nun folgenden Code:

void setup() {
pinMode(LED,OUTPUT);     //buzzer
radio.begin();
radio.openReadingPipe(1, teachAddress);     
radio.startListening();
}

void loop() 
{
  radio.openReadingPipe(1, cryptAddress);
  if ( radio.available() ) 
  {
     radio.read( &Daten, sizeof(Daten) );
  }
  if(Daten==30)
  {
     digitalWrite(LED, HIGH);
  }

und als Sender folgenden Code

void setup() {
// begin radio object
radio.begin();
radio.openWritingPipe(teachAddress);
}

void loop() 
{
radio.openWritingPipe(cryptAddress);
Daten=30;
radio.write(&Daten, sizeof(Daten));
delay(20);
}

Was müsste man Ändern, damit man die Addressen neu beschreiben kann? :l stehe einfach auf dem Schlauch

Octo_:
ich möchte damit nur testen, ob es möglich ist, während das Programm läuft die Write/Read Pipes zu ändern. Funktioniert einfach nicht.

Weil du etwas falsch machst.

Versuche mal stopListening, Adr ändern und dann startListening.

Warum nimmst du überhaupt keine zweite Pipe für die variable Adresse?