Unterstützung bei Treppenbeleuchung

Guten Morgen,

Wir sind gerade dabei eine neue Treppe einzubauen.

Da sich die Gelegenheit ergab haben wir bereits in der Wand eine Aluleiste eingegipst.

Nun möchte ich gerne einen WS2812B Ledstreifen verwenden um die Treppe zu beleuchten.

Oben und unten wird jeweils ein PIR Sensor eingebaut.

Die Software sollte auf einen Teensy 3.2 kommen.

Der Streifen soll sich, wenn jemand von unten kommt, von unten nach oben einschalten und wenn jemand von oben kommt, von oben nach unten einschalten. Nach einer gewissen Zeit soll er sich wieda von oben nach unten bzw unten nach oben ausschalten.

Leider bin ich ein absoluter Arduino Neuling.

Ich habe bereits C und C++ programmiert, auch ein bisschen Basic war dabei, jedoch ist das alles Jahre her.

Darum würde ich euch gerne um Unterstützung bitten bei meinem Sketch.

Ich habe bereits mit der Fastled Library experimentiert, jedoch komme ich auf keinen Stand der mich glücklich macht.

Eventuell hat jemand von euch schon ähnliches programmiert.

Danke im Vorraus

Hallo,

den Einstieg habe ich mir schon angeeignet.

Der Led streifen leuchtet, die Sensoren reagieren, jedoch reagieren sie meiner Meinung nach nicht richtig und ich weiß nicht wie ich meinen Sketch richtig aufbauen soll.

Hallo,

hier mein Aufbau:

und hier mein Code:

jetzt mit Neopixel…

#include <Adafruit_NeoPixel.h>

#include <SPI.h>

#define PIN 6
#define NUMPIXELS 92


Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int Sensor_oben = 8;
int Sensor_unten = 7;

int SO_Status = 0;
int SU_Status = 0;

int waitingtime = 30000;      //30sec wartezeit

void setup()
{
  pixels.begin();
  
  pinMode(Sensor_oben, INPUT);
  pinMode(Sensor_unten, INPUT);
  pinMode(PIN, OUTPUT);
  
//  Test des Ledstreifens
  pixels.setPixelColor(3,pixels.Color(150,0,0));
  pixels.show();
  delay(3000);
  pixels.setPixelColor(3,pixels.Color(0,0,0));
  pixels.show();
  
}

void loop()
{
  SO_Status = digitalRead(Sensor_oben);
  SU_Status = digitalRead(Sensor_unten);
  
  
  if (SO_Status == HIGH)      //Sensor oben wird ausgelöst
  {
    movedown();
    SO_Status = 0;
  }
  else{}
  
  if (SU_Status == HIGH)      //Sensor unten wird ausgelöst
  {
    moveup();
    SU_Status = 0;
  }
  else{}  
}

void moveup()
{
  for(int i=0; i<NUMPIXELS;i++)   //Leds sollen von unten nach oben EIN geschaltet werden
  {
    pixels.setPixelColor(i,pixels.Color(255,255,255));
    pixels.show();
    delay(100);
  }
  
  delay(waitingtime);       //30 sec eingeschaltet bleiben
  
  for(int i=0; i<NUMPIXELS;i++)   //Leds sollen von unten nach oben AUS geschaltet werden (halb so schnell)
  {
    pixels.setPixelColor(i,pixels.Color(0,0,0));
    pixels.show();
    delay(200);
  }
}

void movedown()
{
  for(int i=NUMPIXELS;i>0;i-1)    //Leds sollen von oben nach unten EIN geschaltet werden
  {
    pixels.setPixelColor(i,pixels.Color(255,255,255));
    pixels.show();
    delay(100);
  }  
  delay(waitingtime);       //30 sec eingeschaltet bleiben
  
  for(int i=NUMPIXELS; i<0;i-1)   //Leds sollen von oben nach unten AUS geschaltet werden (halb so schnell)
  {
    pixels.setPixelColor(i,pixels.Color(0,0,0));
    pixels.show();
    delay(200);
  }
 
}

Ändere mal bitte noch

