void app_main() { /* Configure the button GPIO as input, enable wakeup */ const int button_gpio_num = BUTTON_GPIO_NUM_DEFAULT; const int wakeup_level = BUTTON_WAKEUP_LEVEL_DEFAULT; gpio_config_t config = { .pin_bit_mask = BIT64(button_gpio_num), .mode = GPIO_MODE_INPUT }; ESP_ERROR_CHECK(gpio_config(&config)); gpio_wakeup_enable(button_gpio_num, wakeup_level == 0 ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL); while (true) { /* Wake up in 2 seconds, or when button is pressed */ esp_sleep_enable_timer_wakeup(2000000); esp_sleep_enable_gpio_wakeup(); /* Wait until GPIO goes high */ if (rtc_gpio_get_level(button_gpio_num) == wakeup_level) { printf("Waiting for GPIO%d to go high...\n", button_gpio_num); do { vTaskDelay(pdMS_TO_TICKS(10)); } while (rtc_gpio_get_level(button_gpio_num) == wakeup_level); } printf("Entering light sleep\n"); /* To make sure the complete line is printed before entering sleep mode, * need to wait until UART TX FIFO is empty: */ uart_tx_wait_idle(CONFIG_CONSOLE_UART_NUM); /* Get timestamp before entering sleep */ int64_t t_before_us = esp_timer_get_time(); /* Enter sleep mode */ esp_light_sleep_start(); /* Execution continues here after wakeup */ /* Get timestamp after waking up from sleep */ int64_t t_after_us = esp_timer_get_time(); /* Determine wake up reason */ const char* wakeup_reason; switch (esp_sleep_get_wakeup_cause()) { case ESP_SLEEP_WAKEUP_TIMER: wakeup_reason = "timer"; break; case ESP_SLEEP_WAKEUP_GPIO: wakeup_reason = "pin"; break; default: wakeup_reason = "other"; break; } printf("Returned from light sleep, reason: %s, t=%lld ms, slept for %lld ms\n", wakeup_reason, t_after_us / 1000, (t_after_us - t_before_us) / 1000); } }
static void debug_deepsleep(void *arg) { ESP_LOGI(TAG, "sleep for 10 seconds"); esp_sleep_enable_timer_wakeup(10 * 1000 * 1000); esp_deep_sleep_start(); }