Treppenhausbeleuchtung mit PIR- Sensoren und lm393 Dämmerungsschalter

Hier ist jetzt zum Abschluss nochmal der komplette Sketch:

//Die Zeit, die die Lampen leuchten wird nicht über Software gesteuert, sondern über das rechte Potentiometer der PIR- Sensoren

//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) == LOW)        

    { 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);
  }
}

Alles Gute!
Sag Bescheid, wenn Du etwas Luft hast, dann kann man da noch ein wenig aufräumen.

Hier sind abschließend ein paar Fotos von der Steuerung.

Die Steuerung plus Sensoren befinden sich unter Dach aber nicht in komplett geschlossenen Räumen. Ich bin gespannt wie lange sie halten werden. Wenn irgendetwas kaputt geht und ersetzt werden muss, gebe ich hier Langzeitreport.

Jetzt wo es dunkel geworden ist, habe ich gemerkt, dass Die Schaltlogik in void checkLightSensor() falsch herum war. Denn der Dämmerungsschalter sendet bei Helligkeit ein LOW Signal und bei Dunkelheit ein HIGH Signal.

Habe es umgedreht, was dank des gut strukturierten Sketches ein Kinderspiel war :slight_smile: .

//Die Zeit, die die Lampen leuchten wird nicht über Software gesteuert, sondern über das rechte Potentiometer der PIR- Sensoren
//Was man noch verbessern könnte: Ein delay einbauen, damit die Lampen nicht sofort reagieren wenn man bei Dunkelheit den Dämmerungsschalter kurz im Vorbeigehen mit einer Taschenlampe anleuchtet, optional könnte man den Sensor auch einfach woanders hinhängen

//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) == HIGH)    // dunkel erkannt
      {
        daemmerTime = millis();                     // Merken wann
        lightState = dunkel;                        // Status ändern
      }

      break;

    case dunkel:
      if (millis() - daemmerTime > daemmerHold)     // Prellzeit abgelaufen
      {
        if (digitalRead(DaemmerungsSensor) == LOW) // 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) == LOW)        

    { 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);
  }
}

:laughing:

Ich hab ja gesagt, das geht noch besser....
Aber schick, dass ich es selbsterklärend geschafft habe.

Mir ist heute noch etwas aufgefallen: In der Dämmerung passiert es, dass der Dämmerungsschalter zwischen HIGH und LOW hin und herspringt. Ich denke es wäre daher gut die Variable daemmerHold = 2000; zu erhöhen, damit diese "Unentschiedenheit" übersprungen wird, bis es für den Dämmerungsschalter eindeutig hell oder dunkel ist. Ich probiere es morgen mal mit daemmerHold = 60.000 (1. Minute).

ich hab mich eh gefragt, ob das so ausgegoren ist...

Aber Du hattest ja keine Zeit - daher habe ich die Logikfragen einfach mal ganz raus gelassen... War nu auch nicht richtig. :man_shrugging:

Okay :). Abends habe ich schon immer mal Zeit mich darum zu kümmern, nur jetzt erstmal nicht tagsüber ;). Daher kannst Du weitere Logikfragen gerne noch raushauen ;). Ich schaue mal was die Dämmerung heute Abend so bringt :D.

Wow....wurde deine Konstruktion von einem Elektriker abgenommen ?
Wenn nicht, hätte ich Bedenken im Versicherungsfall.

Deine Bedenken in Ehren, aber der TO weiß was er tut.
Kann ich Dir aus eigener Inaugenscheinnahme anderer "Konstruktionen", die öffentlich ausgestellt waren, berichten.

Ok, bei anderen Projekten mag das auch gerne stimmen.
Hier kann ich das nicht erkennen.
Aber egal, nicht mein Problem.

Genau.

Ich drück das mal so aus....
Vor 45 Jahren hätte man für sowas das BGJ Elektro wiederholen müssen :innocent:

Bzgl. Brandgefahr: Bei dem 230 VAC Schaltkreis mache ich mir keine Sorgen, hier habe ich sehr gewissenhaft gearbeitet. Die Steckdosen, die an den einzelnen Relais hängen sind IP44 spritzwassergeschützt. Das Relais ist auch einigermaßen geschützt aber IP44 konform ist das Gehäuse bestimmt nicht.

