Treppenlicht macht Probleme

Hallo an alle!

Habe nun das Forum schon lange durchlesen aber nix konkretes gefunden bezüglich meiner Treppenlicht-Steuerung.
Zum Einsatz kommen WS2812-LED-Module, ein Arduino UNO oder NANO, zwei PIR-Sensoren oder ähnliche Lichtschranken, ein Lichtsensor.

Funktionieren tut im Moment folgendes:
Person betritt die Treppe oben → Stufen werden einzeln von oben zeitversetzt beleuchtet und gehen nach einer bestimmten Zeit (leider “delay-Befehl”) wieder nacheinander von oben beginnend aus.
Person betritt Treppe von unten → Stufen werden von unten nach oben zeitversetzt beleuchtet und entsprechend wieder abgeschaltet. Soweit ganz gut, aber:

Betritt von oben eine Person die Treppe und kurz drauf eine Person von unten, so steht die untere Person im Dunkeln, da der untere PIR inaktiv ist. Ist die Zeit abgelaufen dann werden die LEDs abgeschaltet und leider könnte somit die Person welche als zweites die Treppe betreten hat im Dunkeln stehen… Voll dämlich.

Hoffe Ihr könnt mir weiter helfen…

int PIR001=10;
int PIR002=11;
int LIGHT=A0;
int PHOTO=0;
int MOVEMENT001=0;
int MOVEMENT002=0;
 
 
 //
 #include <Adafruit_NeoPixel.h>

#define PIN 6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(20, PIN, NEO_GRB + NEO_KHZ800);
 //
 

 
void setup() {
  Serial.begin(9600);

  pinMode(PIR001, INPUT);
  pinMode(PIR002, INPUT);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

}
 
void loop() {
  MOVEMENT001=digitalRead(PIR001);
  MOVEMENT002=digitalRead(PIR002);
  PHOTO=analogRead(LIGHT);
 
  if ( MOVEMENT001 == HIGH && PHOTO <= 820)         //wenn Treppe von unten betreten
  {    
    colorWipe(strip.Color(255, 0, 0), 500);         //LED nacheinander an / von unten nach oben
    delay(5000);
    colorWipe(strip.Color(0, 0, 0), 500);           //LED nacheinander aus
  } 
  
  else if (MOVEMENT002 == HIGH && PHOTO <= 820)   //wenn Treppe von oben betreten
  {      
    colorWipe2(strip.Color(0, 255, 0), 500);      //LED nacheinander an / von oben nach unten
    delay(5000);
    colorWipe2(strip.Color(0, 0, 0), 500);        //LED nacheinander aus
  }

// folgende Abfrage beider PIR funktioniert nicht
else if (MOVEMENT001 == HIGH && MOVEMENT002 == HIGH && PHOTO <= 820)
  {      
    colorWipe2(strip.Color(0, 0, 255), 500);
    delay(5000);
    colorWipe2(strip.Color(0, 0, 0), 500);
  }

Serial.print(" - PHOTO ");
Serial.println(PHOTO);
Serial.print(" Sensor unten ");
Serial.println(MOVEMENT001);
Serial.print("  Sensor unten ");
Serial.println(MOVEMENT002);
  


}
 void colorWipe(uint32_t c, uint8_t wait) {
   for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
         }
       }
 
void colorWipe2(uint32_t c, uint8_t wait) {
  for(uint16_t i=strip.numPixels(); i>0; i--) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

Für mich schaut's so aus, als würdest du dir durch das delay das betreten beider Richtungen zerschießen.. wenn erst einer oben die Treppe betritt, wird diese Schleife durchlaufen. Wenn dann einer von unten kommt, wird immer noch die anderen Schlaufe durchlaufen. Nur wenn beide exakt gleichzeitig die Lichtschranke aktivieren, funktioniert der Effekt, dass die Beleuchtung von beiden Seiten geht.

Du musst mit millis(); arbeiten. Merk dir den Zeitpunkt, wann eine Lichtschranke durchlaufen wurde und üb erprüf bei jedem Programmdurchlauf, ob die Zeit zum an/abschalten der nächsten LED abgelaufen ist. Falls jemand von der anderen Richtung kommen sollte benutzt du einen zweiten Timer (also für beide Richtungen je einen) und erst wenn beide abgelaufen sind, soll sich was ändern.

Ich hoffe, soweit verständlich, was ich mein.

LG

Fipsi

Danke für deine schnelle Antwort. Bin gerade am Tüfteln, komme aber mit millis() und den Timern noch nicht klar....

Aber ich bleibe hartnäckig..... :0

http://arduino.cc/en/Tutorial/BlinkWithoutDelay http://playground.arduino.cc/Learning/BlinkWithoutDelayDe