Treppenhausbeleuchtung mit PIR- Sensoren und lm393 Dämmerungsschalter

Hi,

Ich habe eine Treppenhausbeleuchtung mit 4 PIR- Sensoren und einem Dämmerungsschalter realisiert. 2 PIR- Sensoren ist jeweils eine einzelne Lampe zugeordnet und die beiden anderen PIR- Sensoren teilen sich eine Lampe.

Hier ist der Schaltplan:

Hier ist der Sketch:

//Die Zeit, die die Lampen leuchten wird nicht über Software gesteuert, sondern über das rechte Potentiometer der PIR- Sensoren
// Software /Entprellzeit für HIGH - Zustände der PIR Sensoren hinzugefügt, weil bei einer sehr geringen Haltezeit des HIGH Zustandes (rechtes Potentiometer) der PIR Sensor mehrfach kurz hintereinander ein HIGH meldet
// Software / Entprellzeit für HIGH- Zustand des Dämmerungsschalter, das Entprellen funktioniert noch nicht so richtig


//LM393 Dämmerungsschalter/ Potentiometer
//nach rechts drehen = weniger Licht erforderlich, damit die Beleuchtung aktivert wird
//d.h. die Beleuchtung ist aktivert wenn es noch relativ hell ist

//nach links drehen = mehr Licht erforderlich, damit die Beleuchtung aktiviert wird
// d.h. die Beleuchtung ist deaktivert wenn es noch relativ hell ist


// PIR- Sensor /Potentiometer
//linkes Potentiometer = Empfindlichkeit
//nach links drehen = geringer / Minimum = 3m
//nach rechts drehen = höher / Maximum = 7m

//rechtes Potentiometer = Haltezeit des HIGH- Signals des Output- Kanal / kann je nach Hersteller variieren
//nach links drehen = geringer / Minimum = 5 Sekunden
//nach rechts drehen = höher / Maximum = 300 Sekunden

// gelöste Probleme: Lampe 3 blinkt manchmal und manchmal nicht/ sehr regelmäßig / am PIR Sensor Kabel liegt es nicht und auch nicht am PIR- Sensor, habe beides überprüft
// Das Blinken der Lampe lag an der Glühbirne (es war eine spezielle Glühbirne mit 4 LED Stripes, die eine Glühfadenlampe imitieren wollte
// Bei Lampe 3 war außerdem der PIR - Sensor defekt, er hat nur sehr selten / nicht zuverlässig ausgelöst

boolean dark = false; // Zwischenvariable deklarieren
boolean active_1 = false; // Zwischenvariable deklarieren
boolean active_2 = false; // Zwischenvariable deklarieren
boolean active_3 = false; // Zwischenvariable deklarieren
boolean active_4 = false; // Zwischenvariable deklarieren
boolean active_5 = false; // Zwischenvariable deklarieren

int DaemmerungsSensor = 10; // Daemmerungssensor an Pin 10
int pin_1 = 6; // PIR- Sensor 1 festlegen // Ernst Werkstatt
int pin_2 = 7; // PIR- Sensor 2 festlegen // Treppenhaus
int pin_3 = 8; // PIR- Sensor 3 festlegen // Maya und Leon
int pin_4 = 9; // PIR- Sensor 4 festlegen // Lina

const int RELAY_PIN_1 = 2;   // Relais 1 festlegen // Ernst Werkstatt
const int RELAY_PIN_2 = 3;   // Relais 2 festlegen // Treppenhaus
const int RELAY_PIN_3 = 4;   // Relais 3 festlegen // Maya und Leon
const int RELAY_PIN_4 = 5;   // Relais 4 festlegen // Lina

boolean Beleuchtung = false;
unsigned long lastTriggerTime_5 = 0; // Entprellzeitmerker
const unsigned long debounceTime_5 = 2000;  // Entprellzeit in Millisekunden

int movement_1 = 0;
unsigned long lastTriggerTime_1 = 0; // Entprellzeitmerker
const unsigned long debounceTime_1 = 2000;  // Entprellzeit in Millisekunden

int movement_2 = 0;
unsigned long lastTriggerTime_2 = 0; // Entprellzeitmerker
const unsigned long debounceTime_2 = 2000;  // Entprellzeit in Millisekunden

int movement_3 = 0;
unsigned long lastTriggerTime_3 = 0; // Entprellzeitmerker
const unsigned long debounceTime_3 = 2000;  // Entprellzeit in Millisekunden

int movement_4 = 0;
unsigned long lastTriggerTime_4 = 0; // Entprellzeitmerker
const unsigned long debounceTime_4 = 2000;  // Entprellzeit in Millisekunden

void setup() {
  pinMode(DaemmerungsSensor, INPUT); // Daemmerungssensor als Input festlegen
  pinMode(pin_1, INPUT); // Pin1 als Input festlegen
  pinMode(pin_2, INPUT); // Pin2 als Input festlegen
  pinMode(pin_3, INPUT); // Pin3 als Input festlegen
  pinMode(pin_4, INPUT); // Pin4 als Input festlegen
  pinMode(RELAY_PIN_1, OUTPUT);
  pinMode(RELAY_PIN_2, OUTPUT);
  pinMode(RELAY_PIN_3, OUTPUT);
  pinMode(RELAY_PIN_4, OUTPUT);
  digitalWrite(RELAY_PIN_1, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_2, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_3, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_4, HIGH);  // Relais AUS bei Start
  Serial.begin(9600); // Serieller Monitor bei einer Baudrate von 9600
  Serial.println("Arduino wird hochgefahren");
}

void loop()
{
  unsigned long now = millis();

  dark = digitalRead(DaemmerungsSensor); // Daemmerungssensor auslesen
  movement_1 = digitalRead(pin_1); // Sensor auslesen
  movement_2 = digitalRead(pin_2); // Sensor auslesen
  movement_3 = digitalRead(pin_3); // Sensor auslesen
  movement_4 = digitalRead(pin_4); // Sensor auslesen

  // Wenn die Lichtschwelle neu überschritten wurde wurde(DaemmerungsSensor HIGH)und nicht in Entprellzeit

  if (dark == HIGH && !active_5 && now - lastTriggerTime_5 > debounceTime_5) {
    active_5 = true;
    lastTriggerTime_5 = now;
    Beleuchtung = false;
    Serial.println("Lichtschwelle überschritten / Beleuchtung deaktiviert");
  }

  // Lichtschwelle unterschritten bevor sie überschritten war(Sensor LOW)
  if (dark == LOW && active_5 == true) {
    active_5 = false;
    Beleuchtung = true;
    Serial.println("Lichtschwelle unterschritten / Beleuchtung aktiviert");
  }

  // nur wenn Beleuchtung aktiviert
  if (Beleuchtung) {
    // eine neue Bewegung wurde erkannt (PIR- Sensor HIGH) und nicht in Entprellzeit


    if (movement_1 == HIGH && !active_1 && now - lastTriggerTime_1 > debounceTime_1) {
      active_1 = true;
      lastTriggerTime_1 = now;
      Serial.println("Bewegung_1 erkannt / Lampe_1 ein");
    }

    // keine Bewegung nachdem eine Bewegung erkannt wurde(Sensor wieder LOW)
    if (movement_1 == LOW && active_1 == true) {
      active_1 = false;
      Serial.println("Keine Bewegung_1 / Lampe_1 aus");
    }


    // eine neue Bewegung wurde erkannt (Sensor HIGH) und nicht in Entprellzeit
    if (movement_2 == HIGH && !active_2 && now - lastTriggerTime_2 > debounceTime_2) {
      active_2 = true;
      lastTriggerTime_2 = now;
      Serial.println("Bewegung_2 erkannt / Lampe_2 ein");
    }

    // keine Bewegung nachdem eine Bewegung erkannt wurde(Sensor wieder LOW)
    if (movement_2 == LOW && active_2 == true) {
      active_2 = false;
      Serial.println("Keine Bewegung_2 / Lampe_2 aus");
    }

    // pin_1 und pin_2 teilen sich zusammen Lampe_1
    // deshalb: Relaissteuerung: mindestens ein Sensor aktiv → Lampe AN
    if (active_1 || active_2) {
      digitalWrite(RELAY_PIN_1, LOW); // Lampe ein
    } else {
      digitalWrite(RELAY_PIN_1, HIGH); // Lampe aus
    }


    // eine neue Bewegung wurde erkannt (Sensor HIGH) und nicht in Entprellzeit
    if (movement_3 == HIGH && !active_3 && now - lastTriggerTime_3 > debounceTime_3) {
      active_3 = true;
      lastTriggerTime_3 = now;
      digitalWrite(RELAY_PIN_3, LOW);      // Lampe_3 an
      Serial.println("Bewegung_3 erkannt / Lampe_3 ein");
    }

    // keine Bewegung nachdem eine Bewegung erkannt wurde(Sensor wieder LOW)
    if (movement_3 == LOW && active_3 == true) {
      active_3 = false;
      digitalWrite(RELAY_PIN_3, HIGH);      // Lampe_3 aus
      Serial.println("Keine Bewegung_3 / Lampe_3 aus");
    }


    // eine neue Bewegung wurde erkannt (Sensor HIGH) und nicht in Entprellzeit
    if (movement_4 == HIGH && !active_4 && now - lastTriggerTime_4 > debounceTime_4) {
      active_4 = true;
      lastTriggerTime_4 = now;
      digitalWrite(RELAY_PIN_4, LOW);      // Lampe_4 an
      Serial.println("Bewegung erkannt_4 / Lampe_4 ein");
    }

    // keine Bewegung nachdem eine Bewegung erkannt wurde(Sensor wieder LOW)
    if (movement_4 == LOW && active_4 == true) {
      active_4 = false;
      digitalWrite(RELAY_PIN_4, HIGH);      // Lampe_4 aus
      Serial.println("Keine Bewegung_4 / Lampe_4 aus");
    }
  }
}

Das Entprellen des Dämmerungsschalters funktioniert leider noch nicht richtig:

Im seriellen Monitor wechseln sich folgende Zeilen innerhalb kürzester Zeit ab:
13:02:37.991 -> Lichtschwelle überschritten / Beleuchtung deaktiviert
13:02:38.038 -> Lichtschwelle unterschritten / Beleuchtung aktiviert
13:02:39.972 -> Lichtschwelle überschritten / Beleuchtung deaktiviert

Wie lässt sich dieser kleine Schönheitsfehler beheben?
Wenn Ihr ansonsten noch Verbesserungsvorschläge habt, lasst es mich gerne wissen.

LG Leonardo

Dein Sensor ist doch reine Elektronik, da brauchst du nichts entprellen, weil nichts prellt.
Du meinst sicher, da muss eine Hysterese eingebaut werden ?

Bei den PIR- Sensoren habe ich tatsächlich festgestellt, dass das Entprellen nötig ist, weil bei einer sehr geringen Haltezeit des HIGH Zustandes (rechtes Potentiometer des PIR Sensors) mehrfach kurz hintereinander ein HIGH gemeldet wird und das Licht dann an, aus und wieder an geht. Das hat man auch im seriellen Monitor gesehen. Nach dem Entprellen war dieses Problem behoben.

Das selbe Entprellen - Prinzip hat beim Dämmerungsschalter aber nicht funktioniert.

Versuche es mal so:

//Die Zeit, die die Lampen leuchten wird nicht über Software gesteuert, sondern über das rechte Potentiometer der PIR- Sensoren
// Software /Entprellzeit für HIGH - Zustände der PIR Sensoren hinzugefügt, weil bei einer sehr geringen Haltezeit des HIGH Zustandes (rechtes Potentiometer) der PIR Sensor mehrfach kurz hintereinander ein HIGH meldet
// Software / Entprellzeit für HIGH- Zustand des Dämmerungsschalter, das Entprellen funktioniert noch nicht so richtig


//LM393 Dämmerungsschalter/ Potentiometer
//nach rechts drehen = weniger Licht erforderlich, damit die Beleuchtung aktivert wird
//d.h. die Beleuchtung ist aktivert wenn es noch relativ hell ist

//nach links drehen = mehr Licht erforderlich, damit die Beleuchtung aktiviert wird
// d.h. die Beleuchtung ist deaktivert wenn es noch relativ hell ist


// PIR- Sensor /Potentiometer
//linkes Potentiometer = Empfindlichkeit
//nach links drehen = geringer / Minimum = 3m
//nach rechts drehen = höher / Maximum = 7m

//rechtes Potentiometer = Haltezeit des HIGH- Signals des Output- Kanal / kann je nach Hersteller variieren
//nach links drehen = geringer / Minimum = 5 Sekunden
//nach rechts drehen = höher / Maximum = 300 Sekunden

// gelöste Probleme: Lampe 3 blinkt manchmal und manchmal nicht/ sehr regelmäßig / am PIR Sensor Kabel liegt es nicht und auch nicht am PIR- Sensor, habe beides überprüft
// Das Blinken der Lampe lag an der Glühbirne (es war eine spezielle Glühbirne mit 4 LED Stripes, die eine Glühfadenlampe imitieren wollte
// Bei Lampe 3 war außerdem der PIR - Sensor defekt, er hat nur sehr selten / nicht zuverlässig ausgelöst

boolean dark = false; // Zwischenvariable deklarieren
boolean active_1 = false; // Zwischenvariable deklarieren
boolean active_2 = false; // Zwischenvariable deklarieren
boolean active_3 = false; // Zwischenvariable deklarieren
boolean active_4 = false; // Zwischenvariable deklarieren
boolean active_5 = false; // Zwischenvariable deklarieren

int DaemmerungsSensor = 10; // Daemmerungssensor an Pin 10
int pin_1 = 6; // PIR- Sensor 1 festlegen // Ernst Werkstatt
int pin_2 = 7; // PIR- Sensor 2 festlegen // Treppenhaus
int pin_3 = 8; // PIR- Sensor 3 festlegen // Maya und Leon
int pin_4 = 9; // PIR- Sensor 4 festlegen // Lina

const int RELAY_PIN_1 = 2;   // Relais 1 festlegen // Ernst Werkstatt
const int RELAY_PIN_2 = 3;   // Relais 2 festlegen // Treppenhaus
const int RELAY_PIN_3 = 4;   // Relais 3 festlegen // Maya und Leon
const int RELAY_PIN_4 = 5;   // Relais 4 festlegen // Lina

boolean Beleuchtung = false;
unsigned long lastTriggerTime_5 = 0; // Entprellzeitmerker
const unsigned long debounceTime_5 = 2000;  // Entprellzeit in Millisekunden

int movement_1 = 0;
unsigned long lastTriggerTime_1 = 0; // Entprellzeitmerker
const unsigned long debounceTime_1 = 2000;  // Entprellzeit in Millisekunden

int movement_2 = 0;
unsigned long lastTriggerTime_2 = 0; // Entprellzeitmerker
const unsigned long debounceTime_2 = 2000;  // Entprellzeit in Millisekunden

int movement_3 = 0;
unsigned long lastTriggerTime_3 = 0; // Entprellzeitmerker
const unsigned long debounceTime_3 = 2000;  // Entprellzeit in Millisekunden

int movement_4 = 0;
unsigned long lastTriggerTime_4 = 0; // Entprellzeitmerker
const unsigned long debounceTime_4 = 2000;  // Entprellzeit in Millisekunden

void setup() {
  pinMode(DaemmerungsSensor, INPUT); // Daemmerungssensor als Input festlegen
  pinMode(pin_1, INPUT); // Pin1 als Input festlegen
  pinMode(pin_2, INPUT); // Pin2 als Input festlegen
  pinMode(pin_3, INPUT); // Pin3 als Input festlegen
  pinMode(pin_4, INPUT); // Pin4 als Input festlegen
  pinMode(RELAY_PIN_1, OUTPUT);
  pinMode(RELAY_PIN_2, OUTPUT);
  pinMode(RELAY_PIN_3, OUTPUT);
  pinMode(RELAY_PIN_4, OUTPUT);
  digitalWrite(RELAY_PIN_1, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_2, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_3, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_4, HIGH);  // Relais AUS bei Start
  Serial.begin(9600); // Serieller Monitor bei einer Baudrate von 9600
  Serial.println("Arduino wird hochgefahren");
}

void loop() {
  unsigned long now = millis();

  dark = digitalRead(DaemmerungsSensor); // Daemmerungssensor auslesen
  movement_1 = digitalRead(pin_1); // Sensor auslesen
  movement_2 = digitalRead(pin_2); // Sensor auslesen
  movement_3 = digitalRead(pin_3); // Sensor auslesen
  movement_4 = digitalRead(pin_4); // Sensor auslesen

  if (movement_1 == HIGH) {
	Serial.println("Bewegung_1 erkannt");
	if (dark == LOW) {             // Nur wenn dunkel
	  digitalWrite(RELAY_PIN_1, LOW); // Lampe ein
      Serial.println("Lampe_1 ein");
	}  
  } else {
	digitalWrite(RELAY_PIN_1, HIGH); // Lampe aus
    Serial.println("Keine Bewegung_1 / Lampe_1 aus");
  }    
}
1 Like

Dann haben die einen Fehler, aber Prellen ist es nicht.
Prellen gibt es bei mechanischen Kontakten, Taster oder Relais, nicht aber bei Elektronik.
Da ist dann in der Schaltung etwas faul, bzw. muss das mit einer Hysterese ausgebügelt werden.

1 Like

Ich habe noch ein Problem bei meinem Sketch in post#1 festgestellt. Wenn der Output des Dämmerungssensors (HIGH oder LOW) wechselt während ein Relais eingeschaltet ist, dann schaltet das Relais nach diesem Wechsel nicht mehr aus.

Das funktioniert gut so. Ich werde mein Entprell- Prinzip entfernen und deine Struktur übernehmen. Dankeschön! :slight_smile:

1 Like

Ich habe Deine Struktur übernommen und die Outputs von 2 PIR-Sensoren (movement_1 und movement_2) für eine Lampensteuerung genutzt.
Ich probiere jetzt auch mal aus ob es funktioniert.

//Die Zeit, die die Lampen leuchten wird nicht über Software gesteuert, sondern über das rechte Potentiometer der PIR- Sensoren
// Software /Entprellzeit für HIGH - Zustände der PIR Sensoren hinzugefügt, weil bei einer sehr geringen Haltezeit des HIGH Zustandes (rechtes Potentiometer) der PIR Sensor mehrfach kurz hintereinander ein HIGH meldet
// Software / Entprellzeit für HIGH- Zustand des Dämmerungsschalter, das Entprellen funktioniert noch nicht so richtig


//LM393 Dämmerungsschalter/ Potentiometer
//nach rechts drehen = weniger Licht erforderlich, damit die Beleuchtung aktivert wird
//d.h. die Beleuchtung ist aktivert wenn es noch relativ hell ist

//nach links drehen = mehr Licht erforderlich, damit die Beleuchtung aktiviert wird
// d.h. die Beleuchtung ist deaktivert wenn es noch relativ hell ist


// PIR- Sensor /Potentiometer
//linkes Potentiometer = Empfindlichkeit
//nach links drehen = geringer / Minimum = 3m
//nach rechts drehen = höher / Maximum = 7m

//rechtes Potentiometer = Haltezeit des HIGH- Signals des Output- Kanal / kann je nach Hersteller variieren
//nach links drehen = geringer / Minimum = 5 Sekunden
//nach rechts drehen = höher / Maximum = 300 Sekunden

// gelöste Probleme: Lampe 3 blinkt manchmal und manchmal nicht/ sehr regelmäßig / am PIR Sensor Kabel liegt es nicht und auch nicht am PIR- Sensor, habe beides überprüft
// Das Blinken der Lampe lag an der Glühbirne (es war eine spezielle Glühbirne mit 4 LED Stripes, die eine Glühfadenlampe imitieren wollte
// Bei Lampe 3 war außerdem der PIR - Sensor defekt, er hat nur sehr selten / nicht zuverlässig ausgelöst

boolean dark = false; // Zwischenvariable deklarieren
boolean active_1 = false; // Zwischenvariable deklarieren
boolean active_2 = false; // Zwischenvariable deklarieren
boolean active_3 = false; // Zwischenvariable deklarieren
boolean active_4 = false; // Zwischenvariable deklarieren
boolean active_5 = false; // Zwischenvariable deklarieren

int DaemmerungsSensor = 10; // Daemmerungssensor an Pin 10
int pin_1 = 6; // PIR- Sensor 1 festlegen // Ernst Werkstatt
int pin_2 = 7; // PIR- Sensor 2 festlegen // Treppenhaus
int pin_3 = 8; // PIR- Sensor 3 festlegen // Maya und Leon
int pin_4 = 9; // PIR- Sensor 4 festlegen // Lina

const int RELAY_PIN_1 = 2;   // Relais 1 festlegen // Ernst Werkstatt
const int RELAY_PIN_2 = 3;   // Relais 2 festlegen // Treppenhaus
const int RELAY_PIN_3 = 4;   // Relais 3 festlegen // Maya und Leon
const int RELAY_PIN_4 = 5;   // Relais 4 festlegen // Lina

int movement_1 = 0;
int movement_2 = 0;
int movement_3 = 0;
int movement_4 = 0;


void setup() {
  pinMode(DaemmerungsSensor, INPUT); // Daemmerungssensor als Input festlegen
  pinMode(pin_1, INPUT); // Pin1 als Input festlegen
  pinMode(pin_2, INPUT); // Pin2 als Input festlegen
  pinMode(pin_3, INPUT); // Pin3 als Input festlegen
  pinMode(pin_4, INPUT); // Pin4 als Input festlegen
  pinMode(RELAY_PIN_1, OUTPUT);
  pinMode(RELAY_PIN_2, OUTPUT);
  pinMode(RELAY_PIN_3, OUTPUT);
  pinMode(RELAY_PIN_4, OUTPUT);
  digitalWrite(RELAY_PIN_1, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_2, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_3, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_4, HIGH);  // Relais AUS bei Start
  Serial.begin(9600); // Serieller Monitor bei einer Baudrate von 9600
  Serial.println("Arduino wird hochgefahren");
}

void loop() {
  unsigned long now = millis();

  dark = digitalRead(DaemmerungsSensor); // Daemmerungssensor auslesen
  movement_1 = digitalRead(pin_1); // Sensor auslesen
  movement_2 = digitalRead(pin_2); // Sensor auslesen
  movement_3 = digitalRead(pin_3); // Sensor auslesen
  movement_4 = digitalRead(pin_4); // Sensor auslesen


//Lampe_1
  if (movement_1 == HIGH || movement_2 == HIGH) {
  Serial.println("Bewegung_1 oder Bewegung_2 erkannt");
  if (dark == LOW) {             // Nur wenn dunkel
    digitalWrite(RELAY_PIN_1, LOW); // Lampe_1 ein
      Serial.println("Lampe_1 ein");
  }  
  } else {
  digitalWrite(RELAY_PIN_1, HIGH); // Lampe_1 aus
    Serial.println("Keine Bewegung_1 / Lampe_1 aus");
  }

  
//Lampe_3
  if (movement_3 == HIGH) {
  Serial.println("Bewegung_3 erkannt");
  if (dark == LOW) {             // Nur wenn dunkel
    digitalWrite(RELAY_PIN_3, LOW); // Lampe_3 ein
      Serial.println("Lampe_3 ein");
  }  
  } else {
  digitalWrite(RELAY_PIN_3, HIGH); // Lampe_3 aus
    Serial.println("Keine Bewegung_3 / Lampe_3 aus");
  } 


//Lampe_4
  if (movement_4 == HIGH) {
  Serial.println("Bewegung_4 erkannt");
  if (dark == LOW) {             // Nur wenn dunkel
    digitalWrite(RELAY_PIN_4, LOW); // Lampe_4 ein
      Serial.println("Lampe_4 ein");
  }  
  } else {
  digitalWrite(RELAY_PIN_4, HIGH); // Lampe_4 aus
    Serial.println("Keine Bewegung_4 / Lampe_4 aus");
  } 
}

Was mir an diesem Sketch leider jetzt überhaupt nicht gefällt, ist dass sich die Ausgaben im seriellen Monitor überschlagen, kann man das irgendwie anders lösen?

Ja, das war ja nur zum debuggen. Man muss sich den alten Zustand merken und nur bei Änderung ausgeben. Vielleicht komme ich heute abend dazu.

Du meinst so oder:

// eine neue Bewegung wurde erkannt (Sensor HIGH) und nicht in Entprellzeit
  if (movement_1 == HIGH && !active_1) {
     // Serial.println("Bewegung_1 erkannt"); // ausklammern, sonst erscheint es immer wieder im seriellen Monitor
      if (dark == LOW) {             // Nur wenn dunkel
    active_1 = true;
    digitalWrite(RELAY_PIN_1, LOW);      // Lampe_1 an
    Serial.println("Lampe_1 ein");
  }
   }

  // keine Bewegung nachdem eine Bewegung erkannt wurde(Sensor wieder LOW)
  if (movement_1 == LOW && active_1 == true) {
    active_1 = false;
    digitalWrite(RELAY_PIN_1, HIGH);      // Lampe_1 aus
    Serial.println("Keine Bewegung_1/ Lampe_1 aus");
  }

Ja, so in der Art.

Hier noch mal ein Beispiel für "dark"

//Die Zeit, die die Lampen leuchten wird nicht über Software gesteuert, sondern über das rechte Potentiometer der PIR- Sensoren
// Software /Entprellzeit für HIGH - Zustände der PIR Sensoren hinzugefügt, weil bei einer sehr geringen Haltezeit des HIGH Zustandes (rechtes Potentiometer) der PIR Sensor mehrfach kurz hintereinander ein HIGH meldet
// Software / Entprellzeit für HIGH- Zustand des Dämmerungsschalter, das Entprellen funktioniert noch nicht so richtig


//LM393 Dämmerungsschalter/ Potentiometer
//nach rechts drehen = weniger Licht erforderlich, damit die Beleuchtung aktivert wird
//d.h. die Beleuchtung ist aktivert wenn es noch relativ hell ist

//nach links drehen = mehr Licht erforderlich, damit die Beleuchtung aktiviert wird
// d.h. die Beleuchtung ist deaktivert wenn es noch relativ hell ist


// PIR- Sensor /Potentiometer
//linkes Potentiometer = Empfindlichkeit
//nach links drehen = geringer / Minimum = 3m
//nach rechts drehen = höher / Maximum = 7m

//rechtes Potentiometer = Haltezeit des HIGH- Signals des Output- Kanal / kann je nach Hersteller variieren
//nach links drehen = geringer / Minimum = 5 Sekunden
//nach rechts drehen = höher / Maximum = 300 Sekunden

// gelöste Probleme: Lampe 3 blinkt manchmal und manchmal nicht/ sehr regelmäßig / am PIR Sensor Kabel liegt es nicht und auch nicht am PIR- Sensor, habe beides überprüft
// Das Blinken der Lampe lag an der Glühbirne (es war eine spezielle Glühbirne mit 4 LED Stripes, die eine Glühfadenlampe imitieren wollte
// Bei Lampe 3 war außerdem der PIR - Sensor defekt, er hat nur sehr selten / nicht zuverlässig ausgelöst

boolean dark = false;      // Zwischenvariable deklarieren
boolean dark_old = false;  // Zwischenvariable deklarieren

uint8_t DaemmerungsSensor = 10;  // Daemmerungssensor an Pin 10
uint8_t pin_1 = 6;               // PIR- Sensor 1 festlegen // Ernst Werkstatt
uint8_t pin_2 = 7;               // PIR- Sensor 2 festlegen // Treppenhaus
uint8_t pin_3 = 8;               // PIR- Sensor 3 festlegen // Maya und Leon
uint8_t pin_4 = 9;               // PIR- Sensor 4 festlegen // Lina

const uint8_t RELAY_PIN_1 = 2;  // Relais 1 festlegen // Ernst Werkstatt
const uint8_t RELAY_PIN_2 = 3;  // Relais 2 festlegen // Treppenhaus
const uint8_t RELAY_PIN_3 = 4;  // Relais 3 festlegen // Maya und Leon
const uint8_t RELAY_PIN_4 = 5;  // Relais 4 festlegen // Lina

boolean movement_1 = 0;
boolean movement_2 = 0;
boolean movement_3 = 0;
boolean movement_4 = 0;

void setup() {
  pinMode(DaemmerungsSensor, INPUT);  // Daemmerungssensor als Input festlegen
  pinMode(pin_1, INPUT);              // Pin1 als Input festlegen
  pinMode(pin_2, INPUT);              // Pin2 als Input festlegen
  pinMode(pin_3, INPUT);              // Pin3 als Input festlegen
  pinMode(pin_4, INPUT);              // Pin4 als Input festlegen
  pinMode(RELAY_PIN_1, OUTPUT);
  pinMode(RELAY_PIN_2, OUTPUT);
  pinMode(RELAY_PIN_3, OUTPUT);
  pinMode(RELAY_PIN_4, OUTPUT);
  digitalWrite(RELAY_PIN_1, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_2, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_3, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_4, HIGH);  // Relais AUS bei Start
  Serial.begin(115200);             // Serieller Monitor
  Serial.println("Arduino wird hochgefahren");
}

void loop() {
  dark = digitalRead(DaemmerungsSensor);  // Daemmerungssensor auslesen
  movement_1 = digitalRead(pin_1);        // Sensor auslesen
  movement_2 = digitalRead(pin_2);        // Sensor auslesen
  movement_3 = digitalRead(pin_3);        // Sensor auslesen
  movement_4 = digitalRead(pin_4);        // Sensor auslesen

  if (dark != dark_old) {
    if (dark == LOW) {
      Serial.println("Dunkel");
    } else {
      Serial.println("Hell");
    }
    dark_old = dark;
  }

  //Lampe_1
  if (movement_1 == HIGH || movement_2 == HIGH) {
    Serial.println("Bewegung_1 oder Bewegung_2 erkannt");
    if (dark == LOW) {                 // Nur wenn dunkel
      digitalWrite(RELAY_PIN_1, LOW);  // Lampe_1 ein
      Serial.println("Lampe_1 ein");
    }
  } else {
    digitalWrite(RELAY_PIN_1, HIGH);  // Lampe_1 aus
    Serial.println("Keine Bewegung_1 / Lampe_1 aus");
  }


  //Lampe_3
  if (movement_3 == HIGH) {
    Serial.println("Bewegung_3 erkannt");
    if (dark == LOW) {                 // Nur wenn dunkel
      digitalWrite(RELAY_PIN_3, LOW);  // Lampe_3 ein
      Serial.println("Lampe_3 ein");
    }
  } else {
    digitalWrite(RELAY_PIN_3, HIGH);  // Lampe_3 aus
    Serial.println("Keine Bewegung_3 / Lampe_3 aus");
  }


  //Lampe_4
  if (movement_4 == HIGH) {
    Serial.println("Bewegung_4 erkannt");
    if (dark == LOW) {                 // Nur wenn dunkel
      digitalWrite(RELAY_PIN_4, LOW);  // Lampe_4 ein
      Serial.println("Lampe_4 ein");
    }
  } else {
    digitalWrite(RELAY_PIN_4, HIGH);  // Lampe_4 aus
    Serial.println("Keine Bewegung_4 / Lampe_4 aus");
  }
}

Beachte auch noch die ganzen anderen Änderungen.

Der Künstler ist wieder da :star_struck:

//Die Zeit, die die Lampen leuchten wird nicht über Software gesteuert, sondern über das rechte Potentiometer der PIR- Sensoren
// Software /Entprellzeit für HIGH - Zustände der PIR Sensoren hinzugefügt, weil bei einer sehr geringen Haltezeit des HIGH Zustandes (rechtes Potentiometer) der PIR Sensor mehrfach kurz hintereinander ein HIGH meldet
// Software / Entprellzeit für HIGH- Zustand des Dämmerungsschalter, das Entprellen funktioniert noch nicht so richtig

//LM393 Dämmerungsschalter/ Potentiometer
//nach rechts drehen = weniger Licht erforderlich, damit die Beleuchtung aktivert wird
//d.h. die Beleuchtung ist aktivert wenn es noch relativ hell ist

//nach links drehen = mehr Licht erforderlich, damit die Beleuchtung aktiviert wird
// d.h. die Beleuchtung ist deaktivert wenn es noch relativ hell ist

// PIR- Sensor /Potentiometer
//linkes Potentiometer = Empfindlichkeit
//nach links drehen = geringer / Minimum = 3m
//nach rechts drehen = höher / Maximum = 7m

//rechtes Potentiometer = Haltezeit des HIGH- Signals des Output- Kanal / kann je nach Hersteller variieren
//nach links drehen = geringer / Minimum = 5 Sekunden
//nach rechts drehen = höher / Maximum = 300 Sekunden

// gelöste Probleme: Lampe 3 blinkt manchmal und manchmal nicht/ sehr regelmäßig / am PIR Sensor Kabel liegt es nicht und auch nicht am PIR- Sensor, habe beides überprüft
// Das Blinken der Lampe lag an der Glühbirne (es war eine spezielle Glühbirne mit 4 LED Stripes, die eine Glühfadenlampe imitieren wollte
// Bei Lampe 3 war außerdem der PIR - Sensor defekt, er hat nur sehr selten / nicht zuverlässig ausgelöst

const uint8_t DaemmerungsSensor = 10; // Daemmerungssensor an Pin 10
const uint8_t pin_1 = 6; // PIR- Sensor 1 festlegen // Ernst Werkstatt
const uint8_t pin_2 = 7; // PIR- Sensor 2 festlegen // Treppenhaus
const uint8_t pin_3 = 8; // PIR- Sensor 3 festlegen // Maya und Leon
const uint8_t pin_4 = 9; // PIR- Sensor 4 festlegen // Lina

const uint8_t RELAY_PIN_1 = 2;   // Relais 1 festlegen // Ernst Werkstatt
const uint8_t RELAY_PIN_2 = 3;   // Relais 2 festlegen // Treppenhaus
const uint8_t RELAY_PIN_3 = 4;   // Relais 3 festlegen // Maya und Leon
const uint8_t RELAY_PIN_4 = 5;   // Relais 4 festlegen // Lina

void setup()
{
  Serial.begin(9600); // Serieller Monitor bei einer Baudrate von 9600
  Serial.println("Arduino wird hochgefahren");
  pinMode(DaemmerungsSensor, INPUT); // Daemmerungssensor als Input festlegen
  pinMode(pin_1, INPUT); // Pin1 als Input festlegen
  pinMode(pin_2, INPUT); // Pin2 als Input festlegen
  pinMode(pin_3, INPUT); // Pin3 als Input festlegen
  pinMode(pin_4, INPUT); // Pin4 als Input festlegen
  pinMode(RELAY_PIN_1, OUTPUT);
  pinMode(RELAY_PIN_2, OUTPUT);
  pinMode(RELAY_PIN_3, OUTPUT);
  pinMode(RELAY_PIN_4, OUTPUT);
  digitalWrite(RELAY_PIN_1, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_2, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_3, HIGH);  // Relais AUS bei Start
  digitalWrite(RELAY_PIN_4, HIGH);  // Relais AUS bei Start
}

enum {hell, dunkel};
uint8_t lightState = hell;
uint32_t daemmerTime;
const uint32_t daemmerHold = 2000;

void checkLightSensor()                             // Daemmerungssensor auslesen
{
  switch (lightState)                               // Auswahl Zustand
  {
    case hell:
      if (digitalRead(DaemmerungsSensor) == LOW)    // dunkel erkannt
      {
        daemmerTime = millis();                     // Merken wann
        lightState = dunkel;                        // Status ändern
      }

      break;

    case dunkel:
      if (millis() - daemmerTime > daemmerHold)     // Prellzeit abgelaufen
      {
        if (digitalRead(DaemmerungsSensor) == HIGH) // hell erkannt
        {
          lightState = hell;                        // Status ändern
        }
      }

      break;
  }
}

void loop()
{
  checkLightSensor();
  setLightRelais();
}

void setLightRelais()
{
  // nur wenn Beleuchtung aktiviert
  if (lightState == dunkel)
  {
    if (digitalRead(pin_1) == HIGH)
    {
      if (digitalRead(RELAY_PIN_1) == HIGH)
      { Serial.println("Bewegung_1 erkannt / Lampe_1 ein"); }

      digitalWrite(RELAY_PIN_1, LOW);
    }

    if (digitalRead(pin_2) == HIGH)
    {
      if (digitalRead(RELAY_PIN_1) == HIGH)
      { Serial.println("Bewegung_2 erkannt / Lampe_1 ein"); }

      digitalWrite(RELAY_PIN_1, LOW);
    }

    if (digitalRead(pin_3) == HIGH)
    {
      if (digitalRead(RELAY_PIN_3) == HIGH)
      { Serial.println("Bewegung_3 erkannt / Lampe_3 ein"); }

      digitalWrite(RELAY_PIN_3, LOW);
    }

    if (digitalRead(pin_4) == HIGH)
    {
      if (digitalRead(RELAY_PIN_4) == HIGH)
      { Serial.println("Bewegung erkannt_4 / Lampe_4 ein"); }

      digitalWrite(RELAY_PIN_4, LOW);
    }
  }

  if ((lightState == hell) ||              // Es ist hell ODER
      ((digitalRead(pin_1) == LOW) &&      // BEIDE PirPin sind aus
       (digitalRead(pin_2) == LOW)))
  {
    if ((digitalRead(RELAY_PIN_1) == HIGH) ||
        (digitalRead(RELAY_PIN_2) == HIGH))
    { Serial.println("Lampe_1 aus"); }

    digitalWrite(RELAY_PIN_1, HIGH);
  }

  if ((lightState == hell) ||              // Es ist hell ODER
      (digitalRead(pin_3) == LOW))         // PirPin ist aus
  {
    if (digitalRead(RELAY_PIN_3) == LOW)   // Check ob noch an
    { Serial.println("Lampe_3 aus"); }     // Dann gib Meldung

    digitalWrite(RELAY_PIN_3, HIGH);       // Lampe aus
  }

  if ((lightState == hell) ||              // Entspricht 3
      (digitalRead(pin_4) == LOW))
  {
    if (digitalRead(RELAY_PIN_4) == LOW)
    { Serial.println("Lampe_4 aus"); }

    digitalWrite(RELAY_PIN_4, HIGH);
  }
}
  • Ungetestet, aber kompiliert.
    Wenn der geht, dann schaun wa mal.

Nur mal am Rande, dieser Dämmerungsschalter kann durch einen einfachen LDR (Fotowiderstand) und einem Widerstand ersetzt werden. Die als Spannungsteiler geschalteten Widerstände kommen mit der Anzapfung an einen analogen Pin des Uno, sowie einseitig an +5V und GND.
Die Schaltschwelle kannst du dann sehr komfortabel im Sketch einstellen.

Puh, ich habe Schwierigkeiten das umzusetzen, könntest Du mir das bitte nochmal konkreter an meinem Fall zeigen? :slight_smile:

Hi, my_xy_projekt :star_struck:
Ja, ich will mein Treppenhaus beleuchten und dachte mir ich bastel mal schnell was, aber es wird gerade doch komplizierter als ich dachte :D, so wie das immer ist.

Ich teste mal Deinen Sketch :heart:.

1 Like

Scheint soweit gut zu funktionieren. Das einzige Verbesserbare: wenn der Dämmerungsschalter nicht auslöst, dann erscheint auf dem seriellen Monitor in Endlosschleife:

17:00:19.285 -> Lampe_1 aus
17:00:19.328 -> Lampe_1 aus
17:00:19.328 -> Lampe_1 aus
17:00:19.328 -> Lampe_1 aus
17:00:19.374 -> Lampe_1 aus
17:00:19.374 -> Lampe_1 aus
17:00:19.374 -> Lampe_1 aus
17:00:19.408 -> Lampe_1 aus
17:00:19.408 -> Lampe_1 aus
17:00:19.408 -> Lampe_1 aus
17:00:19.450 -> Lampe_1 aus
17:00:19.450 -> Lampe_1 aus
17:00:19.450 -> Lampe_1 aus

Schaue mir das gleich nochmal genauer an, habe leider kurz einen Termin. Danke schonmal! :slight_smile:

1 Like

Ich muss auch mal kurz umsteigen.
Dann gehts weiter :slight_smile:

In Zeile 134 muss das von HIGH auf LOW geändert werden.
Zeile 135 ist überflüssig.

  if ((lightState == hell) ||              // Es ist hell ODER
      ((digitalRead(pin_1) == LOW) &&      // BEIDE PirPin sind aus
       (digitalRead(pin_2) == LOW)))
  {
    if (digitalRead(RELAY_PIN_1) == LOW)         // ||   << HIER komplett geändert
//        (digitalRead(RELAY_PIN_2) == LOW))     // << und HIER kommt raus
    { Serial.println("Lampe_1 aus"); }

    digitalWrite(RELAY_PIN_1, HIGH);
  }

Dankeschön lieber my_xy_projekt! Jetzt funktioniert alles einwandfrei! Ich bin super happy! Das ist jetzt schon eine ziemlich komplizierte, automatisierte Beleuchtungsanlage geworden. Wenn ich das gewusst hätte, hätte ich auf eine kaufbare Variante zurückgegriffen :D. Wahnsinn :D.

Danke vielmals für Deine Hilfe, ich war gerade kurz vor dem Aufgeben, weil ich gerade eigentlich gar keine Zeit für Tüfteln habe. Bei Gelegenheit werde ich mir deinen Sketch nochmal genauer ansehen. Gerade bin ich einfach erstmal glücklich, dass die Steuerung endlich funktioniert und hoffe, dass sie eine Weile hält :slight_smile: .

LG Leonardo

1 Like