#include <esp_sleep.h>
#include <time.h>
#define WAKE_UP_PIN GPIO_NUM_5
#define RELAY_ON_PIN GPIO_NUM_11
#define RELAY_OFF_PIN GPIO_NUM_12
RTC_DATA_ATTR int count = 0;
RTC_DATA_ATTR time_t sleep_start_time;
void setup() {
Serial.begin(115200);
delay(1000); // Give time for the serial monitor to start
pinMode(RELAY_ON_PIN, OUTPUT);
pinMode(RELAY_OFF_PIN, OUTPUT);
// Increment boot count
++count;
Serial.println("Turns to Wake Up: " + String(count));
// Check wake-up reason
esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
switch (wakeup_reason) {
case ESP_SLEEP_WAKEUP_EXT0:
Serial.println("Wakeup caused by external signal using RTC_IO");
break;
default:
Serial.println("Wakeup was not caused by deep sleep");
break;
}
// Calculate and print sleep duration
if (wakeup_reason == ESP_SLEEP_WAKEUP_EXT0) {
time_t now;
time(&now);
double sleep_duration = difftime(now, sleep_start_time);
Serial.println("Slept for: " + String(sleep_duration) + " seconds");
}
Serial.println("Powering up...");
// Toggle Relay_On for 1 second upon power up
digitalWrite(RELAY_ON_PIN, HIGH);
Serial.println("Relay_On is HIGH");
delay(1000);
digitalWrite(RELAY_ON_PIN, LOW);
Serial.println("Relay_On is LOW");
// Configure wake up source with pull-down resistor
pinMode(WAKE_UP_PIN, INPUT_PULLDOWN);
esp_sleep_enable_ext0_wakeup(WAKE_UP_PIN, 1); // Wake up on high signal
Serial.println("Wake-up source configured");
}
void loop() {
Serial.println("Staying awake for 20 minutes...");
// Stay awake for 20 minutes (1200000 milliseconds)
delay(5000);
Serial.println("Preparing to go to sleep...");
// Toggle Relay_Off for 1 second before shutdown
digitalWrite(RELAY_OFF_PIN, HIGH);
Serial.println("Relay_Off is HIGH");
delay(1000);
digitalWrite(RELAY_OFF_PIN, LOW);
Serial.println("Relay_Off is LOW");
Serial.println("Good Night!");
// Record sleep start time
time(&sleep_start_time);
// Enter deep sleep mode
esp_deep_sleep_start();
}