Daten werden nicht in Bedingung übernommen

Hallo,

folgenden Sketch habe ich programmiert:

#include <LiquidCrystal.h>
#include <IRremote.h>
int receiverpin = 3;
IRrecv irrecv(receiverpin);
decode_results results;

LiquidCrystal lcd(4,5,6,7,8,9);
float sensor = 0;
float celsius = 0;
float voltage = 0;
int bewegung=13;
int bewegungsstatus=0;
int ledg=11;
int ledr=12;


void setup() {
 
 lcd.begin(16,2);
 lcd.clear();
 pinMode(bewegung, INPUT);
 pinMode(ledg, OUTPUT);
 pinMode(ledr, OUTPUT);
 irrecv.enableIRIn();
 Serial.begin(9600);

}

void translateIR()
{
switch(results.value)

{
 case 16724175:
 
   
   if(bewegungsstatus==HIGH)
{
           lcd.setCursor(0,0);
           lcd.print("Eindringling");
           lcd.setCursor(0,1);
           lcd.print("Erkannt");
           digitalWrite(ledr, HIGH);
           digitalWrite(ledg, LOW);
           delay(10000);
           lcd.clear();
           Serial.println("1");


}
else

{
           lcd.setCursor(0,0);
           lcd.print("Temperatur:");
           lcd.setCursor(0,1);
           lcd.print(celsius,0);
           lcd.setCursor(3,1);
           lcd.print("Grad");
           digitalWrite(ledr, LOW);
           digitalWrite(ledg, HIGH);
           Serial.println("2");

}

break;

case 16743045:

               lcd.setCursor(0,0);
               lcd.print("Temperatur:");
               lcd.setCursor(0,1);
               lcd.print(celsius,0);
               lcd.setCursor(3,1);
               lcd.print("Grad");
               digitalWrite(ledr, LOW);
               digitalWrite(ledg, HIGH);
               Serial.println("3");
break;
}
}
void loop()
{
           bewegungsstatus=digitalRead(bewegung);
           sensor = analogRead(0);
           voltage = (sensor*5000)/1024;
           voltage = voltage - 500;
           celsius = voltage/10;
           
           
 if (irrecv.decode(&results))
 {
 translateIR();

 {
 irrecv.resume();
 }
}
}

Ich habe eine Temperaturanzeige gebaut, die auf Knopfdruck meiner IR-Fernbedienung zusätzlich zur Temperaturausgabe einen Bewegungssensor aktiviert, der bei Bewegung an Pin 10 ein High ausgeben soll und eine rote LED zum leuchten bringt, zeitgleich soll auf einem Display eine Meldung ausgegeben werden.

Das Problem, die Meldung der Bewegung wird NICHT in die Bedingung in Case 1 übernommen.

Der Switch funktioniert, ich habe jeweils Case-Basierend eine 2 oder 3 ausgegeben bekommen im Monitor. Wenn ich bewegungsstatus=digitalRead(bewegung); auf =1 setze zeigt er mir die Meldung an und die LED leuchtet rot.

Nur dieser übertrag von bewegungsstatus=digitalRead(bewegung); auf die Bedingung funktioniert nicht. Laut Ausgabe im void Loop wird aber die Bewegung erkannt, mir wird eine 1 ausgegeben, wenn ich die Hand vorhalte.

Kann mit jemand erklären, warum der bewegungsstatus nicht in die IF-Bedingung übernommen wird?

Ggf arbeitet das IRremote-Geraffel mit Interrupts, das könnte dann Probleme mit "normalen" Variablen machen.

Mach die entsprechende Variable mal "volatile", dann wird sie nicht com Compiler optimiert und in Register ausgelagert.

ich habe volatile int bewegungsstatus = 0; ausprobiert.

Leider kein Ergebnis. Ich habe die Hand vor den Sensor gehalten, die Bewegung wird mir auf dem seriellen Monitor mit 1 angezeigt. Ist die Hand weg, ist der Wert wieder 0, aber weder Display noch LED leuchten.

Der Code ist so schwer lesbar, setze das doch bitte in Code-Tags.

Ich sehe das Problem in der IR-Auswertung.

Der Bewegungsmelder und alle anderen Routinen können nur arbeiten, wenn eine richtige IR-Funktion dekodiert wird.

Ich denke, das ist so nicht gewollt.

