Buy the components
wakeup-on-interrupt.ino
#include <avr/sleep.h> #define interruptPin 2 // To wake up, press button to connect PIN 2 to GND void setup() { Serial.begin(115200); Serial.println(""); Serial.println(""); Serial.println("Start"); pinMode(LED_BUILTIN, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); } void loop() { doTask(); } void goToSleep() { sleep_enable(); attachInterrupt(0, wakeUp, LOW); set_sleep_mode(SLEEP_MODE_PWR_DOWN); digitalWrite(LED_BUILTIN, LOW); delay(1000); sleep_cpu(); // Program will start from here on after wake up Serial.println("Do task after wakeup"); doTask(); } void wakeUp() { Serial.println(""); Serial.println("Interrrupt fired"); sleep_disable(); detachInterrupt(0); } void doTask() { digitalWrite(LED_BUILTIN, HIGH); delay(5000); Serial.println("Going to sleep"); Serial.println("Short Pin 2 to GND to wake up!"); goToSleep(); }
BOARD?=arduino:avr:uno PORT?=/dev/cu.usbmodem14* .PHONY: default lint all flash clean default: lint all flash clean lint: cpplint --extensions=ino --filter=-legal/copyright *.ino all: arduino-cli compile --fqbn $(BOARD) ./ flash: arduino-cli upload -p $(PORT) --fqbn $(BOARD) ./ clean: rm -f .*.hex rm -f .*.elf
Wire up the hardware accordingly
Serial output from the firmware.
Wakeup the Arduino UNO on interrupt. Press a button wired to PIN 2 and short it to GND to wake it up.
PIN 2
GND