Hallo,
zwei Taster am Mega schalten jeweils eine Lampe über ein Relais. Wenn man sich entfernt gehen die Lampen, gesteuert durch den Bewegungsmelder, nach 5 Minuten aus. Das funktioniert mit u.g. Programm wenn ich eine Zeit lang arbeite und mich dann entferne. Wenn ich jedoch lange Zeit arbeite (ca. ab einer Stunde)und mich dann entferne, geht das Licht nicht mehr von alleine aus. Während meiner "langen" Sitzung hat der Bewegungsmelder jedoch fast permanent geschaltet und den Zähler immer wieder neu gestartet.Ich finde den Fehler nicht
unsigned long ist doch mehr als ausreichend?
Hat da jemand eine Idee?
Danke!!
#include "Arduino.h"
#include <Bounce2.h>
int ledPin = 13; // LED on Pin 13 of Arduino
int pirPin = 10; // Input for HC-S501
int sw1pin = 11; //Schalter 1 Lampe Mitte
int sw2pin = 12; //Schalter 2 re und li Lampe
int rel1pin = 9; // Relais 1
int rel2pin = 8; // Relais 2
int pirValue; // Place to store read PIR Value
bool sw1_soll = 0;
int sw1_tast = 0;
bool sw1aktiv = false;
bool sw2_soll = 0;
int sw2_tast = 0;
bool sw2aktiv = false;
Bounce sw1 = Bounce();
Bounce sw2 = Bounce();
unsigned long vg_time1 = millis();
const unsigned long restlicht = 600000;
void swchange(int);
void setup() {
//Serial.begin(115200); // USB-Serielle SST
pinMode(ledPin, OUTPUT);
pinMode(pirPin, INPUT);
pinMode(sw1pin,INPUT);
pinMode(sw2pin,INPUT);
pinMode(rel1pin,OUTPUT);
pinMode(rel2pin,OUTPUT);
digitalWrite(ledPin, LOW);
digitalWrite(rel1pin, HIGH);
digitalWrite(rel2pin, HIGH);
sw1.attach(11);
sw1.interval(50);
sw2.attach(12);
sw2.interval(50);
}
void loop() {
// Beide Lampen ausschalten wenn keine IR-Bewegung
if ((millis() - vg_time1) > restlicht) {
sw1_soll = LOW;
sw2_soll = LOW;
swchange(1);
swchange(2);
}
sw1.update(); // Taster 1
int sw1_tast = sw1.read();
if ((sw1_tast == HIGH) && (sw1aktiv== true)) {
if (sw1_soll == LOW)
sw1_soll = HIGH;
else
sw1_soll = LOW;
swchange(1);
sw1aktiv =false;
vg_time1 = millis();
}
if (sw1_tast == LOW) sw1aktiv = true;
sw2.update(); // Taster 2
int sw2_tast = sw2.read();
if ((sw2_tast == HIGH) && (sw2aktiv== true)) {
if (sw2_soll == LOW)
sw2_soll = HIGH;
else
sw2_soll = LOW;
swchange(2);
sw2aktiv =false;
vg_time1 = millis();
}
if (sw2_tast == LOW) sw2aktiv = true;
pirValue = digitalRead(pirPin); // Bewegung startet Lichttimer von vorne
if (pirValue == 1) {
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
vg_time1 = millis();
}
}
void swchange(int sw){ // Relais schalten
if (sw == 1)
digitalWrite(rel1pin, !sw1_soll);
else
digitalWrite(rel2pin, !sw2_soll);
}
