| 
									
										
										
										
											2017-06-29 13:01:39 +05:30
										 |  |  | /*
 | 
					
						
							|  |  |  | 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(){ | 
					
						
							| 
									
										
										
										
											2017-09-12 11:09:59 +03:00
										 |  |  |   esp_sleep_wakeup_cause_t wakeup_reason; | 
					
						
							| 
									
										
										
										
											2017-06-29 13:01:39 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 11:09:59 +03:00
										 |  |  |   wakeup_reason = esp_sleep_get_wakeup_cause(); | 
					
						
							| 
									
										
										
										
											2017-06-29 13:01:39 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |   switch(wakeup_reason) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     case 1  : Serial.println("Wakeup caused by external signal using RTC_IO"); break; | 
					
						
							|  |  |  |     case 2  : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break; | 
					
						
							|  |  |  |     case 3  : Serial.println("Wakeup caused by timer"); break; | 
					
						
							|  |  |  |     case 4  : Serial.println("Wakeup caused by touchpad"); break; | 
					
						
							|  |  |  |     case 5  : Serial.println("Wakeup caused by ULP program"); break; | 
					
						
							|  |  |  |     default : Serial.println("Wakeup was not caused by deep sleep"); 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. | 
					
						
							|  |  |  |   */ | 
					
						
							| 
									
										
										
										
											2017-09-12 11:09:59 +03:00
										 |  |  |   esp_sleep_enable_ext0_wakeup(GPIO_NUM_33,1); //1 = High, 0 = Low
 | 
					
						
							| 
									
										
										
										
											2017-06-29 13:01:39 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |   //If you were to use ext1, you would use it like
 | 
					
						
							|  |  |  |   //esp_deep_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
 | 
					
						
							|  |  |  | } |