Lauflicht mit Bewegungsmeldern steuern

[tt]Hallo liebe Community,[/tt]
[tt]ich, als absoluter Anfänger, bastel seit kurzem an einem Lauflicht mit Bewegungsmeldern.[/tt]
[tt]Ich benutze den Arduino UNO, drei Bewegungsmelder HC-SR501 und drei Leuchtdioden.[/tt]
[tt]Ich will, dass eine LED angeht, sobald der dazugehörige Bewegungsmelder eine Bewegung registriert. [/tt]
[tt]Die Bewegungsmelder sind einige Meter auseinander, damit die LEDs nacheinander angehen, 5 Sekunden warten und dann ausgehen. Folgenden Sketch habe ich bereits geschrieben:[/tt]

int pirPin1 = 7;
int pirPin2 = 4;
int pirPin3 = 2;
int ledPin1 = 13;
int ledPin2 = 12;
int ledPin3 = 8;

void setup() 
{ pinMode(pirPin1,INPUT);
  pinMode(pirPin2,INPUT);
  pinMode(pirPin3,INPUT);
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2,OUTPUT);
  pinMode(ledPin3,OUTPUT);}
  
void loop() {
 if(digitalRead(pirPin1==HIGH))
    {digitalWrite(ledPin1,HIGH);
    delay(5000);}
else
           digitalWrite(ledPin1,LOW);
           digitalWrite(ledPin2,LOW);
           digitalWrite(ledPin3,LOW);
    
if(digitalRead(pirPin2==HIGH))
    {digitalWrite(ledPin2,HIGH);
    delay(5000);}
else
           digitalWrite(ledPin1,LOW);
           digitalWrite(ledPin2,LOW);
           digitalWrite(ledPin3,LOW);
            
if(digitalRead(pirPin3==HIGH))
  {digitalWrite(ledPin3,HIGH);
   delay(5000);}
    
else
           digitalWrite(ledPin1,LOW);
           digitalWrite(ledPin2,LOW);
           digitalWrite(ledPin3,LOW);
 }

[tt]Allerdings müssten dann mehrere if-Bedingungen gleichzeitig ablaufen. Hat da jemand eine Idee, wie man das machen könnte? [/tt]
Vielen Dank im Voraus!

Wenn du das mit den langen delays aufbaust, wird das nix.
Das musst du mit der Funktion "millis()" bauen.
Sieh dir dazu das Beispiel BlinkWithoutDelay in der IDE an.

(deleted)

1Goliath:
Allerdings müssten dann mehrere if-Bedingungen gleichzeitig ablaufen. Hat da jemand eine Idee, wie man das machen könnte?
Vielen Dank im Voraus!

ich glaube ich habe das sogar mehr als nur eine Idee, sondern auch eine Erklärung dazu.
Im Prinzip willst du eine LED einschalten und mit Zeitablauf abschalten:

Part 1 mit prozeduraler Programmierung:
https://werner.rothschopf.net/202003_arduino_retriggerbares_nachlaufrelais.htm

Part 2: mit OOP:
https://werner.rothschopf.net/202003_arduino_retriggerbares_nachlaufrelais_oop.htm

Moin Goliath!

Peter-CAD-HST:
Am Bewegungsmelder HC-SR501 ist eine Zeitkonstante einstellbar.

...und hier ist das Datenblatt dazu. Da drin heißt es "Haltezeit".
Falls fünf Sekunden einstellbar sind brauchst Du dann in Deinem Sketch gar nicht mehr mit Zeiten jonglieren, sondern 'nur' noch jedes Eingangssignal vom PIR auf die jeweilige LED spiegeln.

Wenn Du allerdings was lernen willst über Zeitbehandlung auf dem Arduino: Schau Dir die Links von noiasca an!

1Goliath:
Folgenden Sketch habe ich bereits geschrieben:

...

else
          digitalWrite(ledPin1,LOW);
          digitalWrite(ledPin2,LOW);
          digitalWrite(ledPin3,LOW);
...

Einrückungen sind für die bessere Lesbarkeit durch den Menschen geeignet, Kompiler lassen sich davon nicht beeinflussen. Die automatische Formatierung der IDE zeigt den Fehler:

...
  else
    digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
...

Richtig mit zusätzlicher Klammer:

...
  else
  {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
  }
...

Das gilt auch für noch weitere zwei Stellen.

Ich glaube, die Idee von wno158 ist gut. Es ist mir eigentlich egal, wie lange die LEDs anbleiben. Hauptsache sie bleiben kurz an. An dem HC-SR501 kann man die Schaltzeit und die Empfindlichkeit einstellen. Dann muss ich das nicht im Sketch extra angeben. Sketch habe ich jetzt wie folgt verbessert:

int pirPin1 = 2;
int ledPin1 = 13;
int pirPin2 = 4;
int ledPin2 = 12;
int pirPin3 = 7;
int ledPin3 = 8;