Sketch

(Zitiert) in Sketch, das liest sich besser.

Gruß Tommy

noiasca:
“jedoch reagieren sie meiner Meinung nach nicht richtig” ist keine Fehlerbeschreibung!

Und was ist jetzt der Fehler?

#define NUMPIXELS = 92

Mag der Compiler nicht!

for (int i = NUMPIXELS; i < 0; i - 1)

Mag der Compiler auch nicht: “warning: for increment expression has no effect [-Wunused-value]”

agmue: Und was ist jetzt der Fehler?

Das ist doch klar... Während der lang laufenden Delays werden die Pir nicht ausgewertet.

Frazor: hier mein Aufbau:

kein Bild zu sehen. Poste das Bild bitte hier im Forum.

agmue:
Und was ist jetzt der Fehler?

#define NUMPIXELS = 92

Mag der Compiler nicht!

for (int i = NUMPIXELS; i < 0; i - 1)

Mag der Compiler auch nicht: “warning: for increment expression has no effect [-Wunused-value]”

Sei so nett gib auch die Auflösung:

#define: Das “=” muß weg.
for: als Drittes Argument muß i=i-1 bzw i-- stehen

Grüße Uwe

combie: Das ist doch klar... Während der lang laufenden Delays werden die Pir nicht ausgewertet.

delay() durch Zeitsteuerung mit millis() ersetzen. Grüße Uwe

uwefed:
Sei so nett gib auch die Auflösung:

Nö, denn mich stört, wenn der TO einen nicht compilierfähigen Code hier reinstellt und dann behauptet, die LED-Streifen würden nicht richtig leuchten.

Wenn er nach der Fehlermeldung des Compilers fragen würde, wäre das anders.

Da #4 abgebrochen aussieht, will ich mal im Sinne des TO hoffen, er wurde von wichtigen Dingen unterbrochen und führt dieses Thema später ordentlich weiter :slight_smile:

Hallo,

tut mir sehr Leid, ich war im Stress und wollte unbedingt noch etwas hochladen und habe dummerweise nach dem "verify" und nach dem ändern des Codes nicht mehr "strg+c" gedrückt und den alten code kopiert.

Jetzt habe ich den aktuellen Code hinzugefügt. "Test des Led Streifen" funktioniert gut.

Hi

Mich stört in dem Sketch, daß ab der ersten Erkennung NICHTS ANDERES mehr geht. Also wenn oben Einer die 100m lange Treppe betritt, läuft zuerst das ganze LED-Stripe voll, wartet dann und läuft dann leer. In der Zwischenzeit sind bereits die Touristen aus zwei Bussen unten auf die Nase gefallen, weil dort die Treppe unbeleuchtet bleibt ... bis eben die LEDs so weit durchgezählt wurden, daß unten auch Mal Licht ankommt.

Meine Herangehensweise: Wie bei Dir, jeder PIR setzt ein Flag und resettet die eigene Laufzeit. Bei gesetztem Flag wird pro 100ms (oder eine beliebige Wartezeit zwischen den Stufen) eine weitere Stufe beleuchtet. Hier wird stur mitgezählt, wie viele Stufen wir bereits am Leuchten haben, die jeweils Nächste wird dann nur dazu gepackt. Das klappt auch, wenn - egal wann - von der anderen Richtung Einer kommt. Wenn das entsprechende Flag nicht mehr gesetzt ist, werden die LEDs vom Anfang an wieder aus gemacht - hier kann die Geschwindigkeit auch eine Andere sein. Gleiches in der anderen Richtung. Wenn die 'AN-LEDs' am anderen Ende angekommen sind, wird das PIR-FLAG gelöscht (im Endeffekt ist es hier ein 'nächste LED einschalten-Flag'). Gleiches für die 'AUS-LEDs'.

Weiter kann man hier noch 'nebenbei' eine Taste abfragen, Welche die Treppe komplett in weiß beleuchtet, wenn man Mal 'was sehen muß' - hier ist ebenfalls eine separate Laufzeit möglich.