Die 5 Volt /3,3 Volt Schaltkreise (PIR Sensoren und Dämmerungsschalter) sind nicht wirklich geschützt. Hier bin "bin [ich] gespannt wie lange sie halten werden." vor allem wegen Korision der dünnen Leiterbahnen etc. durch Feuchtigkeit.
Ich gehe aber davon aus, dass die Brandgefahr hier gering ist im Vergleich zu einem 230VAC Schaltkreis, aber das ist auch nur ein Gefühl :D.

Bzgl. der Stromschlaggefahr mache ich mir keine Sorgen, weil die 5 Volt /3,3 Volt Schaltkreise ungefährlich sein dürften und ein versehentliches Berühren der 230 VAC Schaltkreise sind ausgeschlossen.

Generell sind alle Elektronikbasteleien, die von keinem Elektroniker abgenommen wurden natürlich in jeglichem Versicherungsfall ein Problem, was bedeutet, das die Versicherungen im Versicherungsfall nicht zahlen. Das Risiko gehe ich ein.

:smiley:
Ich würde mich über konkrete Verbesserungsvorschläge bzgl. der Lichtsteuerung freuen, die nötig sind, damit ein Elektriker die Anlage abnehmen würde. Ich denke es würde gerade vor allem an dem undichten Gehäuse vom Arduino und dem 4- fach Relais und den fehlenden Gehäusen um die Sensoren scheitern? Die Litzenleitungen, die ich für die Sensoren benutzt habe sind mit Aderendhülsen versehen- in der Hinsicht kann ich Euch beruhigen:)

Versicherungsschutz im Schadensfall:

Versicherungen (Hausrat / Wohngebäude) leisten grundsätzlich auch ohne TÜV-Prüfung, sofern:

  • kein grob fahrlässiges Verhalten vorliegt (z. B. unsachgemäße Installation durch Laien),
  • die Installation den technischen Regeln zur Zeit der Errichtung entsprach,
    keine Pflichtverletzung vorliegt, etwa wenn ein bereits bekannter Mangel ignoriert wurde.

Tipp: Wenn Sie z. B. umbauen oder alte Sicherungen ersetzen lassen, dokumentieren Sie die Arbeiten durch einen Elektriker. Das hilft im Schadenfall gegenüber der Versicherung.

Quelle: Chat GPT

Dokumentieren heißt in dem Falle vermutlich: Alles in Ordnung mit der Anlage. MfG (Unterschrift Elektriker)

Ok, danke für deine Klarstellung.

Da bin ich mir allerdings nicht so sicher.
Wieso verwendest du eine blaue Leitung (Nullleiter) als Phase ?
Oder schalltest du nicht die Phase, sondern den Nullleiter ?
Eine Erdung (Schutzleiter) fehlt komplett.
Und ob die Einführung der blauen Leitungen in die Steckdosen Spritzwasser geschützt sind, bin ich mir nicht so sicher.

Ob die Relaisplatine für 230 Volt geeignet ist, kann man nicht erkennen. Es müssen Ausfräsungen vorhanden sein, um evtl. Kriechströme auf der Platine zu verhindern.

Dennoch, das soll nur eine Anregung sein, es richtig zu machen.

Du haust aber rein......
Du hast es Gewissenhaft gemeint. Aber die Bilder sagen was anderes.
Du wirst doch einen Bekanten haben der Elektriker ist?
Mann, du hast Kinder im Haus....
Also um nicht nur zu mosern.
Du besorgst Dir einen Elektriker und ich mach dir ne Liste von Elektromaterial
wie sowas hier.Industriegehäuse Leergehäuse Verteilerkasten Schaltschrank Verteilergehäuse IP67 | eBay.de
und weitere Kleinteile. Und Ja!, das kost Geld Da ist nicht ein Relaysheld für 2 Euronen verbaut.

To- Do um Anlage von Elektriker absichern zu lassen:

  • Phase (schwarz/braun) muss geschaltet werden (statt Nullleiter (blau))
  • Erdung hinzufügen
  • Spritzwasserschutz durch Industriegehäuse
  • Relaisplatine mit Ausfräsungen (ist der Fall)

Ist es auch nötig die Sensoren (PIR- Sensor und Dämmerungsschalter) mit einem Industriegehäuse vor Spritzwasser zu schützen?

Gute Entscheidung.
Nicht aus Sicherheitsgründen, eher Optik und Langlebigkeit.
Wobei der Bewegungsmelder sollte nicht komplett im Gehäuse versteckt werden. Die Fresnel Linse muss ja nach außen "blicken" können.