Projekt Treppenbeleuchtung

Und poste doch auch mal den Link des verwendeten PIR.

versuch es mal so:

#define led_pin 3
#define Pir_Sensor 2
uint8_t fadeValue;
bool Pir_Sensor_val;
void setup() 
{
 // pinMode(Pir_Sensor,INPUT_PULLUP);

}

void loop()
{
     Pir_Sensor_val=digitalRead(Pir_Sensor);
     
     static uint32_t millisalt;
     const uint8_t dt=30;//Verögerungszeit
     if (Pir_Sensor_val&&millis()-millisalt>dt)  {fade_up(); millisalt=millis();}
     if (!Pir_Sensor_val&&millis()-millisalt>dt)  {fade_down();millisalt=millis();}
 }
void fade_up()
{
   if (fadeValue <255) fadeValue ++;
       analogWrite(led_pin, fadeValue);
  }

void fade_down()
{
   if (fadeValue >0)fadeValue --;
       analogWrite(led_pin, fadeValue);
       
  }

gregorss:
Aloha!

Ich verstehe nicht so richtig, was Du eigentlich möchtest und wie es funktionieren soll. Könntest Du nochmal kurz erklären, was Du möchtest, und aktuellen Code sowie Schaltplan dazu tun?

Gruß

Gregor

Ich möchte mit einem PIR sensor eine 5 Meter LEDkette ansteuern.

HotSystems:
Und poste doch auch mal den Link des verwendeten PIR.

Ich nutze “HC-SR501 Sensor Module”
Gekauft hier: Link!
Datenblatt: Link!

ardubu:
versuch es mal so:

#define led_pin 3

#define Pir_Sensor 2
uint8_t fadeValue;
bool Pir_Sensor_val;
void setup()
{
// pinMode(Pir_Sensor,INPUT_PULLUP);

}

void loop()
{
    Pir_Sensor_val=digitalRead(Pir_Sensor);
   
    static uint32_t millisalt;
    const uint8_t dt=30;//Verögerungszeit
    if (Pir_Sensor_val&&millis()-millisalt>dt)  {fade_up(); millisalt=millis();}
    if (!Pir_Sensor_val&&millis()-millisalt>dt)  {fade_down();millisalt=millis();}
}
void fade_up()
{
  if (fadeValue <255) fadeValue ++;
      analogWrite(led_pin, fadeValue);
 }

void fade_down()
{
  if (fadeValue >0)fadeValue --;
      analogWrite(led_pin, fadeValue);
     
 }

ardubu ich danke dir!
Habe versucht den Sketch zu verstehen aber, komme nicht so ganz klar.
Funktioniert super!

Wenn ich nun aber 4x PIR (HC-SR501) & 1x Lichtstärke Sensor (BH1750FVI) am Ende meines Projektes verwenden möchte, was ändert sich dann?


2x PIR soll 3M LED’s ansteuern (Treppe)
2x PIR soll 2M LED’s ansteuern (Flur)
1x Lichtstärke Sensor soll Helligkeit messen

Der geplante Ablauf der Schaltung soll in etwa so sein:
Wenn einer bzw beide PIR Sensoren eine Bewegung erkennt, dann soll die Helligkeit ermittelt werden und wenn dieser z.b unter 50 lux ist sollen die LED’s an gehen.

Datenblatt zum Lichtstärke Sensor: Link!

ich vermute mal du möchtest 2 x Pir-Sensor an der Treppe (oben und unten?) und 2 x Pir-Sensor im Flur (Anfang und Ende?) montieren. Wo soll der Licht-Sensor hin?

Wenn einer bzw beide PIR Sensoren eine Bewegung erkennt, dann soll die Helligkeit ermittelt werden und wenn dieser z.b unter 50 lux ist sollen die LED's an gehen.

Wann sollen die LED's wieder ausgehen? Wenn der Licht-Sensor z.B. im Flur sitzt und das Licht an ist, was soll passieren, wenn jetzt einer die Treppe runter will?

Richtig, die PIR Sensoren sollen genau so angebracht werden wie du es geschrieben hast.
Der Licht Sensor soll an den Anfang des Flures, wo eine Tür nach draußen ist und diesen Sensor wollte ich am Glas der Tür montieren.
Das schlimmste was passieren kann ist, dass das Licht auf der Treppe in der Nacht zu hell ist.

Kompliziert wird es jedoch um einiges mit dem Licht Sensor, da er im Flur bestimmen soll ob das Licht an geht und auf der Treppe welche Helligkeit das Licht hat.

Der Ablauf soll folgender sein (dies mal genauer) :
Ein PIR-Sensor erkennt eine Bewegung, der Licht Sensor wird aus dem standby geweckt, fragt die Helligkeit ab und speichert diesen in einer variable, der Wert wird verglichen
'Helligkeit<50" und wenn dies zutrifft geht im Flur das Licht an bzw. das Licht an der Treppe geht nur noch mit niedriger Helligkeit an.

Zum Verständnis:
Das Licht im Flur soll nur einschalten wenn es dunkel ist.
Das Licht an der Treppe kann auch tagsüber mit normaler Helligkeit einschalten, sollte jedoch abends/nachts nur mit niedriger Helligkeit einschalten.

Digital_Operator:
Wenn ich nun aber 4x PIR (HC-SR501) & 1x Lichtstärke Sensor (BH1750FVI) am Ende meines Projektes verwenden möchte, was ändert sich dann?

Basierend auf dem Vorschlag von #14 die Erweiterung mit Hilfe von Feldern:

const byte ledPin[2] = {3, 6};
const byte pirPin[2][2] = {{2, 4}, {5, 7}};
uint8_t fadeValue[2];
bool Pir_Sensor_val;

void setup()
{
  pinMode(ledPin[0], OUTPUT);
  pinMode(ledPin[1], OUTPUT);
  pinMode(pirPin[0][0], INPUT_PULLUP);
  pinMode(pirPin[1][0], INPUT_PULLUP);
  pinMode(pirPin[0][1], INPUT_PULLUP);
  pinMode(pirPin[1][1], INPUT_PULLUP);
}

void loop()
{
  bereich(0);
  bereich(1);
}
void bereich(byte ber) {
  Pir_Sensor_val = digitalRead(pirPin[ber][0]) || digitalRead(pirPin[ber][1]);
  static uint32_t millisalt[2];
  const uint8_t dt = 30; //Verögerungszeit
  if (Pir_Sensor_val && (millis() - millisalt[ber] > dt))  {
    millisalt[ber] = millis();
    fade_up(ber);
  }
  if (!Pir_Sensor_val && (millis() - millisalt[ber] > dt))  {
    millisalt[ber] = millis();
    fade_down(ber);
  }
}
void fade_up(byte b)
{
  if (fadeValue[b] < 255) fadeValue[b] ++;
  analogWrite(ledPin[b], fadeValue[b]);
}

void fade_down(byte b)
{
  if (fadeValue[b] > 0)fadeValue[b] --;
  analogWrite(ledPin[b], fadeValue[b]);
}

Ich hoffe, es hilft Dir weiter :slight_smile:

Die Auswertung der Helligkeit bekommst Du doch selbst hin, oder?

wenn ich mir die Beschreibung zu deinen Pir-Sensoren anschaue, sehe ich was von CDS (Photosensitiv Control), damit müsstest du dir den Lichtsensor eigentlich einsparen können.

Danke agmue, habe es noch nicht ausprobiert aber werde mich melden wenn ich weiß ob es funktioniert. Ich weiß leider nicht wie ich das Auswerten kann, da ich ganz neu mit Arduino und Programmieren bin.

ardubu, das habe ich auch gelesen aber ich wüsste nicht wie & wo.

ardubu:
wenn ich mir die Beschreibung zu deinen Pir-Sensoren anschaue, sehe ich was von CDS (Photosensitiv Control), damit müsstest du dir den Lichtsensor eigentlich einsparen können.

Ich fürchte, diese Option ist nicht bestückt, siehe Oval:
pir.png

BH1750 Digital Light Sensor Supply voltage : prefer to use 3.3 V to communicate with , Not 5V TTL Logic (Quelle)

Das sieht doch ganz entspannt aus (Quelle): uint16_t lux = LightSensor.GetLightIntensity();// Get Lux value

 const byte ledPin[2] = {3, 6};
const byte pirPin[2][2] = {{2, 4}, {5, 7}};
uint8_t fadeValue[2];
bool Pir_Sensor_val;

void setup()
{
  pinMode(ledPin[0], OUTPUT);
  pinMode(ledPin[1], OUTPUT);
  pinMode(pirPin[0][0], INPUT_PULLUP);
  pinMode(pirPin[1][0], INPUT_PULLUP);
  pinMode(pirPin[0][1], INPUT_PULLUP);
  pinMode(pirPin[1][1], INPUT_PULLUP);
}

void loop()
{
  bereich(0);
  bereich(1);
}
void bereich(byte ber) {
  Pir_Sensor_val = digitalRead(pirPin[ber][0]) || digitalRead(pirPin[ber][1]);
  static uint32_t millisalt[2];
  const uint8_t dt = 30; //Verögerungszeit
  if (Pir_Sensor_val && (millis() - millisalt[ber] > dt))  {
    millisalt[ber] = millis();
    fade_up(ber);
  }
  if (!Pir_Sensor_val && (millis() - millisalt[ber] > dt))  {
    millisalt[ber] = millis();
    fade_down(ber);
  }
}
void fade_up(byte b)
{
  if (fadeValue[b] < 255) fadeValue[b] ++;
  analogWrite(ledPin[b], fadeValue[b]);
}

void fade_down(byte b)
{
  if (fadeValue[b] > 0)fadeValue[b] --;
  analogWrite(ledPin[b], fadeValue[b]);
}

Kann mir bitte jemand diesen Sketch erklären?
Am besten mit “// Funktion” also auskommentiert.

Kann mir bitte jemand diesen Sketch erklären?

Wenn min. einer von 2 PIR Sensoren HIGH liefert, geht die LED an, sonst geht sie aus. An- und ausgehen wird "gefadet" ( 255*30 ms = 7,6 sec zwischen voll aus und an, in beide Richtungen)

Das ganze 2 Mal, also 2 * (1 LED und 2 Sensoren), die komplett unabhängig voneinander arbeiten.

Agmue oder ardubu, kann mir einer von euch die genauere Funktionsweise erklären?

vielleicht verstehst du es so besser

const byte ledPin[2] = {3, 6}; //Zuweisung der Pin's für die Led-Stripes, const weil es eine Konstante ist
const byte pirPin[2][2] = {{2, 4}, {5, 7}};// Zuweisung der Pin's für die Pir-Sensoren
uint8_t fadeValue[2]; //Wert als vorzeichenlosen 8-bit Wert deklarieren, als Array mit 2 Werten
bool Pir_Sensor_val; // Staus des momentanen der Pir-Sensoren als boolsche Variable

void setup()
{
  pinMode(ledPin[0], OUTPUT);
  pinMode(ledPin[1], OUTPUT);
  pinMode(pirPin[0][0], INPUT_PULLUP);//pin als Input mit internem Pullup-Widerstand
  pinMode(pirPin[1][0], INPUT_PULLUP);
  pinMode(pirPin[0][1], INPUT_PULLUP);
  pinMode(pirPin[1][1], INPUT_PULLUP);
}

void loop()
{
  bereich(0);//Aufruf der Funktion bereich mit dem Übergabewert 0
  bereich(1);//Aufruf der Funktion bereich mit dem Übergabewert 1
}
void bereich(byte ber) {//Funktion bereich
  Pir_Sensor_val = digitalRead(pirPin[ber][0]) || digitalRead(pirPin[ber][1]);//der Variablen Pir_Sensor_val den Wert der Pir-Sensoren übergeben
  static uint32_t millisalt[2];//Wert als vorzeichenlosen 32-bit Wert deklarieren
  const uint8_t dt = 30; //Verögerungszeit Wert als vorzeichenlosen 8-bit Wert deklarieren und auf 30ms setzen
  if (Pir_Sensor_val == HIGH && (millis() - millisalt[ber] > dt))  {
    millisalt[ber] = millis();
    fade_up(ber);Funktion fade_up aufrufen mit der Übergabe von ber
  }
  if (!Pir_Sensor_val && (millis() - millisalt[ber] > dt))  {//s.o.
    millisalt[ber] = millis();
    fade_down(ber);
  }
}
void fade_up(byte b)//Funktion fade_up, bei der ein Wert übergeben wird
{
  if (fadeValue[b] < 255) fadeValue[b] ++;
  analogWrite(ledPin[b], fadeValue[b]);
}

void fade_down(byte b)//Funktion fade_up
{
  if (fadeValue[b] > 0)fadeValue[b] --;
  analogWrite(ledPin[b], fadeValue[b]);
}

ardubu: vielleicht verstehst du es so besser

Schöne Kommentare, also ich habe es verstanden ;)

Ich habe die symbolischen Konstanten "FLUR" und "Treppe" zwecks Verdeutlichung ergänzt (ungetestet):

enum Bereich {FLUR, TREPPE};
const byte ledPin[2] = {3, 6}; //Zuweisung der Pin's für die Led-Stripes, const weil es eine Konstante ist
const byte pirPin[2][2] = {{2, 4}, {5, 7}}; // Zuweisung der Pin's für die Pir-Sensoren
uint8_t fadeValue[2]; //Wert als vorzeichenlosen 8-bit Wert deklarieren, als Array mit 2 Werten
bool Pir_Sensor_val; // Staus des momentanen der Pir-Sensoren als boolsche Variable

void setup()
{
  pinMode(ledPin[FLUR], OUTPUT);
  pinMode(ledPin[TREPPE], OUTPUT);
  pinMode(pirPin[FLUR][0], INPUT_PULLUP);//pin als Input mit internem Pullup-Widerstand
  pinMode(pirPin[TREPPE][0], INPUT_PULLUP);
  pinMode(pirPin[FLUR][1], INPUT_PULLUP);
  pinMode(pirPin[TREPPE][1], INPUT_PULLUP);
}

void loop()
{
  bereich(FLUR);//Aufruf der Funktion bereich mit dem Übergabewert 0
  bereich(TREPPE);//Aufruf der Funktion bereich mit dem Übergabewert 1
}
const byte ledPin[2] = {3, 6};
const byte pirPin[2][2] = {{2, 4}, {5, 7}};
uint8_t fadeValue[2];
bool Pir_Sensor_val;

void setup()
{
  pinMode(ledPin[0], OUTPUT);
  pinMode(ledPin[1], OUTPUT);
  pinMode(pirPin[0][0], INPUT_PULLUP);
  pinMode(pirPin[1][0], INPUT_PULLUP);
  pinMode(pirPin[0][1], INPUT_PULLUP);
  pinMode(pirPin[1][1], INPUT_PULLUP);
}

void loop()
{
  bereich(0);
  bereich(1);
}
void bereich(byte ber) {
  Pir_Sensor_val = digitalRead(pirPin[ber][0]) || digitalRead(pirPin[ber][1]);
  static uint32_t millisalt[2];
  const uint8_t dt = 30; //Verögerungszeit
  if (Pir_Sensor_val && (millis() - millisalt[ber] > dt))  {
    millisalt[ber] = millis();
    fade_up(ber);
  }
  if (!Pir_Sensor_val && (millis() - millisalt[ber] > dt))  {
    millisalt[ber] = millis();
    fade_down(ber);
  }
}
void fade_up(byte b)
{
  if (fadeValue[b] < 255) fadeValue[b] ++;
  analogWrite(ledPin[b], fadeValue[b]);
}

void fade_down(byte b)
{
  if (fadeValue[b] > 0)fadeValue[b] --;
  analogWrite(ledPin[b], fadeValue[b]);
}

Dieser Sketch funktioniert einwandfrei, könnte mir bitte jemand helfen den Lichtsensor, welchen ich weiter vorne im Beitrag genannt habe im Sketch einzufügen?

Ich möchte es gerne so einrichten, wenn eine Bewegung von einem PIR Sensor erkannt wurde, dann wird der Licht Sensor aufgeweckt und die Licht Intensität abgefragt und in eine variable geschrieben, eine weitere Zeile fragt ab ob dieser Wert unter 3 ist und wenn dies so ist dann schalten sich die LEDs erst an.
Das möchte ich gerne einbauen, damit das Licht nur nachts angeht.

Vielen Dank für euere bisherige Hilfe!
Danke nochmal im voraus!

Digital_Operator: ... den Lichtsensor ...

Welcher Lichtsensor ist wo angeschlossen? Ich kann nicht auf Deinen Schreibtisch schauen.

Datenblatt zum Lichtstärke Sensor: Link!

Diesen Lichtsensor möchte ich gerne zu dem Sketch hinzufügen. Er soll im Standby sein solange kein PIR Sensor etwas erkennt, wenn etwas erkannt wird dann soll er aus aus dem standby aufwachen und die Licht Intensität in eine variable schreiben und sich anschließend wieder in den standby begeben. Die variable wird später ausgelesen und wenn der Wert unter 3 (lux) ist dann sollen sich die LEDs einschalten, ansonsten bleiben sie aus.

Digital_Operator: Datenblatt zum Lichtstärke Sensor: Link!

Was ganz edles! Also I2C als Schnittstelle? Hast Du eine Bibliothek dazu?

Ich würde mich gerne an dieser Anleitung orientieren, hier ist auch ein link zu eine Libary angegeben. Anleitung Hier nochmal der link aus der der Anleitung: Libary

Digital_Operator:
… und sich anschließend wieder in den standby begeben.

Warum, mußt Du Strom sparen?

Als Einstieg (ungetestet):

digitalWrite(13, helligkeit());
...
bool helligkeit()
{
  uint16_t lux = LightSensor.GetLightIntensity();// Get Lux value
  if(lux < 3) { return true; } else { return false; }
}