Arduino Nano und NRF24l01 Schalter einlesen und einen high Pin ausgeben

Moin
Ich versuche nun schon seit längerem einen Schalter einzulesen Mit einem Arduino Nano dies dann zu übertragen Mittels Nrf24l01 und mit einem Arduino und Nrf24l01 zu Empfangen und drauf hin einen Pin 4 High zu setzten um damit ein Relais an zusteuern. Ich bekomme es aber einfach nicht hin das der zweite Arduino meine Nachricht empfängt und den Pin High setzt.
Text im Vorfeld zu übertragen hat Funktioniert.
Danke schon mal im voraus für die Hilfe im Anschluss findet ihr den Code für Sender und Empfänger

Sender Code:

#include <RF24.h>

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

const byte address[6] = "1RF24"; // Address / identifier
const int switchPin = 4;         // Pin für den Schalter

void setup() {
  Serial.begin(9600); // Serielle Kommunikation für Debugging
  pinMode(switchPin, INPUT_PULLUP); // Schalter-Pin als Eingang setzen mit internem Pullup
  radio.begin();
  radio.openWritingPipe(address);   // Set the address
  radio.stopListening();            // Set as transmitter
  Serial.println("Sender bereit.");
}

void loop() {
  int switchState = digitalRead(switchPin); // Schalterzustand lesen
  bool switchPressed = (switchState == LOW); // true, wenn Schalter gedrückt (LOW wegen Pullup)

  bool success = radio.write(&switchPressed, sizeof(switchPressed)); // Zustand senden

  if (success) {
    Serial.println(switchPressed ? "Schalter gedrückt, Nachricht gesendet." : "Schalter nicht gedrückt, Nachricht gesendet.");
  } else {
    Serial.println("Senden fehlgeschlagen.");
  }

  delay(100); // Häufigere Übertragung
}

Empfänger Code

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

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

const byte address[6] = "1RF24"; // Address / identifier

void setup() {
  Serial.begin(9600);
  pinMode(4, OUTPUT); // Setze Pin D4 als Ausgang
  radio.begin();
  radio.openReadingPipe(0, address); // Set the address for pipe 0
  radio.startListening();            // Set as receiver
  Serial.println("Empfänger bereit.");
}

void loop() {
  if (radio.available()) {
    bool switchPressed = false;
    radio.read(&switchPressed, sizeof(switchPressed)); // Schalterzustand empfangen
    
    if (switchPressed) {
      digitalWrite(4, HIGH); // Pin D4 aktivieren, wenn Schalter gedrückt
      Serial.println("Schalter gedrückt: Pin D4 aktiviert.");
    } else {
      digitalWrite(4, LOW); // Pin D4 deaktivieren, wenn Schalter nicht gedrückt
      Serial.println("Schalter nicht gedrückt: Pin D4 deaktiviert.");
    }
  } else {
    // Debug-Ausgabe, falls keine Nachricht empfangen wird
    Serial.println("Warte auf Nachricht...");
  }
  delay(200); // Kurze Pause, um die Ausgabe zu verlangsamen
}

Hallo und Willkommen.

Das kann nicht funktionieren.
Du musst den Pin Zustand auch mit einer if-Abfrage abfragen.
Dazu findest du auch Beispiele in der IDE.

Warum eigentlich nicht? Steh gerade aufm Schlauch?

swichState beinhaltet den Pegel des Pins
Wenn switchState gleich Low Pegel, dann wird switchPressed true. Anderenfalls wird switchPressed false.

switchState sollte vielleicht lieber auch bool sein. Und generell kann man diese Zeilen anders/kürzer schreiben. Funktionieren sollte es aber von der Logic her. Oder was übersehe ich?

Dan sende doch Text " 1 oder 0"

Bei Empfänger tust auswerten und zuordnen.
Du musst irgendwas senden, was greifbares nicht zustand.

Die Serielle Ausgabe von Sender und Empfänger könnte beim Fehler finden helfen.

Ja, eine sehr gute Frage.
Mir fehlt da einfach die "if-Abfrage".

Ich habe es grad getestet. Es funktioniert.
Also @paulmoin, daran liegt es nicht.
Sorry, war für mich etwas unübersichtlich. :wink:

Ich habe schon länger nichts mehr mit dem NRF24l01 gemacht, aber mal für dich gegoogelt.

Hier findest du sicher Anregungen um dein Projekt fertig zu stellen.

Beispiele funktionieren bei TO.
Nur wie man sieht in allen Beispielen es werden irgend eine Daten, Werte gesendet.
Ich verstehe nicht wie soll ein Bool gesendet werden

int switchState = digitalRead(switchPin); // Schalterzustand lesen
  bool switchPressed = (switchState == LOW); // true, wenn Schalter gedrückt (LOW wegen Pullup)

  bool success = radio.write(&switchPressed, sizeof(switchPressed));

normaler weise sollte das der Compiler anmeckern, muss jedoch kein exit geben.

Wen der TO low, high als Text sendet und danach auswertet wird es funktionieren,

ja wen ich Text übertragen kann kann es ja eigentlich nicht so schwer sein damit ein Signal zu übertragen.

Ja, mag sein.
Mich hatte nur irritiert, das die #include <nRF24L01.h> nicht mehr vorhanden ist.

Wird wohl nicht mehr gebraucht. In meinen Testsketchen war die noch nötig.

Wie @fony dir schon schrieb. Nimm den Text und werte das aus.
Wenn es funktioniert, kannst du es immer noch besser machen.

Wie ist den das bei dir hat das mit meinem code funktioniert oder hattest du einen eigenen nicht das irgwas bei mir falsch verkabelt ist oder was weiß ich

Er nutzt andere Lib #include "RF24.h"

Ich kann es mangels aktuellem Aufbau nicht testen.
Die Teile habe ich lange Zeit nicht mehr verwendet.

Edit:
Das was ich getestet habe, ist nur die Pin-Auswertung, die mir seltsam vorkam.

Das ist die gleiche Lib, nur der Artikel ist halt etwas älter und daher eine vorherige Version.

Es ist möglich, nicht nur Text, sondern auch Daten zu senden!

Es ist sogar möglich Strukturen zu senden!

Wenn ich heute Abend Zeit finde, mach ich mal ein Testaufbau. nRF24l01+ liegen gerade auf dem Schreibtisch rum.

Es kann auch nicht so schwer sein, die Seriellen Ausgaben des Empfängers und des Senders zu posten!
Jede Aktion produziert in deinem Code eine Serielle Ausgabe. Daran ist ein Problem schnell erkannt.

Natürlich funktioniert das.
Du kannst HIGH / LOW auch direkt als bool interpretieren, dann wird das ganze noch einfacher

bool switchPressed = ! digitalRead(switchPin); // true, wenn Schalter gedrückt (LOW wegen Pullup)

Ausgabe vom Empfänger

Ausgabe sender

Ich denke dann muss ja doch irgend wo ein Fehler in der Kommunikation der beiden module sein