Hilfe bei einem Projekt, LED-Beleuchtung, PIR

Hallo !!

Vielleicht kann mir jemand etwas unter die Arme greifen.

Ich habe vor ein LED-Strip in Verbindung mit einem PIR (auch LDR) zu schalten.

  • PIR erkennt Bewegung
  • LED-Strip geht an (Dimmt langsam hoch)
  • LED-Strip bleibt an solange Bewegung

-PIR erkennt keine Bewegung mehr
-LED-Strip bleibt noch etwas an (z.B. 20 sek.)
-LED-Strip dimmt langsam nach unten (aber noch nicht ganz aus!)
-LED-Strip bleibt für ca. 5 Sek in der gedimmten Einstellung
-LED-Strip geht dann aus-

Problem:

Wie bekomme ich es denn hin, dass der LED-Strip wieder hochdimmt,wenn er in der Phase wo er runterdimmt bzw. verhält, sobald der PIR in dieser Zeit wieder eine Bewegung erkennt ?

Könnte mir da jemand Programmtechnisch etwas helfen ??

Vielen Dank !!!

Wo bleibt dein Ansatz? Wenn dir garnichts einfällt, fange erst mit den Basics an. Wichtig für das Hochdimmen wird das Verständniss von BlinkWithoutDelay sein!!

Edit: Danke Stefan

Und dies

Ich habe vor ein LED-Strip in Verbindung mit einem PIR (auch LDR) zu schalten.

sind unterschiedliche Bauteile.
Mit einem LDR kannst du keine direkte Bewegung feststellen, nur einen Helligkeitsunterschied.

BlinkWithoutMillis

:wink: Da fällt mir delay(20) ein. Das sorgt dafür, dass von 0 .. 255 (100%) ca. 5 sec vergehen. Und wenn
PIR - Signale mindestens 20 ms lang anstehen, spricht nichts dagegen, loop() so langsam laufen zu lassen.
[Nachtrag:] (Damit es klar ist:) Mit millis() und ungebremster loop ist es aber auf Dauer einfacher.

... in der Phase wo er ...

Genau so: merk dir, in welcher Phase du grade bist, und spare nicht an verschiedenen Zuständen.

Ist das nicht fast das gleiche?

http://forum.arduino.cc/index.php?topic=343786.0

Hallo !!!

Ein wenig habe ich ja schon:

const int transistorPin = 9;
int bewegung =2;
int bewegungsstatus=0;
int LEDstatus=0;
void setup() {
pinMode(transistorPin, OUTPUT);
pinMode(bewegung, INPUT);
Serial.begin(9600);
}

void loop() {
bewegungsstatus=digitalRead(bewegung);
Serial.print (digitalRead(bewegung));
delay(1000);

if ((bewegungsstatus == 1) && (LEDstatus == 0))
{
for (int brightness = 0; brightness < 255; brightness++) {
analogWrite(transistorPin, brightness);
delay(20);
LEDstatus = 1;
}
}
if ((bewegungsstatus ==1) && (LEDstatus == 1))
{
for (int a = 0;a < 15; a++){
analogWrite(transistorPin, 255);
delay(1000);
LEDstatus = 2;
}

}
if ((bewegungsstatus == 1) && (LEDstatus == 2))
{
for (int a = 0;a < 15; a++){
analogWrite(transistorPin, 255);
delay(1000);
LEDstatus = 2;
}
}
if ((bewegungsstatus == 0) && (LEDstatus == 2))
{
for (int brightness = 255; brightness >= 50; brightness--) {
analogWrite(transistorPin, brightness);
delay(15);
}
delay(600);
for (int brightness = 50; brightness >= 0; brightness--) {
analogWrite(transistorPin, brightness);
delay(150);
LEDstatus = 0;
}
}

}

Bisher noch nicht den LDR eigebunden (Natürlich nicht für die Bewegung !!! PIR erst Abends !) :slight_smile:
Auf dem Breadboard steckt ein TIP122 der den LED-Strip bedient....

Der Code oben funktioniert auch schon .... bis auf die Tatsache, dass ich gerne in der Zeit wo er runterdimmt bei Bewegung wieder hochdimmen soll :confused:

Aber erstmal Dank für die bisherigen Antworten.

Gruß

tazzie:
Der Code oben funktioniert auch schon .... bis auf die Tatsache, dass ich gerne in der Zeit wo er runterdimmt bei Bewegung wieder hochdimmen soll :confused:

Genau das ist der Grund, wieso du dir dringend BlinkWithoutDelay anschauen sollst. Die Schleifen blockieren deinen loop-Durchlauf.

Des weiteren kannst du die Verschachtelung einfacher aufbauen.

if(bewegungsstatus) {
switch(LEDstatus) {
case 0:

break;
...


}

Schaue nochmal in den oben erwähnten Thread dort ist doch schon alles genau wie du es willst.
Gruß
DerDani

mh....

da stehe ich auf dem Schlauch ....

habe da so gar keinen Ansatzpunkt zwischen einem LED an/aus und meinem "Problem"..

:confused:

In "meinem" Sktech sind so zusagen zwei komponetten einmal die Bewegungserkennung. Die setzt dann den PWM Zielwert hoch egal wann auch wenn er am runterdimmen ist und nach einer Zeit von 60s runter. Es wird nur gedimmt wenn der Aktuelle Wert anders ist als der aktuelle. Im Moment sind zwei Werte hinterlegt "Hell" und "Dunkel" du musst nur noch anpassen wann der Wert auf "Aus" PWMVal=0 gehen soll.
Du müsstest in den Sketch nur noch einen Wert reinbringen der wenn länger als die Zeit der letzten Bewegungerkennund + Zeit auf nirdrigem PWM Wert halten den PWM Wert auf Null setzt.
Wie schulte schon sagte dein Sketch blockiert sich selber wenn er dimmt das muss nach dem "Blink witout delay"-Prinzip anpassen (was in meinem geposteteten Sketch schon vorhanden ist).
Fertige Sketche auf anfrage werden hier nur von Jurs gepostet. Das ist aber ja auch nicht ganz Sinn der Sache eher Hilfe zu Selbsthilfe.
Gruß
DerDani

Sorry volvodani...

ich habe den Link zu "deinem" Code von ElEspanol gar nicht wahrgenommen....

jetzt habe ich einen Ansatzpunkt :slight_smile:

"nur" noch den "halten" Punkt reinbringen .... dann wäre/ist es perfekt !!!!

Danke nochmals und SORRY !!!!!

Vielleicht komme ich nochmal darauf zurück :confused: