#define PIR_PIN 34
#define RELAY_PIN 5
#define ENC_CLK 18
#define ENC_DT 19
int lastCLK;
int mode = 0; // 0=15m, 1=30m, 2=1hr
unsigned long lastMotionTime = 0;
bool relayState = false;
unsigned long offDelay = 900000; // default 15 min
void setup()
{
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(ENC_CLK, INPUT);
pinMode(ENC_DT, INPUT);
digitalWrite(RELAY_PIN, LOW);
lastCLK = digitalRead(ENC_CLK);
}
void loop()
{
int currentCLK = digitalRead(ENC_CLK);
if (currentCLK != lastCLK)
{
if (digitalRead(ENC_DT) != currentCLK)
{
mode++;
}
else
{
mode--;
}
if (mode > 2) mode = 0;
if (mode < 0) mode = 2;
if (mode == 0) offDelay = 900000; // 15 min
if (mode == 1) offDelay = 1800000; // 30 min
if (mode == 2) offDelay = 3600000; // 1 hour
}
lastCLK = currentCLK;
int pirState = digitalRead(PIR_PIN);
if (pirState == HIGH)
{
digitalWrite(RELAY_PIN, HIGH);
lastMotionTime = millis();
relayState = true;
}
if (relayState && pirState == LOW)
{
if (millis() - lastMotionTime >= offDelay)
{
digitalWrite(RELAY_PIN, LOW);
relayState = false;
}
}
}