Treppenhauslicht mit 2 Bewegungsmeldern

Hallo liebe community,

ich bin gerade dabei eine Treppenhausbeleuchtung mit WS2812 LEDs aufzubauen, die automatisch mit 2 Bewegungsmeldern funktioniert solange die Beleuchtungsstärke eines Lichtsensors unterhalb eines eingestellten Schwellenwerts ist.
Der Sketch funktioniert schon ganz gut, allerdings habe ich noch einen Wunsch und weiß nicht, wie ich das realisieren kann:

aktueller Stand:
am oberen & unteren Ende der Treppe befindet sich je ein Bewegungssensor. Ein Sensor gibt ein Signal, wenn eine Bewegung detektiert wird und lässt dann ein nach Stufen gestaffeltes Lauflicht (über FastLED library) auf dem LED Strip ablaufen (je nach dem von oben oder unten). Nach einer voreingestellten Zeit wird das Lauflicht wieder ausgemacht.

Ich würde es nun gerne es so haben, dass wenn man länger auf der Treppe verweilt das Licht anbleibt, dh das Ausschalten erst dann aufgerufen wird wird, wenn jeweils der andere Sensor ebenfalls ein Signal gibt oder alternativ nach einer längeren Zeit, falls aus irgendeinem Grund kein Signal kommen sollte.

Hättet ihr hier irgendwelche Tipps?
so habe ich das ca. aktuell

void loop() {

  refreshSensors(); //sensoren werden gecheckt

  if (isLightvalueOk()) { //wenn es dunkel ist
    if (pirTopMotionActive && !lichtan) { //oberer sensor gibt signal

      moveDown();

    }

    if (pirBottomMotionActive && !lichtan) { //unterer sensor gibt signal

      moveUp();

    }
  }
  delay(100);
}

void moveUp() {
  lightsOnUp();
  refreshSensors();
  delay(waitBeforeSwitchOff);
  lightsOffUp();
  delay(sleepAfterLightsOff);
}

void moveDown() {
  lightsOnDown();
  delay(waitBeforeSwitchOff);
  lightsOffDown();
  delay(sleepAfterLightsOff);
}

void lightsOnUp() {
  for (int stufe = 1; stufe < 17; stufe++) {
    int additional = 3;
    additional = additional * stufe;
    for (int j = 0; j < additional; j++) {
      leds[j] = CRGB::Chocolate;
    }
    FastLED.show();
    delay(switchOnDelayTimeInit);
  }
  lichtan = true;
}

void lightsOnDown() {
  Serial.println("DOWN");
  int down = NUM_LEDS - 1;
  int stufe = 16;
  while (stufe > 0) { //nicht fragen, warum ich hier eine while Schleife nutze. Aus irgendeinem Grund scheint eine negativ verlaufende for Schleife nicht zu funktionieren
    for (int j = ((stufe - 1) * 3); j < NUM_LEDS; j++) {
      leds[j] = CRGB::Chocolate;
    }
    FastLED.show();
    delay(switchOnDelayTimeInit);
    stufe--;
  }
  lichtan = true;
}

void lightsOffUp() {
  for (int stufe = 1; stufe < 17; stufe++) {
    int additional = 3;
    additional = additional * stufe;
    for (int j = 0; j < additional; j++) {
      leds[j] = CRGB::Black;
    }
    FastLED.show();
    delay(switchOffDelayTimeInit);
  }
  lichtan = false;
}

void lightsOffDown() {
  int down = NUM_LEDS - 1;
  int stufe = 16;
  while (stufe > 0) {
    for (int j = ((stufe - 1) * 3); j < NUM_LEDS; j++) {
      leds[j] = CRGB::Black;
    }
    FastLED.show();
    delay(switchOffDelayTimeInit);
    stufe--;
  }
  lichtan = false;
}

Vielen Dank im Voraus & freundliche Grüße

ich erinnere mich, das war die letzten 14-31 Tage hier bereits. Blättere mal zurück ...

Einer geht von oben runter, der Arduino bekommt das Signal vom oberen Sensor, er bleibt ein wenig auf der Treppe stehen, dann kommt einer von unten, somit bekommt der Arduino das Signal vom unteren Sensor und macht das Licht aus. Dann stehen zwei im Dunkeln auf der Treppe. :slight_smile:

Franz54:
Einer geht von oben runter, der Arduino bekommt das Signal vom oberen Sensor, er bleibt ein wenig auf der Treppe stehen, dann kommt einer von unten, somit bekommt der Arduino das Signal vom unteren Sensor und macht das Licht aus. Dann stehen zwei im Dunkeln auf der Treppe. :slight_smile:

Was soviel heißt wie:
Man braucht auf jeder Seite 2 Sensoren um die Laufrichtung zu erkennen.

Ein aufregendes Projekt.

Ja, dann macht´s Sinn. :slight_smile:

Wenn die Bewegungssensoren zusammen die ganze Treppe abdecken, also auch darauf stehende Personen durch ihre Bewegungen die Sensoren wiederholt auslösen, braucht man nur zwei retriggerbare Monoflops zu programmieren. Solange beide getriggert sind, bleibt das Licht an.

Das läuft dann darauf hinaus:

aktueller Stand:
am oberen & unteren Ende der Treppe befindet sich je ein Bewegungssensor. Ein Sensor gibt ein Signal, wenn eine Bewegung detektiert wird und lässt dann ein nach Stufen gestaffeltes Lauflicht (über FastLED library) auf dem LED Strip ablaufen (je nach dem von oben oder unten). Nach einer voreingestellten Zeit wird das Lauflicht wieder ausgemacht.

michael_x:
Das läuft dann darauf hinaus:

Das sehe ich auch so.
Gerade ohne jegliche Programmiererfahrung sollte man sich zu Anfang kleinere Ziele stecken.

Steigern kann man sich später immer noch.

Alles gute Punkte und vielen Dank für die Hinweise auf den älteren Thread. Ich hatte zwar geschaut, aber nicht so weit...