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! 
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 
//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? 
Hi, my_xy_projekt 
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
.
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! 
1 Like
Ich muss auch mal kurz umsteigen.
Dann gehts weiter 
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
.
LG Leonardo
1 Like