void setup() {
  pinMode(pirPin1, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(pirPin2, INPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(pirPin3, INPUT);
  pinMode(ledPin3, OUTPUT);
}

void loop() {
if (digitalRead(pirPin1)==HIGH)
 digitalWrite(ledPin1, HIGH);

else
      {digitalWrite(ledPin1, LOW);}

if (digitalRead(pirPin2)==HIGH)
 digitalWrite(ledPin2, HIGH);

else
      {digitalWrite(ledPin2, LOW);}
      
if (digitalRead(pirPin3)==HIGH)
 digitalWrite(ledPin3, HIGH);

else
     { digitalWrite(ledPin3, LOW);}

}

Die Bewegungsmelder habe ich richtig eingestellt und es passt alles, außer, dass LED1 aus irgendeinem Grund VIEL länger anbleilt(fast das dreifache, als LED 2 und 3)
Nur eine kleine Frage: Die Pins sind teilweise mit "~"Zeichen beschriftet (Bsp.: 11~,10~,...). Was bedeuten die?

Vermutlich meinst du Markierungen für PWM fähige Pins. Sonst mach mal ein Bild und kringle ein was du meinst.

Genau. Aber was bedeutet PWM fähig?
Könnte ich diese Pins für dieses Projekt benutzen?

1Goliath:
... außer, dass LED1 aus irgendeinem Grund VIEL länger anbleilt(fast das dreifache, als LED 2 und 3)

Anmerkung zur systematischen Fehlersuche:
Tausch doch mal PIR 1 und 2 aus. Wenn der "Fehler" mitwandert, sollte es der Bewegungsmelder selbst sein; ansonsten im Sketch suchen (wobei ich da jetzt noch keinen offensichtlichen Fehler gefunden habe).

Edit: An Pin 13 ist natürlich auch die interne LED angeschlossen. Vielleicht auch mal einen anderen Pin probieren.

Die Dinger scheinen etwas empfindlich zu sein, wenn man die Potis an den Anschlag dreht.
Vielleicht ist auch die Empfindlichkeit zu gering eingestellt und eine Wärmequelle in der Nähe von PIR1 triggert den immer wieder nach.

(deleted)

1Goliath:
Genau. Aber was bedeutet PWM fähig?
Könnte ich diese Pins für dieses Projekt benutzen?

PWM heißt "PulsWeitenModulation" und bedeutet, du könntest deine Led daran in der Helligkeit ändern.
Also ja, du kannst es für dein Projekt nutzen.
2

Bewegungsmelder und LEDs habe ich alle miteinander getauscht. Jetzt leuchtet LED3 durchgehend :frowning:

1Goliath:
Bewegungsmelder und LEDs habe ich alle miteinander getauscht. Jetzt leuchtet LED3 durchgehend :frowning:

Dann hast du etwas falsch gemacht.
Zeige uns dein Schaltbild.

Ground der Bewegungsmelder ist an Ground meiner Steckplatine angeschlossen, die wiederum an Ground des Arduino angeschlossen ist.
VCC der Bewegungsmelder ist am Pluspol der Steckplatine angeschlossen, die wiederum 5V des Arduino angeschlossen ist.
OUT der Bewegungsmelder ist an den Pins 7, 4 und 2 angeschlossen.
Die LEDs sind an Pin 13, 12 und 8, sowie Ground an der Steckplatine angeschlossen.
Die Schaltzeit der Bewegungsmelder ist komplett im Uhrzeigersinn und die Empfindlichkeit gegen den Uhrzeigersinn gedreht.
Dadurch, dass die Bewegungsmelder weit auseinander sind, habe ich auch mehrere Meter Kabel.

1Goliath:
Die LEDs sind an Pin 13, 12 und 8, sowie Ground an der Steckplatine angeschlossen.

Mit Vorwiderstand?

Und wie sieht dein aktueller Sketch aus ?

Ich benutze 3 1kΩ Widerstände
Sketch:

int pirPin1 = 2;
int ledPin1 = 13;
int pirPin2 = 4;
int ledPin2 = 12;
int pirPin3 = 7;
int ledPin3 = 8;


void setup() {
  pinMode(pirPin1, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(pirPin2, INPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(pirPin3, INPUT);
  pinMode(ledPin3, OUTPUT);
}

void loop() {
  if(digitalRead(pirPin1)==HIGH)
    {digitalWrite(ledPin1,HIGH);}
else
    {digitalWrite(ledPin1,LOW);}
          
if  (digitalRead(pirPin2)==HIGH)
    {digitalWrite(ledPin2,HIGH);}
else
    {digitalWrite(ledPin2,LOW);}
          
if  (digitalRead(pirPin3)==HIGH)
    {digitalWrite(ledPin3,HIGH);}
else
    {digitalWrite(ledPin3,LOW);}
}

Also am Sketch kann ich keinen Fehler erkennen.
Mein Tipp:
Die komplette Verkabelung erneuern und dabei prüfen, ob ein Kabel defekt ist.

Sehe ich genauso.
Als Paranoiker würde ich vielleicht im setup() noch alle LEDs ausschalten.

Vielleicht zunächst nur die Verkabelung PIR3/LED3 auswechseln - das war doch der einzige Pfad, der nicht funktioniert.

Dadurch, dass die Bewegungsmelder weit auseinander sind, habe ich auch mehrere Meter Kabel.

Über wie viele Meter reden wir denn da ungefähr?