Abfrage der abgelaufenen Zeit mit millis() - wenn die Zeit noch nicht um ist, wird halt Nichts gemacht, sonst halt die nächste LED eingeschaltet. .show() nur an einer Stelle, also ein Flag setzen, wenn sich was an den LEDs geändert hat - man muß ja nicht die LEDs neu beschreiben, wenn sich daran Nichts geändert hat.

Hoffe, ich packe Dir jetzt nicht zu viel auf die Schultern :)

MfG

In der Zwischenzeit sind bereits die Touristen aus zwei Bussen unten auf die Nase gefallen, weil dort die Treppe unbeleuchtet bleibt ... bis eben die LEDs so weit durchgezählt wurden, daß unten auch Mal Licht ankommt.

Hahah ja das stimmt, ich wollte mir nur den Sketch fürs erste so einfach wie möglich halten :)

Grundsätzlich verstehe ich deine Herangehensweise und finde sie extrem gut.

Wie ich das ganze umsetze ist eine andere Problematik :D

Leider verstehe ich zum aktuellen Zeitpunkt die Arbeitsweise von "millis()" noch nicht, da mache ich mich jetzt schlau..

Hi

Dafür ist das 'Blink without delay' aus den Beispielen ein guter Anfang.

Im Endeffekt merkst Du Dir, wann Du was begonnen hast und 'guckst', ob die Wartezeit für den nächsten Schritt schon vorbei ist. Dann machst Du diesen Schritt und merkst Dir die aktuelle Zeit. Diese Zeit stellt millis() zur Verfügung - die Zeit in Millisekunden seit Start des Arduino - nach 47,batsch Tagen läuft diese 'Zeit' wieder auf Null über - wenn Du aber per millis()-startzeit>=wartezeit die abgelaufene Zeit 'bis zum nächsten Schritt' prüfst, macht dieser Überlauf Nichts, da auch das Ergebnis 'überläuft' - rechnet sich raus.

Damit bist Du dann schon bei einer State-Maschine - einem ENdlichem Automaten, Der für jeden Zustand genau einen Schritt hat. Zwischen diesen Schritten kann man hin und her springen, je nach Sensoren/Prüf-Ergebnissen - im Allgemeinen geht man aber immer nur einen Schritt weiter.

Für jede Funktionalität, Die Du 'nebeneinander' laufen lassen willst, baust Du eine eigene State-Maschine. Also jeweils eigene 'Startwert'-Variable, Die Du mithältst. So könntest Du das 'Hochlaufen' und 'Runterlaufen' in beiden Fällen (ANschalten und AUSschalten) als eigene Abläufe einbauen - da kannst Du dann z.B. verschiedene Geschwindigkeiten benutzen.

Soll aber erst Mal reichen - Du wirst schon Was zusammen bringen!

MfG

lies mal: https://forum.arduino.cc/index.php?topic=423688.0 Grüße Uwe

Hallo,

danke für eure Hilfe :slight_smile:

Hier mein aktueller Code:

[tt]#include <Adafruit_NeoPixel.h>

#include <SPI.h>

#define PIN 6
#define NUMPIXELS 13


Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int Sensor_oben = 8;
int Sensor_unten = 7;

int SO_Status = 0;
int SU_Status = 0;

const int waitingtime = 10000;      //30sec wartezeit

const int einschaltzeit = 10;

const int ausschaltzeit = 100;

unsigned long waitingtimestore;

unsigned long einschalttimestore;
  
unsigned long ausschalttimestore;

void setup()
{
  pixels.begin();
  
  pinMode(Sensor_oben, INPUT);
  pinMode(Sensor_unten, INPUT);
  pinMode(PIN, OUTPUT);
  
  
//  Test des Ledstreifens
  pixels.setPixelColor(3,pixels.Color(150,0,0));
  pixels.show();
  delay(3000);
  pixels.setPixelColor(3,pixels.Color(0,0,0));
  pixels.show();
  
}

void loop()
{
  SO_Status = digitalRead(Sensor_oben);
  SU_Status = digitalRead(Sensor_unten);
  
  moveup();
  movedown(); 
  
}

