NRF24L01 empfängt nicht

Hallo,

Ich haversuche eine Funkstrecke mit den NRF24L01 aufzubauen.

Die Beispiele aus der Bibliothek funktionieren, also hardware schein i.o. zu sein.

jetzt habe ich den Code angepasst, um ein Byte zu empfangen.

Wenn das Byte 0 ist, sollen 6 weitere Bytes gelesen werden und für einstellungen genutzt werden.

Diese Einstellungen werden in den Variablen rs, gs, bs, rg, gg, bg gespeichert.

Wenn das empfangene Byte den gleichen Wert hat, wie die Variable id, soll der Eingang (buttonPin) überwacht werden und bei betätigen, soll die id zurück gemeldet werden.

Leider empfange ich so gar nichts... Ich fürchte , dass die Umschaltung zwischen Sendemodus und Empfangsmodus nicht so funktioniert, wie ich es verstanden habe.

Die Gegenstelle macht es identisch.

hier der Code:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>


#define buttonPin 4
#define dauernachanschuss 1


const byte txaddress[6] = "00000";
const byte rxaddress[6] = "00001";

RF24 radio(7, 8); // CE, CSN



byte Hbyte, Lbyte, rs, gs, bs, rg, gg, bg, empfangen, id;

bool einstellungenempfangen, gerataktiv;



unsigned long trefferzeit;

void setup()
{
  pinMode(buttonPin, INPUT_PULLUP);

  Serial.begin(9600);
  radio.begin();
  //radio.setPALevel(RF24_PA_MIN);
  radio.openWritingPipe(txaddress);
  radio.openReadingPipe(1, rxaddress);
  radio.startListening();
  rs = 255;
  gs = 0;
  bs = 0;
  rg = 0;
  gg = 255;
  bg = 0;
Serial.write(gg);
}

void loop() {

  id = 1; //#########################im betrieb raus nehmen
  if (radio.available()) {
    radio.read(empfangen, 1);
    Serial.write(empfangen);
    einstellungenempfangen = 1;
  }

  if (empfangen == 0 && einstellungenempfangen == 1) {
    delay(100);
    radio.read(&rs, sizeof(rs));
    radio.read(&gs, sizeof(gs));
    radio.read(&bs, sizeof(bs));
    radio.read(&rg, sizeof(rg));
    radio.read(&gg, sizeof(gg));
    radio.read(&bg, sizeof(bg));
    einstellungenempfangen = 0;
  }
  if (empfangen == id && einstellungenempfangen == 1 && gerataktiv == 0) {
    einstellungenempfangen = 0;
    gerataktiv = 1;
  }
  if (empfangen == 0 && einstellungenempfangen == 1 && gerataktiv == 1) {
    einstellungenempfangen = 0;
    gerataktiv = 0;
  }

  if (digitalRead(buttonPin) == LOW && gerataktiv == 1) {
    radio.stopListening();
    radio.write(id,1);
    radio.startListening();
    gerataktiv = 0;
  }
}

Weiss jemand, wie das richtig funktioniert?

Na ja, eine Hälfte davon, ist mal ein Anfang.

Du liest einzelne Bytes aus dem Radio,
ohne vorher zu testen, dass auch Daten da sind.

Fasse alle deine Daten zu einem Paket (struct) zusammen, und übertrage sie in einem Rutsch.

Beim Senden könnte es sich lohnen, zu testen, dass das Paket auch ankam.

ich habe nochmal die Sendeeinheit so abgespeckt, dass nur noch die Funkstreckenbefehle enthalten sind:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define startPin 14

RF24 radio(10, 11); // CE, CSN



//bool spielaktiv = 0, spielgestartet = 0, spielfertig = 0, spielbildschirm = 0, ersteszufallsspiel = 0;

byte leer = 0, voll = 255, id = 1, rs, gs, bs, rg, gg, bg;

int empfangen, i;
unsigned long start;

const byte txaddress[6] = "00001";
const byte rxaddress[6] = "00000";

void setup()
{

  Serial.begin(9600);
  radio.begin();
  //radio.setPALevel(RF24_PA_MIN);
  radio.openWritingPipe(txaddress);
  radio.openReadingPipe(1, rxaddress);
  radio.startListening();
  
  pinMode(startPin, INPUT_PULLUP);
rs = 255;
      gs = 0;
      bs = 0;
      rg = 0;
      gg = 255;
      bg = 0 ;
  randomSeed(analogRead(0));
}


void loop() { // run over and over


  if (digitalRead(startPin) == LOW && millis() - start >= 1000) {
    start = millis();
    radio.stopListening();
    radio.write(leer, 1);
    radio.write(rs, 1);
    radio.write(gs, 1);
    radio.write(bs, 1);
    radio.write(rg, 1);
    radio.write(gg, 1);
    radio.write(bg, 1);
    delay(2000);
    radio.write(id, 1);
    radio.startListening();
  }

}

