nrf24 überträgt schon richtige Daten nur versetzt

Zwei Dinge:
a) Leid tun? Niemals!
b) genauso gemacht? - nein.

floriank:
ich gebe es auch in den Seriellen Monitor aus.

    int Button1 = 0;

Button1 = digitalRead(Button01);
    radio.write(&Button1, sizeof(Button1)); //Senden des Schalterstatus zum Empfänger
    Serial.print("Button1:");
    Serial.println(Button1);

Nein! Du gibst auf dem SerMon die Variable aus - nicht den Rückgabewert.
Lies nochmal meinen Post.
Ich will, das Du das schaffst - nicht aufgeben!!!

Also wenn ich das so mache :

int Button2 = 0;
int variable = 0;
Button2 = digitalRead(Button02);
variable = radio.write(&Button2, sizeof(Button2));
Serial.print("Rückgabewert:");
Serial.println(variable);

Funktioniert nicht einmal das Transmitter Programm was bis jetzt eigentlich immer funktioniert hat.( Fehler: zeigt im Seriellen Monitor falsche Daten an)

floriank:
Also wenn ich das so mache :

    int variable = 0;

variable = radio.write(&Button2, sizeof(Button2));



Funktioniert nicht einmal das Transmitter Programm was bis jetzt eigentlich immer funktioniert hat.( Fehler: zeigt im Seriellen Monitor falsche Daten an)

Schau als erstes nochmal in die rf24.cpp was write zurückgibt.

Dann bau Dir mal einen Minimalsketch.
Ich würd das so anfangen:

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

RF24 radio(7, 8); // CE, CSN - die Zahlen geben die Digitalports am Arduino an, Instanz um das Modul zu starten

const byte address[6] = "0A1z9";  //Adresse, auf dem die Empfangsdaten gesendet werden sollen.
int Button1;
void setup()
{
  Serial.begin(115200);

  radio.begin();
  radio.setChannel(108);    //Freq (Selected) = 2400 + CH (Selected) => 2400+108 = 2508MHz
  radio.openWritingPipe(address); // Setzen der Sendeadresse zur Übermittlung der Daten
  radio.setPALevel(RF24_PA_MIN); // Leistung des NRF Moduls je nach Entfernung kann man von MIN bis MAX einstellen (MAX,HIGH,LOW,MIN)
  radio.setDataRate( RF24_1MBPS );
}

void loop()
{
  for (int i = 0; i < 10; i++) { // i ggfls. variieren
    Button1 = i;
    radio.stopListening(); // Das angeschlossene Modul wird als Sender konfiguriert
    radio.write(&Button1, sizeof(Button1)); //Senden des Schalterstatus zum Empfänger
    radio.startListening();
  }
while(1); // Hier bleibt der Sketch stehen um beim Empfänger den serMon nicht zuzuschieben. Reset startet neu
}

Darauf aufbauend dann mit der Erkenntnis aus dem was zurückgegeben wird und vielleicht dem Example GettingStarted dann die Übertragung so sicher machen das alle Werte, also mit 0 beginnend, auch beim Epfänger ankommen.
(Deinen Empfängersketch kannst weiter verwenden wenn mich nicht alles irrt)