void moveup()
{
  
  if(SU_Status ==HIGH)
  {
  
  		for(int i=0; i<NUMPIXELS;i++)   //Leds sollen von unten nach oben EIN geschaltet werden
  		{
    		pixels.setPixelColor(i,pixels.Color(255,0,0));
    		pixels.show();
    		delay(einschaltzeit);
  		}
    
   		waitingtimestore = millis();
  }
  
  else{}
  
  if(millis()-waitingtimestore > waitingtime)	//30 sec eingeschaltet bleiben
  {
  		for(int i=0; i<NUMPIXELS;i++)   //Leds sollen von unten nach oben AUS geschaltet werden (halb so schnell)
  		{
   			pixels.setPixelColor(i,pixels.Color(0,0,0));
   			pixels.show();
   			delay(ausschaltzeit);
   		}
    
    	waitingtimestore = millis();
  }
  
  else{}
    
  SU_Status = LOW;
   
}

void movedown()
{
  
  if (SO_Status == HIGH)      //Sensor unten wird ausgelöst
  {
    	for(int i=NUMPIXELS;i>0;i--)    //Leds sollen von oben nach unten EIN geschaltet werden
  		{
    		pixels.setPixelColor(i,pixels.Color(255,0,0));
    		pixels.show();
    		delay(einschaltzeit);
  		} 
    
    	waitingtimestore = millis();
  }
  
  else{}
  
  if(millis()-waitingtimestore > waitingtime)       //30 sec eingeschaltet bleiben
  {
  		for(int i=NUMPIXELS; i<0;i--)   //Leds sollen von oben nach unten AUS geschaltet werden (halb so schnell)
  		{
    		pixels.setPixelColor(i,pixels.Color(0,0,0));
    		pixels.show();
    		delay(ausschaltzeit);
  		}
    	waitingtimestore = millis();
   }
  
   else{}
}


[/tt]

Leider habe ich jetzt die Problematik, dass ich mir selber die waitingtime zurücksetze wenn ich die das Ende der Treppe erreiche.

Bei 92 Lichtpunkten brauchst Du 92 * 60 mA = 5,5 A Strom. In Deinem Schaltbild sehe ich aber kein Netzteil:

Frazor: Leider habe ich jetzt die Problematik, dass ich mir selber die waitingtime zurücksetze wenn ich die das Ende der Treppe erreiche.

Da musst du wohl die Ausrichtung der Bewegungsmelder und Programmlogik so weit optimieren, dass du das Verlassen der Treppe und neue Person betritt die Treppe unterscheiden kannst. Vorschlag: Beide Melder überblicken die Treppe außer den Enden. Wenn jemand auf der Treppe ist, reagieren beide Melder. Wenn die Person die Treppe verlässt, dann reagiert nur noch einer. Kommt jemand wieder auf die Treppe reagieren nach kurzer Zeit wieder beide. Evtl. brauchst du einen dritten Bewegungsmelder, der die Treppe überblickt und prüft, ob jemand auf der Treppe ist. Nur du kennst die baulichen Voraussetzungen. Interessant könnten die Sharp sharp gp2y Abstandssensoren sein um die Position einer Person auf der Treppe zu erfassen.

Bei 92 Lichtpunkten brauchst Du 92 * 60 mA = 5,5 A Strom. In Deinem Schaltbild sehe ich aber kein Netzteil:

Stimmt,

ich habe ein 6A Netzteil :) leider wusste ich nicht wie ich in Tinkercad Circuits ein Netzteil realisiere :)

Ich habe vor einiger Zeit an einem ähnlichen Projekt rumgedoktert und diese billigen Sensoren rausgeschmissen. Gerade in einer engen Umgebung (Flur / Treppe) machen die meist nicht das was sie sollen.

Ich habe dann diese Sensoren eingesetzt. Die laufen so wie man es erwartet und ich bin damit sehr zufrieden, auch wenn sie etwas teurer sind.

Allerdings habe ich das Projekt wieder verworfen und die Sensoren arbeiten jetzt als Schrankbeleuchtung. ;)