Das Problem ist ja, dass er nichtmal das erste empfangene Byte bekommt und per RS232 sendet

Da du auf meine Vorschläge keinen Wert legst, verschwende(te) ich hier meine Zeit.

delay hat in einem Programm zur Kommunikation so viel zu suchen,
wie Petersiliensträuße in den Ohren, wenn man sich unterhalten will.

Viel Erfolg.

Keinen wert legen ist hier falsch, ich bin da ehr zu doof zu.
Was ist ein struct?

Das delay ist nicht im original code drin, das ist hier nur drin, um den Befehl zum aktivieren der einheit zu schicken.

Wie setze ich also ein struct zusammen?

Ich bin nicht in Anfänger-Grundlagen-Einlöffel-Stimmung,
für die Erklärungen musst du dir jemand anderen suchen.

Manchmal ist Google hilfreich.

Ja, das werde ich mir mal anschauen.

Passt es denn prinzipiell mit dem umschalten zwischen dem Senden und Empfangen?

Wenn du das mit dem Beispiel (welches) schon zum Laufen bekommen hast, warum baust du das nicht damit auf ?
Und wenn dir das mit dem Struct noch Probleme macht, dann versende doch Strings als char-array indem alle Daten getrennt mit einem Trennzeichen (z.B : ) zusammen gefügt sind.

Das umbauen hat leider nicht geklappt, da das getting started nicht zwischen senden und empfangen umschaltet... wobei, wo ich grade darüber schreibe macht es das ja doch. Auch das schaue ich mir nochmal an.

Wenn du keine Erfahrung hast, musst du das stückchenweise machen und immer zwischen durch testen. Dann klappt das auch mit den erweiterten Beispielen.

Hier mal ein Tutorial das dir sicher weiter helfen wird.

Und damit es nicht langweilig wird, hier noch ein Tutorial.

So, habe den Code jetzt angepasst...

Es funktioniert auch mittlerweile alles so, wie es sollte...

Allerdingss bekommt die Basis ganz oft die Rückmeldung TX Failed...

hier der Sendecode:

void send() {

  bool rslt;
  //while(rslt==false)
  rslt = radio.write( &dataToSend, sizeof(dataToSend) );
  // Always use sizeof() as it gives the size as the number of bytes.
  // For example if dataToSend was an int sizeof() would correctly return 2

  Serial.print("Data Sent ");
  Serial.print(dataToSend);
  if (rslt) {
    Serial.println("  Acknowledge received");
  }
  else {
    Serial.println("  Tx failed");
  }
}

Und die clients empfangen durchaus die richtigen Daten, aber mal geht es und mal geht es nicht... Für den Fall, dass es nicht geht, habe ich mal ganz stumpf eine while Funktion eingebaut, die so lange sendet, bis der client rückmeldet...
Das Resultat ist, dass der client die Daten empfängt, die Basis aber keine Antwort bekommt und deswegen ständig weiter sendet, bis es nach 20 mal durch kommt...

Das habe ich entsprechend rückgängig gemacht...

Ich habe also extra nochmal kondensatoren parallel zur Betriebsspannung gelötet, einen 100micro und einen 100nano Farad Kondensator... Leider keine verbesserung...

Wir reden hier von einer Entfernung von 3cm... ich würde sie gerne mit einer Entfernung von 25m betreiben...

dataToSend ist übrigens ein int

Ich habe übrigens eine ältere Version der RF24 Lib, da die neuste Version nicht für den Nano kompiliert...

3cm können zu nah sein. Probiere mal eine Entfernung von ungefähr 50cm

Wie sind die Einstellungen von Geschwindigkeit, Sendeleistung und Kanal?

  radio.begin();
  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate( RF24_250KBPS );
  radio.setRetries(15, 15); // delay, count
  radio.openReadingPipe(1, id);
  radio.openWritingPipe(slaveAddress);
  radio.startListening();

Bei 250KBPS hatte ich auch ab und zu Probleme mit dem Ack. (ATTiny84 mit 4MHz) Nutze doch mal 1MBPS bei beiden

Da fehlt noch radio.setChannel(); der 1-125 sein kann. Hinweis bei nRF24 ohne + , die können keine 250kbps.
Gruß André

Der wird standardmäßig vorgesetzt von der Bibliothek. Kanal 75

Und Kanal 85-125 in Europa eigentlich nicht erlaubt

Danke, aber alles leider keine Verbesserung...

Welchen Werte haben id und slaveAddress beim Sender und beim Empfänger?

Bzw. kannst du mal den ganzen Code vom Empfänger und Sender zeigen?