mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-03 23:51:39 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
Deep Sleep with External Wake Up
 | 
						|
=====================================
 | 
						|
This code displays how to use deep sleep with
 | 
						|
an external trigger as a wake up source and how
 | 
						|
to store data in RTC memory to use it over reboots
 | 
						|
 | 
						|
This code is under Public Domain License.
 | 
						|
 | 
						|
Hardware Connections
 | 
						|
======================
 | 
						|
Push Button to GPIO 33 pulled down with a 10K Ohm
 | 
						|
resistor
 | 
						|
 | 
						|
NOTE:
 | 
						|
======
 | 
						|
Only RTC IO can be used as a source for external wake
 | 
						|
source. They are pins: 0,2,4,12-15,25-27,32-39.
 | 
						|
 | 
						|
Author:
 | 
						|
Pranav Cherukupalli <cherukupallip@gmail.com>
 | 
						|
*/
 | 
						|
 | 
						|
#define BUTTON_PIN_BITMASK 0x200000000 // 2^33 in hex
 | 
						|
 | 
						|
RTC_DATA_ATTR int bootCount = 0;
 | 
						|
 | 
						|
/*
 | 
						|
Method to print the reason by which ESP32
 | 
						|
has been awaken from sleep
 | 
						|
*/
 | 
						|
void print_wakeup_reason(){
 | 
						|
  esp_sleep_wakeup_cause_t wakeup_reason;
 | 
						|
 | 
						|
  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;
 | 
						|
    case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
 | 
						|
    case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break;
 | 
						|
    case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;
 | 
						|
    case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;
 | 
						|
    default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void setup(){
 | 
						|
  Serial.begin(115200);
 | 
						|
  delay(1000); //Take some time to open up the Serial Monitor
 | 
						|
 | 
						|
  //Increment boot number and print it every reboot
 | 
						|
  ++bootCount;
 | 
						|
  Serial.println("Boot number: " + String(bootCount));
 | 
						|
 | 
						|
  //Print the wakeup reason for ESP32
 | 
						|
  print_wakeup_reason();
 | 
						|
 | 
						|
  /*
 | 
						|
  First we configure the wake up source
 | 
						|
  We set our ESP32 to wake up for an external trigger.
 | 
						|
  There are two types for ESP32, ext0 and ext1 .
 | 
						|
  ext0 uses RTC_IO to wakeup thus requires RTC peripherals
 | 
						|
  to be on while ext1 uses RTC Controller so doesnt need
 | 
						|
  peripherals to be powered on.
 | 
						|
  Note that using internal pullups/pulldowns also requires
 | 
						|
  RTC peripherals to be turned on.
 | 
						|
  */
 | 
						|
  esp_sleep_enable_ext0_wakeup(GPIO_NUM_33,1); //1 = High, 0 = Low
 | 
						|
 | 
						|
  //If you were to use ext1, you would use it like
 | 
						|
  //esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);
 | 
						|
 | 
						|
  //Go to sleep now
 | 
						|
  Serial.println("Going to sleep now");
 | 
						|
  esp_deep_sleep_start();
 | 
						|
  Serial.println("This will never be printed");
 | 
						|
}
 | 
						|
 | 
						|
void loop(){
 | 
						|
  //This is not going to be called
 | 
						|
}
 |