[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.
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:
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!
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:
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?
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.
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.