Ich habe ein wenig im Internet gestöbert und bin auf die "Strukturen" gestoßen habe das Programm geändert.( Website https://howtomechatronics.com/). (https://howtomechatronics.com/projects/diy-arduino-rc-transmitter/)
Nun funktioniert es und ich danke alle die mich unterstütz haben :slight_smile: .

floriank:
.....
Nun funktioniert es und ich danke alle die mich unterstütz haben :slight_smile: .

Dann poste auch bitte dein Ergebnis, das hilft dann allen mit einem ähnlichen Problem.

HotSystems:
Dann poste auch bitte dein Ergebnis, das hilft dann allen mit einem ähnlichen Problem.

Hm...
Ich würds ja auch gerne verstehen wollen, was da wie passiert, was jetzt anders ist wäre schon interessant...

(deleted)

was jetzt anders ist

Das ist doch klar...
Oder?

Manche Sendungen haben versagt.
Der Fehler wurde nicht abgefangen und die Sendung darum auch nicht wiederholt.
Daher desynchronisierte die Übertragung.
Es gab kein Protokoll, welches die zerstückelte Übertragung retten/zuordnen konnte.

Da jetzt alles in einer Struktur steckt, kann das Problem nie wieder auftreten.
Denn ShockBurst hält den Kram zusammen, und garantiert die korrekte Übertragung, oder meldet die Fehlfunktion (wenn man dafür Sorge trägt).

combie:
Das ist doch klar...
Oder?

Oder.
Die Lösung des TO ist an dieser Stelle das wichtigste.
Wie er dahin kommt haben Du, ich und der eine oder andere versucht.

Nun aber nur zu schreiben: geht
ist für alle späteren Leser faktisch eine Hülse ohne Inhalt.

Ich bin ja froh und glücklich, das über den Tellerrand hinaus geschaut wurde.
Insbesondere nach #28

Daher nochmal die Bitte, den Code hier einzustellen.
Jeder, der daran beteiligt war, möchte auch sehen, welche Merkmale zur Lösung führten.
Das hilft auch denen, die einen Ansatz wählten, der keine Berücksichtigung fand.
Meiner z.B. ;(

Jeder, der daran beteiligt war, möchte auch sehen, welche Merkmale zur Lösung führten.

Wer ist "Jeder"?
Alle minus Combie?

Das unerfreuliche an diesem Problem ist, dass man der Lösung, nicht die Ursache ansieht.

Ich musste das Programm nochmal grob über arbeiten konnte es erst jetzt hinzufügen.

Ich hoffe ich kann mit diesen Programm jemanden helfen.

Noch mal Danke für die Unterstützung!

Transmitter:

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

#define Joyx 0
#define Joyy 1
#define Button01 4
#define Button02 5
#define Button03 6
RF24 radio(7, 8); // CE, CSN - die Zahlen geben die Digitalports am Arduino an, Instanz um das Modul zu starten

//Der Datentyp Boolean kennt nur zwei mögliche Werte. Die zwei zulässigen Booleschen Werte sind true (wahr) und false (falsch).

const byte address[6] = "0A1z9";  //Adresse, auf dem die Empfangsdaten gesendet werden sollen.

struct Data_Package 
  {
    byte Button1;
    byte Button2;
    byte Button3;
    int xAchse;
    int yAchse;
  };
  Data_Package data; //Create a variable with the above structur
  
void setup() 
{
  Serial.begin(115200);
  
  pinMode(Button01,  INPUT_PULLUP);
  pinMode(Button02,  INPUT_PULLUP);
  pinMode(Button03,  INPUT_PULLUP);

  radio.begin();
  radio.setChannel(108);    //Freq (Selected) = 2400 + CH (Selected) => 2400+108 = 2508MHz
  radio.openWritingPipe(address); // Setzen der Sendeadresse zur Übermittlung der Daten
  radio.setAutoAck(false);
  radio.setPALevel(RF24_PA_MIN); // Leistung des NRF Moduls je nach Entfernung kann man von MIN bis MAX einstellen (MAX,HIGH,LOW,MIN)
  radio.setDataRate( RF24_1MBPS );
  radio.stopListening(); // Das angeschlossene Modul wird als Sender konfiguriert

  // Set initial default values
  // Values from 0 to 255. When Joystick is in resting position, the value is in the middle, or 127. We actually map the pot value from 0 to 1023 to 0 to 255 because that's one BYTE value
  
  data.Button1 = 0;
  data.Button2 = 0;
  data.Button3 = 0;
  data.yAchse = 217;
  data.xAchse = 217;

}

void loop() 
{

  But1 ();
  But2 ();
  But3 ();
  XAch ();
  YAch ();
  radio.write(&data, sizeof(Data_Package));
}

void But1 ()
{
    
    data.Button1 = digitalRead(Button01);
    Serial.print("Button1:");
    Serial.println(data.Button1);
}

void But2 ()
{
    data.Button2 = digitalRead(Button02);
    Serial.print("Button2:");
    Serial.println(data.Button2);
}

void But3 ()
{
    data.Button3 = digitalRead(Button03);
    Serial.print("Button3:");
    Serial.println(data.Button3);
}

void XAch ()
{
    data.xAchse = analogRead(Joyx);
    Serial.print("X-Achse:");
    Serial.println(data.xAchse);
}

void YAch ()
{
    data.yAchse = analogRead(Joyy);
    Serial.print("Y-Achse:");
    Serial.println(data.yAchse);
}

Receiver:

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

Servo myservo;

#define Lase 2
#define Lich 3
#define Step1 4
#define Direct1 5
#define Step2 6
RF24 radio(7, 8); // CE, CSN - die Zahlen geben die Digitalports am Arduino an, Instanz um das Modul zu starten
#define Direct2 9
#define ENA1 10
#define ENA2 11

const byte address[6] = "0A1z9";  //Adresse, auf dem die Empfangsdaten gesendet werden sollen.
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;

// Values from 0 to 255. When Joystick is in resting position, the value is in the middle, or 127. We actually map the pot value from 0 to 1023 to 0 to 255 because that's one BYTE value
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package 
  {
    byte Button1;
    byte Button2;
    byte Button3;
    int xAchse;
    int yAchse;
  };
  Data_Package data; //Create a variable with the above structure
  
void setup() 
{


  myservo.attach(12);
  myservo.write(90);
  
  pinMode(Lich, OUTPUT);
  pinMode(Lase, OUTPUT);

  pinMode(Step1,OUTPUT);
  pinMode(Direct1,OUTPUT);
  pinMode(Step2,OUTPUT);
  pinMode(Direct2,OUTPUT);  
  pinMode(ENA1,OUTPUT);
  pinMode(ENA2,OUTPUT);

  radio.begin();
  radio.setChannel(108);    //Freq (Selected) = 2400 + CH (Selected) => 2400+108 = 2508MHz
  radio.openReadingPipe(0,  address); // Setzen der Sendeadresse zur Übermittlung der Daten
  radio.setAutoAck(false);
  radio.setPALevel(RF24_PA_MIN);// Leistung des NRF Moduls je nach Entfernung kann man von MIN bis MAX einstellen (MAX,HIGH,LOW,MIN)
  radio.setDataRate( RF24_1MBPS );
  radio.startListening(); // Das angeschlossene Modul wird als Empfänger konfiguriert
  
  Serial.begin(115200);  
}
void loop() 
{
    // Check whether we keep receving data, or we have a connection between the two modules
  currentTime = millis();
  if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
    resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function
  }
  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
    lastReceiveTime = millis(); // At this moment we have received the data
  }

   Licht ();
   Laser ();
   Serv ();
   Motor1 ();
   Motor2 ();
   Serial.println();
 }

