void app_main() { esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause(); if (cause != ESP_SLEEP_WAKEUP_ULP) { printf("Not ULP wakeup\n"); init_ulp_program(); } else { printf("Deep sleep wakeup\n"); printf("ULP did %d measurements since last reset\n", ulp_sample_counter & UINT16_MAX); printf("Thresholds: low=%d high=%d\n", ulp_low_thr, ulp_high_thr); ulp_last_result &= UINT16_MAX; printf("Value=%d was %s threshold\n", ulp_last_result, ulp_last_result < ulp_low_thr ? "below" : "above"); } printf("Entering deep sleep\n\n"); start_ulp_program(); ESP_ERROR_CHECK( esp_sleep_enable_ulp_wakeup() ); esp_deep_sleep_start(); }
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); } }