diff --git a/pir_light_relay_sleep_light_voltage.ino b/pir_light_relay_sleep_light_voltage.ino new file mode 100644 index 0000000..5e47534 --- /dev/null +++ b/pir_light_relay_sleep_light_voltage.ino @@ -0,0 +1,100 @@ +/* + * ESP32 PIR Motion Light Controller with Deep Sleep + * + * This sketch uses a PIR motion sensor to wake the ESP32 from deep sleep, + * turns on a light via relay for a configurable duration, then returns to + * deep sleep after a delay to save power. + * + * Hardware: + * - ESP32 Dev Module + * - PIR Motion Sensor + * - Relay Module + */ + +#include +#include "esp_sleep.h" +#include "driver/rtc_io.h" + +// Pin definitions +const int PIR_PIN = 13; // GPIO pin connected to PIR sensor output +const int RELAY_PIN = 12; // GPIO pin connected to relay control + +// Configuration +//const int LIGHT_ON_DURATION = 30000; // Duration to keep light on (30 seconds) +const int SLEEP_DELAY = 10000; // Delay before going to sleep (10 seconds) + +// Variables +unsigned long motionDetectedTime = 0; +bool lightOn = false; + +void setup() { + Serial.begin(115200); + delay(1000); // Allow serial to initialize + + Serial.println("ESP32 PIR Motion Light Controller"); + + // Configure pins + pinMode(PIR_PIN, INPUT); + pinMode(RELAY_PIN, OUTPUT); + + // Turn off relay initially + digitalWrite(RELAY_PIN, LOW); + + // Check wake-up reason + esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause(); + + if (wakeup_reason == ESP_SLEEP_WAKEUP_EXT0) { + Serial.println("Woken up by external signal (PIR sensor)"); + // Motion detected, turn on light + turnLightOn(); + } else { + Serial.println("First boot or reset"); + } +} + +void loop() { + // Check if motion is detected (for initial boot or if already awake) + if (digitalRead(PIR_PIN) == HIGH && !lightOn) { + Serial.println("Motion detected!"); + turnLightOn(); + } + + // Check if it's time to turn off the light + if (lightOn && (millis() - motionDetectedTime > LIGHT_ON_DURATION)) { + Serial.println("Light timer expired, turning off"); + turnLightOff(); + + // Wait a bit before going to sleep + Serial.println("Waiting before sleep..."); + delay(SLEEP_DELAY); + + // Go to deep sleep + goToSleep(); + } + + delay(100); // Small delay to prevent CPU hogging +} + +void turnLightOn() { + digitalWrite(RELAY_PIN, HIGH); + lightOn = true; + motionDetectedTime = millis(); + Serial.println("Light turned ON"); +} + +void turnLightOff() { + digitalWrite(RELAY_PIN, LOW); + lightOn = false; + Serial.println("Light turned OFF"); +} + +void goToSleep() { + Serial.println("Going to deep sleep now"); + Serial.flush(); + + // Configure wake-up source (PIR sensor connected to GPIO) + esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, HIGH); // Use RTC GPIO for wake-up + + // Enter deep sleep + esp_deep_sleep_start(); +} \ No newline at end of file