Treppen Beleuchtung mit LED Strips

Hallo!
Ich bin neu hier! Vielleicht kann mir hier wer helfen! Ich komme einfach nicht mehr weiter! Mir wurde schon im Arduino forum de geholfen und bin sehr dank bar dafür aber jetzt will oder kann mir dort keiner hilft geben!

Hier ist mein Projekt Treppenbeleuchtung!

Ich habe im Baumarkt günstige Led Strips gekauft und auf die richtige länge gebracht und an der Treppe befestigt. Dann diese mit dem Arduino über ein selbst gemachtes board mit Mos-fets angeschlossen! Für die Auslösung verwende ich einen Bewegungsmelder ( HC-SR501) und 2 Ir Lichtschranken bei denen die Entfernung eingestellt werden kann (bis max. 1 Meter)!

Das ganze sollte so funktionieren:

Ich nähere mich der Treppe Bewegungsmelder erkennt Bewegung und Schaltet die ersten 3 Stufen ein, gehe ich nur vorbei und nicht die stufen hoch, sollten die Led's wieder aus gehen! Gehe ich rauf und aktiviere die Ir Lichtschranke (unten) dann fangen alle Strips zu leuchten an, zeitverzögert nach oben! Passiere ich das obere ende der Treppe schaltet die 2. Ir Lichtschranke (oben) werden die Strips von unten nach oben ausgeschaltet. Das selbe von oben nach unten!

Was noch nicht funktioniert sind die Abschaltungen falls eine Ir Lichtschranke nicht aktiviert wird! Das würde ich gerne mit einer verzögerten Abschaltung von ca. 30 sec. machen!

Der sketch:

Code:
int speed = 500;    // die Zeit wie schnell die Ausgänge von LOW->HIGH und HIGH->LOW wechseln | Default: 1 Sekunde
int warte = 2000;

int led[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 44, 45, 46, 47 };    // Pin2 - 13 entsprechen led0 - led11, Pin44 - 47 entsprechen led12 - led15
int anzahl = 16;    // Bestimmt die Anzahl aller Pins -> Wichtig für for-schleife

int inpin51 = 51;
int inpin50 = 50;
int inpin49 = 49;

int boden = 0;    // Pir unten
int oben = 0;    // Lichtschranke oben
int unten = 0;    // Lichtschranke unten
int bewegung = 0;   //bewege mich unten
int runter =  0;    // ich gehe runter
int rauf = 0;    // ich gehe rauf


void setup()
{
  pinMode (inpin51, INPUT);    // Anschluss Pin51 als eingang oben
  pinMode (inpin50, INPUT);    // Anschluss Pin50 als Eingang unten definieren
  pinMode (inpin49, INPUT);    // Anschluss Pin49 als Eingang PIR definieren

  for ( int i = 0; i < anzahl; i++ )    // Deklariert alle "led" als Output
  {
    pinMode ( led[i], OUTPUT );
    digitalWrite ( led[i], LOW );    // Setzt alle "led" auf LOW
  }

}


void loop()
{
  boden = digitalRead(inpin49);
  oben = digitalRead(inpin51);    // ermittelt den aktuellen Zustand am Eingang Pin50
  unten = digitalRead(inpin50);    // ermittelt den aktuellen Zustand am Eingang Pin49



  if ((boden == HIGH) && (unten == LOW))
  {
    for (int i = 0; i < 3; i++)
    {
      digitalWrite (led[i], HIGH);
      delay (speed);
    }
    bewegung = 1;
    return;
  }

  if ( ( unten == HIGH ) && ( oben == LOW ) && ( runter == 0 ) )    // Logik zur Laufrichtung und aktuellen Stand pruefen
  {

    for ( int i = 3; i < anzahl; i++ )
    {
      digitalWrite ( led[i], HIGH );
      delay ( speed );
    }

    rauf = 1;
    return;
  }


  if ( ( unten == LOW ) && ( oben == HIGH ) && ( rauf == 1 ) )    // Logik zur Laufrichtung und aktuellen Stand pruefen
  {

    for ( int i = 0; i < anzahl; i++ )
    {
      digitalWrite ( led[i], LOW );
      delay ( speed );
    }



    rauf = 0;
    return;
  }


  if ( ( unten == LOW) && ( oben == HIGH ) && ( rauf == 0 ) )    // Logik zur Laufrichtung und aktuellen Stand pruefen
  {

    for ( int i = anzahl - 1; i >= 0; i-- )
    {
      digitalWrite ( led[i], HIGH );
      delay ( speed );
    }
    runter = 1;
    return;

  }
  if ( ( unten == HIGH ) && ( oben == LOW ) && ( runter == 1 ) )                 // Logik zur Laufrichtung und aktuellen Stand pruefen
  {

    for ( int i = anzahl - 1; i >= 0; i-- )
    {
      digitalWrite ( led[i], LOW );
      delay ( speed );
    }
    runter = 0;
    return;
  }
}
/code]
 
wo baue ich eine Wartezeit ein das das licht aus geht ohne eine lichtschranke zu durchschreiten? ich stehe voll an!

Danke im voraus!

Welcome!

Ohne Deinen Code gelesen zu haben: Du musst die Informationen "PIR hat was gesehen", "IR hat was gesehen" und die Zeit miteinander verknüpfen.

  • PIR Auslösezeit merken (millis), startet den 30 Sekunden Timer
  • LED 3 Stufen einschalten
  • innerhalb 30 Sekunden kein IR-Signal > LED aus
  • IF Signal gelesen > LEDs stufig einschalten

Soweit klar?

danke für die Antwort!

Ok verstanden habe ich es! Aber wie setzt man das um? ich habe erwähnen vergessen das das mein erstes Arduino Projekt ist!

muss ich die millis deklarieren? oder wie sieht das aus?

millis "laufen" automatisch los wenn der arduino gestartet wird. Brauchst nix machen.

Ich empfehle als Anfänger immer die Referenz (über die IDE direkt aufrufbar) und natürlich die mitgelieferten Beispiele.
Klassiker: BlinkwithoutDelay, da lernste gleich das richtige wie mit Zeit umgegangen wird.

Datentypen anschauen schadet auch nicht (boolean, integer, long integer, byte etc.)

Und das Projekt in kleine Stücke teilen und die auf die Beine stellen.

Und wenn Du dann hängenbleibst gibt's hier prima Hilfe. Auch bessere als meine, denn ich bin auch nicht der Profi sondern Freizeitprogrammierer und -bastler.

Schau mal, ob Dich das Beispiel in der IDE "Blink without delay" inspiriert.

LED an - delay - LED aus - delay funktioniert. Du möchtest nun aber während delay noch was machen, das geht nicht. Also Verzögerung mit millis realisieren, dann kannst Du nebenbei noch andere Dinge erledigen.

danke für euren Denkanstoß werde ich mit millis näher beschäftigen dann werd ich das auch sicher hinbekommen! wenns weiter geht melde ich mich wieder danke!

Hallo leute!

So nach langer Recherche und befassen mit blink ohne delay habe ich keine Ahnung wie ich das in meinem Projekt einbauen kann! Entweder übersehe ich was oder ich denke zu kompliziert! Könnt ihr mir bitte weiterhelfen? Steh voll am Schlauch!

Danke!

Um welche Funktionalität geht es denn, die Dir Kopfzerbrechen bereitet? Wie sieht Dein aktueller Sketch aus?

ich habe alles ganz oben reingeschrieben, bin noch kein stück weiter! alles was ich versucht habe hat nichts gebracht egal wo ich eine startet setze aber millis reinschreibe es funktioniert nichts!

Ich glaube, Du willst immer noch irgendwas direkt mit dem Begriff "millis" ersetzen; wenn dem so ist hast Du das Prinzip der Zeitsteuerung noch nicht begriffen.

Du musst Dir für Deinen Ablauf Zeitpunkte merken und dann schauen, ob innerhalb Deiner gesetzten Zeit was passiert. Und genau diese Zeitpunkte liefert die millis. Sonst nix.

Fang doch mal klein an und lass den Stripe nach Auslösen des PIR für 10 sek einschalten.

Ich habe den Beitrag eben erst gesehen.. und hätte einen alternativen Vorschlag:

Hole in China LED- Streifen mit ws2812 (5m ca. 30,-) und dazu eine Ultraschallsensor.
Der Ultraschallsensor kann einfach den Abstand von der Person zu einem Ende der Treppe messen und dann nur die entsprechenden LEDs einschalten die dem Abstand entsprechen.

Für diese Lösung mußt du nicht mir MS oder anderen für Anfänger komlizierten Dingen arbeiten.

Du mißt deinen Abstand in cm und sprichst die entsprechende LED an....

Danke!

Also, das ich eine Startzeit, eine wartezeit brauche weis ich aber wo ich das einfügen soll weis ich nicht oder wie ich das schreiben soll!
Ich stelle mirdas so vor:

Wenn pir ist high gehen stripe 1-3 an und wenn innerhalb von 30sec kein signal von der Lichtschranke kommt gehtn 3-1 wi der aus; oder wenn ein signal von der Lichtschranke kommt dann wird durchgeschaltet bis 16.

Sagt mal r ob ich mal in textform das gnze verstanden habe!

Und das mit ben ws2812 leds hab ich schon gehört aber da war schon alles in die Stiegen integriert!

Danke

Von Deinem Sketch ausgehend habe ich ein paar Änderungen vorgenommen, die hoffentlich in die Richtung gehen, wie Du Dir das vorgestellt hast. Den Praxistest muß ich Dir überlassen.

const unsigned int speed = 300;    // die Zeit wie schnell die Ausgänge von LOW->HIGH und HIGH->LOW wechseln
const byte inpinLso = 51;
const byte inpinLsu = 50;
const byte inpinPir = 49;
const byte led[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 44, 45, 46, 47 };    // Pin2 - 13 entsprechen led0 - led11, Pin44 - 47 entsprechen led12 - led15
const byte anzahl = sizeof(led);    // Bestimmt die Anzahl aller Pins -> Wichtig für for-schleife
const byte anzahlPirLeds = 3;
const unsigned int nachlaufZeit = speed * anzahl + 3000;
byte aktLedRauf = anzahl, aktLedRunter;
unsigned long aktMillis, anzeigeMillis, nachlaufMillis;
bool aktOben;     // Lichtschranke oben
bool altOben;     // Lichtschranke oben
bool aktUnten;    // Lichtschranke unten
bool altUnten;    // Lichtschranke unten
bool aktPir;      // Bewegungsmelder
bool altPir;      // Bewegungsmelder
bool aktBewegung; // Bewegung aktueller Zustand
bool altBewegung; // Bewegung alter Zustand
byte runter;   // ich gehe runter 0=ausschalten, 1=anschalten
byte rauf;     // ich gehe rauf   0=ausschalten, 1=anschalten, 2=drei anschalten

void setup() {
  pinMode (inpinLso, INPUT_PULLUP);    // Anschluss Pin51 als Eingang Lichtschranke oben
  pinMode (inpinLsu, INPUT_PULLUP);    // Anschluss Pin50 als Eingang Lichtschranke unten
  pinMode (inpinPir, INPUT_PULLUP);    // Anschluss Pin49 als Eingang PIR

  for ( int i = 0; i < anzahl; i++ )    // Deklariert alle "led" als Output
  {
    pinMode ( led[i], OUTPUT );
    digitalWrite ( led[i], LOW );    // Setzt alle "led" auf LOW
  }
  aktPir = digitalRead(inpinPir);      // Anschluss Pin49 als Eingang PIR
  altPir = aktPir;
  aktOben = digitalRead(inpinLso);     // Anschluss Pin51 als Eingang Lichtschranke oben
  altOben = aktOben;
  aktUnten = digitalRead(inpinLsu);    // Anschluss Pin50 als Eingang Lichtschranke unten
  altUnten = aktUnten;
}

void loop() {
  aktMillis = millis();
  aktPir = digitalRead(inpinPir);      // Anschluss Pin49 als Eingang PIR
  aktOben = digitalRead(inpinLso);     // Anschluss Pin51 als Eingang Lichtschranke oben
  aktUnten = digitalRead(inpinLsu);    // Anschluss Pin50 als Eingang Lichtschranke unten
  if (aktPir || aktOben || aktUnten) {
    nachlaufMillis = aktMillis;
    aktBewegung = true;
  }
  if (aktMillis - nachlaufMillis >= nachlaufZeit ) {
    aktBewegung = false;
  }
  if (altBewegung && !aktBewegung) {
    rauf = 0;
    aktLedRauf = 0;
    runter = 0;
    aktLedRunter = anzahl;
  }
  if (!altPir && aktPir && !aktOben && !aktUnten) {
    rauf = 2;
    aktLedRauf = 0;
  }
  if (!altUnten && aktUnten) {
    if (rauf == 0) aktLedRauf = 0;
    if (rauf == 2) aktLedRauf = anzahlPirLeds;
    rauf = 1;
  }
  if (!altOben && aktOben) {
    runter = 1;
    aktLedRunter = anzahl;
  }
  altBewegung = aktBewegung;
  altPir = aktPir;
  altOben = aktOben;
  altUnten = aktUnten;

  if ( aktMillis - anzeigeMillis >= speed ) {
    anzeigeMillis = aktMillis;
    if ((rauf == 2) && (aktLedRauf < anzahlPirLeds)) {
      digitalWrite(led[aktLedRauf], HIGH );
      aktLedRauf++;
    }
    if ((rauf != 2) && (aktLedRauf < anzahl)) {
      if (rauf == 1) digitalWrite(led[aktLedRauf], HIGH);
      if ((rauf == 0) && !aktBewegung) digitalWrite(led[aktLedRauf], LOW);
      aktLedRauf++;
    }
    if (aktLedRunter > 0) {
      aktLedRunter--;
      if (runter == 1) digitalWrite(led[aktLedRunter], HIGH);
      if ((runter == 0) && !aktBewegung) digitalWrite(led[aktLedRunter], LOW);
    }
  }
}

