Wake up using button A or button b

  • Hey, i try to wakeup m5stickc from deepsleep using button A or B with this function : esp_sleep_enable_ext1_wakeup with ESP_EXT1_WAKEUP_ANY_HIGH mode. Problem encountered is that A and B button have pullup enabled.

    Im aware that A and B button pull their respective GPIO low when pressed. How to activated pulldown for these buttons? i can't use ESP_EXT1_WAKEUP_ALL_LOW mode because wake up enabled when all GPIOs are low...

    gpio_pulldown_en(); has no effect!

    This is my code:

    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();
        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 GPIO that triggered the wakeup
    void print_GPIO_wake_up(){
      uint64_t GPIO_reason = esp_sleep_get_ext1_wakeup_status();
      Serial.print("GPIO that triggered the wake up: GPIO ");
      Serial.println((log(GPIO_reason))/log(2), 0);
    void setup(){
      delay(1000); //Take some time to open up the Serial Monitor
      //Increment boot number and print it every reboot
      Serial.println("Boot number: " + String(bootCount));
      //Print the wakeup reason for ESP32
      //Print the GPIO used to wake up
      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.
      //If you were to use ext1, you would use it like
      //Go to sleep now
      Serial.println("Going to sleep now");
      Serial.println("This will never be printed");
    void loop(){
      //This is not going to be called

    Thanks for your help

  • Hello @irokoi

    have you considered using ext0 instead? E.g.

    esp_sleep_enable_ext0_wakeup(GPIO_NUM_37, LOW);
    esp_sleep_enable_ext0_wakeup(GPIO_NUM_39, LOW);


  • thanks, I think it's the only solution ;)