void Licht ()
{
        Serial.print("Button1:");
        Serial.println(data.Button1);
    
    if  (data.Button1 == 0)
      {
        digitalWrite(Lich, LOW);
      }
    if (data.Button1 == 1)
      {
        digitalWrite(Lich, HIGH);
      }
}

void Laser ()
{

        Serial.print("Button2:");
        Serial.println(data.Button2);
        
    if  (data.Button2 == 0)
      {
        digitalWrite(Lase, LOW);
      }
    if (data.Button2 == 1)
      {
        digitalWrite(Lase, HIGH);
      }
}

void Serv ()
{

      Serial.print("Button3:");
      Serial.println(data.Button3);
  
    if (data.Button3 == 1)
      {
        myservo.write(60);
      }
      if (data.Button3 == 0)
      {
        myservo.write(-60);
      }
}

void Motor1 ()
{
  int Dauer1;
  
  Serial.print("X-Achse: ");
  Serial.println(data.xAchse);
  digitalWrite(ENA1,LOW);

  if(  (data.xAchse >=490) && (data.xAchse <= 500)  )
    {
      digitalWrite(ENA1,HIGH);
    }
      else
        {
          if  (data.xAchse < 490)
            {
              digitalWrite(Direct1,LOW);
              digitalWrite(Step1,HIGH);
              Dauer1 = map(data.xAchse,0,509,10,200);
              delay(Dauer1);
              digitalWrite(Step1,LOW);
              delayMicroseconds(Dauer1);
            }
          if  (data.xAchse > 500)
            {
              digitalWrite(Direct1,HIGH);
              digitalWrite(Step1,HIGH);
              Dauer1 = map(data.xAchse,521,1023,200,10);
              delay(Dauer1);
              digitalWrite(Step1,LOW);
              delayMicroseconds(Dauer1);
            } 
        }
}

void Motor2 ()
{
  int Dauer2;

  Serial.print("Y-Achse: ");
  Serial.println(data.yAchse);
  if(  (data.yAchse >=500) && (data.yAchse <= 510)  )
    {
    digitalWrite(ENA2,HIGH);
    }
      else
        {
          if  (data.yAchse < 500)
            {
              digitalWrite(Direct2,LOW);
              digitalWrite(Step2,HIGH);
              Dauer2 = map(data.yAchse,0,499,10,200);
              delay(Dauer2);
              digitalWrite(Step2,LOW);
              delayMicroseconds(Dauer2);
            }
          if  (data.yAchse > 510)
            {
              digitalWrite(Direct2,HIGH);
              digitalWrite(Step2,HIGH);
              Dauer2 = map(data.yAchse,511,1023,200,10);
              delay(Dauer2);
              digitalWrite(Step2,LOW);
              delayMicroseconds(Dauer2);
            }
        }              
}
void resetData()
{
  data.Button1 = 0;
  data.Button2 = 0;
  data.Button3 = 0;
  data.yAchse = 495;
  data.xAchse = 505;
}
[code]

Hallo floriank,

danke für deine Rückmeldung und dem endgültigen Sketch.