#include <avr/sleep.h>
// #include <LowPower.h>
#define BLINK_RATE 200
const int buttonPin = 2; // Button pin (interrupt-capable)
const int controlPin = LED_BUILTIN; // Pin to turn off/on during sleep
volatile bool wakeUpFlag = false;
void wakeUpISR() {
wakeUpFlag = true; // Flag set when button pulls pin LOW
}
void blinkIfAlive() {
static uint32_t nextBlink = 0;
if (millis() > nextBlink) {
digitalWrite(LED2_PIN, !digitalRead(LED2_PIN));
nextBlink += BLINK_RATE; // #define BLINK_RATE 200 or whatever
}
}
void setup() {
Serial.begin(115200);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(controlPin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), wakeUpISR, FALLING);
while (!Serial) {}
Serial.println("System Ready");
}
void loop() {
// ✅ Awake period: 5 minutes
digitalWrite(controlPin, HIGH); // Turn ON pin 4 when awake
uint32_t sleepTime = millis() + 5 * 60 * 10UL;
while (millis() < sleepTime) {
if (wakeUpFlag) {
Serial.println("Button pressed during awake period!");
wakeUpFlag = false;
}
// Do your active tasks here
blinkIfAlive();
delay(10);
}
Serial.println("Going to sleep for 55 minutes...");
// ❌ Sleep period: 55 minutes
digitalWrite(controlPin, LOW); // Turn OFF pin 4 before sleep
for (int i = 0; i < (5 * 16) / 8; i++) {
Serial.print('.');
if (wakeUpFlag) {
Serial.println("Button woke system early!");
wakeUpFlag = false;
break; // Exit sleep loop immediately
}
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode(); // now sleeping until interrupt
sleep_disable();
// LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
Serial.println("Woke up from sleep!");
}