Wakeup after long sleep or button press

Updated on 3 September 2021
dev board WeMos D1 Mini
chip ESP8266
features EEPROM button sleep wakeup
This tutorial is more than 1 year old. If the steps below do not work, then please check the latest versions and the documentations of the individual tools used.

Before starting

Pre-requisites

Try these simpler or similar examples:

Buy the components

Code

Download code long-sleep-or-button-press.ino
#include <EEPROM.h>

extern "C" {
  #include "user_interface.h"
}

const int sleepTime = 10;  // 10 seconds

#define FINAL_SLEEP_INTERVAL 6
#define CURRENT_SLEEP_INTERVAL_ADDR 30  // Store sleep interval
#define CURRENT_SLEEP_INTERVAL EEPROM.read(CURRENT_SLEEP_INTERVAL_ADDR)
#define BUTTON_PRESS 12  // GPIO12 or D6
int val = 0;

void setup() {
  val = digitalRead(BUTTON_PRESS);

  Serial.begin(115200);
  Serial.println(val);

  EEPROM.begin(512);
  pinMode(2, OUTPUT);
  Serial.println("[INFO] Wake up!");

  readPin();

  if (CURRENT_SLEEP_INTERVAL == FINAL_SLEEP_INTERVAL) {
    blink(5);
    resetSleepInterval();
    doSomething();
    goToSleep();
  } else {
    blink(5);
    increaseSleepInterval();
    goToSleep();
  }
}

void readPin() {
  Serial.print("[INFO] Read pin GPIO12 / D6: ");
  Serial.println(digitalRead(BUTTON_PRESS));

  Serial.print("[INFO] Reset reason: ");
  Serial.println(getResetReason());
}

void blink(int times) {
  Serial.print("[INFO] Blink for ");
  Serial.print(times);
  Serial.println(" times");

  for (int i=0; i <= times; i++) {
    digitalWrite(2, HIGH);
    delay(1000);

    digitalWrite(2, LOW);
    delay(1000);
  }
}
void loop() {}

void doSomething() {
  Serial.println("[INFO] Hey do something finally :)");
}

void goToSleep() {
  Serial.println("[INFO] Going to sleep for 10 seconds...");
  ESP.deepSleep(sleepTime * 1000000);
}

void resetSleepInterval() {
  Serial.println("[INFO] ");
  EEPROM.write(CURRENT_SLEEP_INTERVAL_ADDR, 0);
  EEPROM.commit();
}

void increaseSleepInterval() {
  Serial.print("[INFO] Current sleep interval: ");
  Serial.println(CURRENT_SLEEP_INTERVAL);

  EEPROM.write(CURRENT_SLEEP_INTERVAL_ADDR, CURRENT_SLEEP_INTERVAL + 1);
  EEPROM.commit();
}

int getResetReason() {
  rst_info* ri = system_get_rst_info();
  if (ri == NULL) {
    return -1;
  }

  return ri->reason;
}

Makefile

.PHONY: lint compile upload clean

lint:
	cpplint --extensions=ino --filter=-legal/copyright,-readability/todo *.ino

compile:
	arduino-cli compile --fqbn esp8266com:esp8266:d1_mini ./

upload:
	arduino-cli upload -p /dev/cu.wchusbserial1410 --fqbn esp8266com:esp8266:d1_mini ./

clean:
	rm -f .*.bin
	rm -f .*.elf

flash: lint compile upload clean

Schematic

Wire up the hardware accordingly

Wakeup after long sleep or button press schematic

Description

Wakeup periodically after long sleep (more than 1 hour) or on button press. ESP8266 will wake up after 23 minutes even if the time set is more than that because of timer limits.