Arduino mit/ohne NrF24L01+

Hallo, das klingt vielleicht etwas doof, aber ich komme mit einem Problem nicht klar. Bin neu was Arduino angeht, aber ich bringe erfahrung was das Programmieren angeht mit.

zu meinem Projekt:

Ein Arduino Nano mit OLED 128x64, NRF24L01+ & ein 2 channel relay ist der Empfänger.

Ein zweiter Arduino Nano mit NRF24L01+ ist der Sender.

Der Sender schickt einen bestimmten Zahlencode (über random) mit Prüfziffer an den Empfänger, dieser sollte bei der richtigen Kombination das Relay so lassen und nicht schalten. Soweit bin ich gekommen, aber nun zu meinem Problem:

Wenn der Sender nicht mehr in der nähe ist, sollte er das Relay schalten.

So sieht mein Programmcode vom Empfänger aus:

void loop() {
  if ( radio.available() )
   {
   unsigned long data = 0;
   radio.read( &data, sizeof(unsigned long) );
   Serial.println(data);
   int pin = data;

int HT=(pin%100000)/10000;//Hundertausender
int T=(pin%10000)/1000;//Hunderter
int H=(pin%1000)/100;//Hunderter
int Z=(pin%100)/10;//Zehner
int E=pin%10;//Einer
int P1=HT+T+H+Z;
int P2=P1%10;
   if (P2==E)
   {
     digitalWrite(4,HIGH);
     delay(20);
   } 
   
   } 
       
   }

}

Hat jemand eine Idee?

Gruss, Dave

Mit

void loop() {
  if ( radio.available() )
   {
   if (P2==E)
   {
     digitalWrite(4,HIGH);
     delay(20);
   } else {digitalWrite(4,LOW); } //Habe ich probiert

    
  
   } else {digitalWrite(4,LOW); } //Habe ich auch schon probiert
      
   

}

DaveFox:
Hat jemand eine Idee?

Ja, setze deinen Sketch bitte in Code-Tags, Schaltfläche </> oben links im Editorfenster.
Dann kann den sketch auch jeder vernünftig lesen.

    int pin = data;

int HT=(pin%100000)/10000;//Hundertausender

Damit ist HT == 0 garantiert.

Warum empfängst du einen long und verarbeitest dann einen int?

Guten morgen.

HotSystems:
Ja, setze deinen Sketch bitte in Code-Tags, Schaltfläche </> oben links im Editorfenster.
Dann kann den sketch auch jeder vernünftig lesen.

Sorry, hab ich gestern abend vergessen

Whandall:

    int pin = data;

int HT=(pin%100000)/10000;//Hundertausender



Damit ist HT == 0 garantiert.

Warum empfängst du einen long und verarbeitest dann einen int?

Ist für einen zweiten Sender, damit man es unterscheiden kann, ist aber erstmal nicht relevant.

noiasca:
wenn ich deine Frage richtig verstanden habe:

Setze einen Timer nach wie vielen Sekunden(?) das Relais doch anziehen soll. Jedes mal wenn eine Message kommt, setzt du auch den Timer zurück.
Bleibt die Meldung aus, schlägt dann der der Timer zu - Dein Relais kann anziehen.

Das klingt gut, ich kenn mich aber so noch nicht genau aus damit, ich muss mal recherchieren.
Oder kann mir jemand mal bitte kurz einen Gedankenanstoss geben?

Gruss, Dave

noiasca: in deiner If Schleife setzt du zusätzlich ein

lastMillis=millis();

nicht vergessen die Konstanten und Variablen definieren

unsigned long lastMillis = 0;
const unsigned int myIntervall = 10000;   //Hausnummer für 10 Sekunden

und in der loop prüfst separat auf

if (millis() - lastMillis >= myIntervall)  //evtl. noch ein && digitalread(deinPin) ergänzen, damit das If nur einmal angesprungen wird
{
   // tu was auch immer mit deinem Relais wenn die Zeit überschritten wurde
}

alles nur so freihändig also sicher mit Fehlern ;-)

Vielen Dank. Hat wunderbar geklappt :-) Danke

noiasca: in deiner If Schleife setzt du zusätzlich ein

Siehe dazu: if-schleife

noiasca:
If Schleife: Ungefähr 5 180 000 Ergebnisse (0,35 Sekunden)
If Abfrage: Ungefähr 2 280 000 Ergebnisse (0,45 Sekunden)

Scheisse ist Klasse, tausende von Fliegen können sich nicht irren.

Die weite Verbreitung einer falschen Bezeichnung ist ein Argument für die Verwendung
korrekter Bezeichnungen, nicht dagegen.

if statement: Ungefähr 1.120.000.000 Ergebnisse (0,33 Sekunden)

"If Anweisung" wäre auch semantisch voll ok.

Das Wort "Schleife" hat eine feste Bedeutung. Daran sollte man nicht rütteln. Es sei denn, man möchte absichtlich Verwirrung stiften.

Ask Google:

If Schleife: Ungefähr 5 180 000 Ergebnisse (0,35 Sekunden)
If Abfrage: Ungefähr 2 280 000 Ergebnisse (0,45 Sekunden)

Ich hab mir mal die 5 Millionen Funde angeguckt: (wer’s braucht, denke sich hier ein smiley)

Das ist alles über “if” oder “Schleife”. Da “Schleife” mehr Treffer bringt als “Abfrage”, ist das Ganze klar.

Such mal nach “if Schleife” (mit Gänsefüßchen, also als 1 Ausdruck), da krieg ich “nur” 31000 Ergebnisse, mit dem hier erwähnten Link ganz vorne.

Du kannst es nicht schön reden. Ok, "dir" vielleicht, aber nicht "mir".

Ein semantischer Fehler, ist ein semantischer Fehler. Da beißt keine Maus einen Faden ab.

Die Sprache ist schon schwer genug, sowohl die natürliche, als auch C++. Wenn wir da jetzt auch noch, sehenden Auges, Böcke einbauen, dann wird es für die Nachkommenden um so schwieriger da einen Sinn/System zu erkennen. Das wollen wir doch nicht, oder?

Ich plädiere für Sorgfalt und Disziplin.

Wenn das jetzt keine Schleife ist, ...

Nö. Das war mal eine alte Basic-Version, ist aber inzwischen eine tote Sprache. BRE heisst oft ein entsprechender Assembler - Befehl ("Bedingter Sprung, Branch if Equal" oder so)

Ist jedenfalls völlig OT hier, wo es nunmal keine if-Schleifen gibt. ;)