Problem mit PIR- Sensor (HC- SR501)

Hallo liebe community,

Durch einen PIR - Sensor (HC- SR501) soll ein Bewegungsablauf (Steuerung eines Elektromotors mit Hilfe von Relais) in Gang gesetzt werden.
Mein Problem ist, dass der Bewegungsablauf durchläuft obwohl der Bewegungsmelder keine Bewegung registriert hat und dann auch kontinuierlich weiter läuft. Dafür habe ich ihn mit einem T- Shirt abgedeckt. Das ist der Sketch:

int Relais1 = 8;
int Relais2 = 9;
int Relais3 = 10;
int Relais4 = 11;

int pirPin = 7; // Input for HC-S501 // pirPin ist LOW wenn keine Bewegung registriert wurde und wird HIGH wenn eine Bewegung registiriert wird

int pirValue = LOW; // Place to store read PIR Value // Platz an dem der gelesene PIR- Wert gespeichert wird
int Bewegungswert = LOW; // Der Bewegungswert ist zu Beginn LOW / 0


void setup() {

  pinMode(Relais1, OUTPUT);
  pinMode(Relais2, OUTPUT);
  pinMode(Relais3, OUTPUT);
  pinMode(Relais4, OUTPUT);
  pinMode(pirPin, INPUT);

  digitalWrite(Relais1, HIGH); // regelt, dass die Relais offen bleiben (normally open) wenn Strom angelegt wird
  digitalWrite(Relais2, HIGH);
  digitalWrite(Relais3, HIGH);
  digitalWrite(Relais4, HIGH);


}

void loop() {

  // Bewegungsablauf
  pirValue = digitalRead(pirPin);                // der gelesene Wert von pirPin wird auf pirValue gespeichert
  if (pirValue == HIGH && Bewegungswert == LOW ) // wenn pirValue = HIGH und Bewegungswert = LOW
  {
    Bewegungswert = HIGH;
  }
  if ( Bewegungswert = HIGH)
  {
    delay(2000);                // die Anfangspause soll dafür sorgen, dass die Bewegung erst beginnt, wenn die Bewegung des Anderen abgeschlossen ist!
    digitalWrite(Relais1, LOW); // Aufwärtsbewegung
    digitalWrite(Relais2, LOW);
    delay (3000);                // regelt die Zeit der Aufwärtsbewegung
    digitalWrite(Relais1, HIGH);
    digitalWrite(Relais2, HIGH);
    delay (1000);                //regelt die Zeit des Stillstandes
    digitalWrite(Relais3, LOW); // Abwärtsbewegung
    digitalWrite(Relais4, LOW);
    delay(3000);                 // regelt die Zeit der Abwärtsbewegung
    digitalWrite(Relais3, HIGH); // Bewegungsende
    digitalWrite(Relais4, HIGH);
    Bewegungswert = LOW;         // Bewegungswert LOW setzen
  }

}

Ich habe dann erstmal diesen Sketch hier ausprobiert mit Blick auf den seriellen Monitor, um auszuschließen, dass es nicht an einem defekten Bewegungsmelder liegt. Der Bewegungsmelder funktioniert jedoch einwandfrei.

//Der Bewegungsmelder funktioniert einwandfrei!

const int pPIR = 7; // Input for HC - S501
int pirValue;       // Place to store read PIR Value
int lastValue = 0;

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);       // das ist die Schnittstelle mit dem seriellen Monitor; Sie muss beim seriellen Monitor auch auf 115200 eingestellt werden!
  delay(2500);
  Serial.println("Motion Sensor working...");

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  pinMode(pPIR, INPUT);
}

void loop() 
{
  // put your main code here, to run repeatedly:
pirValue = digitalRead(pPIR);
digitalWrite(LED_BUILTIN, pirValue);
if(!pirValue) lastValue = 0;
if(pirValue && !lastValue)
{
  Serial.print(millis());
  Serial.println(" ms - Motion detected");
  lastValue = pirValue;
  }
}

Kann mir bitte jmd. weiter helfen:)?.

Herzliche Grüße Leonardo

Dein Fehler liegt hier:

 if ( Bewegungswert = HIGH)

Da gehört "==" rein.

Allerdings verstehe ich nicht, warum du nicht den direkten Wert des PIR verwendest und umständlicherweise noch eine zusätzliche Variable einbastelst.

Danke HotSystems! Super, jetzt funktioniert es. Ja du hast Recht, die pirValue - Variable kann ich mir sparen und stattdessen gleich digitalRead(pirPin) schreiben.

LeonardoFiando:
Danke HotSystems! Super, jetzt funktioniert es. Ja du hast Recht, die pirValue - Variable kann ich mir sparen und stattdessen gleich digitalRead(pirPin) schreiben.

Prima dass es jetzt funktioniert und danke für die Rückmeldung.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.