// ================= Configuration Variables =================
const int pirSensorPin = 23; // PIR sensor GPIO pin
const int relay1Pin = 16; // Relay GPIO pin
const unsigned long relayOnTimeMs = 4000; // Relay ON duration in milliseconds (4 seconds)
// ================= Internal State Variables =================
bool relayActive = false;
unsigned long relayStartTime = 0;
// ================= Function Prototypes =================
void handlePirAndRelay();
/*
* Function: handlePirAndRelay
* I/O: Reads PIR sensor (input), controls relay (output)
* Working: Turns ON relay for a fixed time when PIR detects motion
*/
void handlePirAndRelay() {
int pirState = digitalRead(pirSensorPin);
// Error handling: ensure PIR read is valid
if (pirState != HIGH && pirState != LOW) {
digitalWrite(relay1Pin, LOW);
relayActive = false;
return;
}
// If motion detected and relay is not already active
if (pirState == HIGH && !relayActive) {
digitalWrite(relay1Pin, HIGH);
relayActive = true;
relayStartTime = millis();
}
// Turn OFF relay after specified time
if (relayActive && (millis() - relayStartTime >= relayOnTimeMs)) {
digitalWrite(relay1Pin, LOW);
relayActive = false;
}
}
void setup() {
pinMode(pirSensorPin, INPUT);
pinMode(relay1Pin, OUTPUT);
// Ensure relay is OFF at startup
digitalWrite(relay1Pin, LOW);
}
void loop() {
handlePirAndRelay();
}