MaHa76:
Hole in China LED- Streifen mit ws2812 (5m ca. 30,-) und dazu eine Ultraschallsensor.

Wenn die LEDs nicht schon verbaut wären, würde ich Dir zustimmen, wobei ich eher zu APA102 tendieren würde, weil die sicherer anzusteuern sind. Da kann man schöne Muster mit machen, dazu gibt es ein anderes Thema, wobei der TO aber noch auf die LEDs wartet. Würde mich freuen, wenn Du Dich da einbringst.

Hinsichtlich der Logik ist es aber recht egal, welche LEDs man verbaut. Die Schwierigkeit liegt in der quasi Gleichzeitigkeit von Mustern.

Danke für die hilfe! Sieht sehr kompliziert aus so am handy display! Das ganze werde ich am abend mal auf meinen testaufbau spielem und mal testen! Danke

Danke agmue!

so ich habe ihn jetzt auf meine testschaltung gespielt und ich muss leider sagen das nur reagiert wird wenn pin50 auf high ist und das wars es geht nichts weiter egal was ich drücke es geht nicht aus auch nicht mit der eingestellten nachlaufzeit!

Kannst du mir Beschreibungen da zugeben denn ich kann es zwar erahnen was du da geschrieben hast aber wissen tu ich nicht bzw lernen kann ich da nicht viel! Danke!

Auf was für einem Arduino läßt Du das denn laufen?

Auf nem mega sonst hab ich nicht soviel pins zur verfügung die pwm können!

Bei mir habe ich das auch auf einem Mega2560 probiert, wollte nur sichergehen. An die Ausgänge habe ich einzelne LEDs, ich habe nur neun, gegen GND gehängt. Die Eingänge sind alle aktiv HIGH. Bei PIR auf HIGH gehen die ersten drei LEDs an. Nach einem Impuls des Sensors unten gehen alle weiteren LEDs an. Bei einem Impuls oben gehen die LEDs unabhängig vom PIR von oben nach unten (16 -> 1) an. Wenn alle Eingänge LOW sind, gehen nach der Nachlaufzeit die LEDs gleichzeitig von oben und unten aus.

So läuft es bei mir ab. Für den seriellen Monitor habe ich noch Testausgaben eingebaut:

 if ( aktMillis - anzeigeMillis >= speed ) {
    anzeigeMillis = aktMillis;
    Serial.print("rauf: "); Serial.print(rauf);
    Serial.print("  aktLedRauf: "); Serial.print(aktLedRauf);
    Serial.print("  runter: "); Serial.print(runter);
    Serial.print("  aktLedRunter: "); Serial.print(aktLedRunter);
    Serial.println();

Eigentlich sollte das bei Dir gemauso funktionieren. :slight_smile:

Ich glaub ich weis jetzt wo der hacken ist!
Den test aufbau hab ich mit tastern gemacht! Also die eingäne 49,50,51 sind im grunde auf LOW erst wenn ich den drücke kommt HIGH! Mein Ls ist so geschaltet das sie ein signal ausgibt wenn sie durchbrochen ist und mit dem steuere ich ein relais an das 5v in den arduino schickt!
Ich glaube da liegt der hund begraben!

Füge ich die serielle ausgabe am anfang von loop ein oder ins setup?

Achja an den tastern hab ich jeweils einen pulldown wiederstand gehängt!