108 lines
3.6 KiB
Arduino
108 lines
3.6 KiB
Arduino
|
|
/*
|
||
|
|
Deep Sleep with Touch Wake Up
|
||
|
|
=====================================
|
||
|
|
This code displays how to use deep sleep with
|
||
|
|
a touch as a wake up source and how to store data in
|
||
|
|
RTC memory to use it over reboots
|
||
|
|
|
||
|
|
ESP32 can have multiple touch pads enabled as wakeup source
|
||
|
|
ESP32-S2 and ESP32-S3 supports only 1 touch pad as wakeup source enabled
|
||
|
|
|
||
|
|
This code is under Public Domain License.
|
||
|
|
|
||
|
|
Author:
|
||
|
|
Pranav Cherukupalli <cherukupallip@gmail.com>
|
||
|
|
*/
|
||
|
|
|
||
|
|
#if CONFIG_IDF_TARGET_ESP32
|
||
|
|
#define THRESHOLD 40 /* Greater the value, more the sensitivity */
|
||
|
|
#elif (CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3)
|
||
|
|
#define THRESHOLD 5000 /* Lower the value, more the sensitivity */
|
||
|
|
#else // ESP32-P4 + default for other chips (to be adjusted) */
|
||
|
|
#define THRESHOLD 500 /* Lower the value, more the sensitivity */
|
||
|
|
#endif
|
||
|
|
|
||
|
|
RTC_DATA_ATTR int bootCount = 0;
|
||
|
|
touch_pad_t touchPin;
|
||
|
|
/*
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
Method to print the touchpad by which ESP32
|
||
|
|
has been awaken from sleep
|
||
|
|
*/
|
||
|
|
void print_wakeup_touchpad() {
|
||
|
|
touchPin = (touch_pad_t)esp_sleep_get_touchpad_wakeup_status();
|
||
|
|
|
||
|
|
#if CONFIG_IDF_TARGET_ESP32
|
||
|
|
switch (touchPin) {
|
||
|
|
case 0: Serial.println("Touch detected on GPIO 4"); break;
|
||
|
|
case 1: Serial.println("Touch detected on GPIO 0"); break;
|
||
|
|
case 2: Serial.println("Touch detected on GPIO 2"); break;
|
||
|
|
case 3: Serial.println("Touch detected on GPIO 15"); break;
|
||
|
|
case 4: Serial.println("Touch detected on GPIO 13"); break;
|
||
|
|
case 5: Serial.println("Touch detected on GPIO 12"); break;
|
||
|
|
case 6: Serial.println("Touch detected on GPIO 14"); break;
|
||
|
|
case 7: Serial.println("Touch detected on GPIO 27"); break;
|
||
|
|
case 8: Serial.println("Touch detected on GPIO 33"); break;
|
||
|
|
case 9: Serial.println("Touch detected on GPIO 32"); break;
|
||
|
|
default: Serial.println("Wakeup not by touchpad"); break;
|
||
|
|
}
|
||
|
|
#else
|
||
|
|
if (touchPin < TOUCH_PAD_MAX) {
|
||
|
|
Serial.printf("Touch detected on GPIO %d\n", touchPin);
|
||
|
|
} else {
|
||
|
|
Serial.println("Wakeup not by touchpad");
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
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 and touchpad too
|
||
|
|
print_wakeup_reason();
|
||
|
|
print_wakeup_touchpad();
|
||
|
|
|
||
|
|
#if CONFIG_IDF_TARGET_ESP32
|
||
|
|
//Setup sleep wakeup on Touch Pad 3 + 7 (GPIO15 + GPIO 27)
|
||
|
|
touchSleepWakeUpEnable(T3, THRESHOLD);
|
||
|
|
touchSleepWakeUpEnable(T7, THRESHOLD);
|
||
|
|
|
||
|
|
#else //ESP32-S2 + ESP32-S3 + ESP32-P4
|
||
|
|
//Setup sleep wakeup on Touch Pad 3 (GPIO3)
|
||
|
|
touchSleepWakeUpEnable(T3, THRESHOLD);
|
||
|
|
|
||
|
|
#endif
|
||
|
|
|
||
|
|
//Go to sleep now
|
||
|
|
Serial.println("Going to sleep now");
|
||
|
|
esp_deep_sleep_start();
|
||
|
|
Serial.println("This will never be printed");
|
||
|
|
}
|
||
|
|
|
||
|
|
void loop() {
|
||
|
|
//This will never be reached
|
||
|
|
}
|