Code-Tags gesetzt. Das hatte ich beim Schreiben gesucht, aber nicht gefunden.

Die IR-Auswertung ist quasi die gleiche Auswertung, wie sie im Arduino Workshops Buch verwendet wird. Es soll geprüft werden, ob ein IR Signal eingegangen ist und erst dann soll der jeweilige Code-Teil ausgeführt werden.

Wie geschrieben, setze ich bewegungsstatus=digitalRead(Bewegung); auf bewegungsstatus=1; geht die IF-Anweisung. Natürlich leuchtet die LED dann immerzu, da der Status der Bewegung immer auf HIGH gesetzt wird durch die 1.

DS2072:
Code-Tags gesetzt. Das hatte ich beim Schreiben gesucht, aber nicht gefunden.

Die IR-Auswertung ist quasi die gleiche Auswertung, wie sie im Arduino Workshops Buch verwendet wird. Es soll geprüft werden, ob ein IR Signal eingegangen ist und erst dann soll der jeweilige Code-Teil ausgeführt werden.

Wie geschrieben, setze ich

bewegungsstatus=digitalRead(Bewegung);

auf

bewegungsstatus=1;

geht die IF-Anweisung. Natürlich leuchtet die LED dann immerzu, da der Status der Bewegung immer auf HIGH gesetzt wird durch die 1.

Die IR-Auswertung ist wohl nicht das Problem, sondern die dahinter stehende Logik. Der Bewegungszustand wir nur dann übernommen, wenn du den richtigen IR-Code sendest.

Was sicher auch ein Problem macht, ist die sehr lange delay-Zeit. Da passiert dann nix und du kannst auch keine IR-Befehle auswerten. Das solltest du ändern. (BlinkwithoutDelay)

Ich habe das Problem erkannt. Nur fehlt es mir gerade an der Umsetzung der Lösung.

Der Wert für Bewegungssensorstatus wird nur in dem Moment überprüft, wo ich die Taste drücke, die die Alarmanlage "einschaltet" und nicht auch wenn der Sensor immer die 1, also High erhält, wird es nicht weitergegeben, weil es nur im Moment des Drückens durchgeführt wird.

Es muss also eine fortlaufende Prüfung und Übergabe im Case eingebaut werden. Aber wie?

Ich werde mir das nochmal in Ruhe ansehen, derzeit geht es nicht.

Sorry für die späte Antwort.

Ich denke, du solltest die Auswertung des Bewegungsstatus mit in die Loop aufnehmen.

void loop()
{
  bewegungsstatus = digitalRead(bewegung);
  sensor = analogRead(0);
  voltage = (sensor * 5000) / 1024;
  voltage = voltage - 500;
  celsius = voltage / 10;


  if (bewegungsstatus == HIGH)
  {
     

    //hier weiterer code
    
  }
else

{
     
   // hier weiterer code

}

    if (irrecv.decode(&results))
    {
      translateIR();

      {
        irrecv.resume();
      }
    }
}

So wie in meinem Beispiel.
Leider kann ich da nicht weiter machen, weil ich nicht weiß, wie die Funktion weiter ablaufen soll.
Aber so prüft er immer, ob Bewegung ist oder nicht. Die Variablen kannst du dann im weiteren Code weiter nutzen.

Mit If und Else habe ich schon gearbeitet. Kann ich damit auch die Alarmfunktion zusätzlich einschalten? Bisher habe ich es nur zu Laufen bekommen, mit der Alarmfunktion immer eingeschaltet.

Wenn ich mir das "Gerät" in den Flur stelle mit dem Bewegungssensor zur Tür, soll diese lediglich am Abend zugeschaltet werden können und nicht durchgehend aktiv sein.

Wäre dann eine If (bewegungsstatus==HIGH) && (IR Fall Taste 16724175) dafür die korrekte Bedingung?

Nein, so wird es nicht funktionieren.

Dann wird der Sensor nur aktiv, wenn du gleichzeitig die IR-Taste drückst.

void translateIR()
{
  switch (results.value)
  {
    case 16724175:

      Alarm=1;
      break;

    case 16743045:

      Alarm=0;
      break;
  }
}


if (Alarm==1)

{

// Sensor aktiv

}

So in der Art (Beispiel, nicht getestet) kannst du es einbauen.