ESP32-C3 super mini, как разбудить от кнопки?

Здравствуйте,
никак не найду пример, который бы помог вывести ESP32-C3 super mini из deep-sleep.
пример из ArduinoIDE не хочет

C:\usr\M\Arduino\ArduinoIDE_\portable\sketchbook\_TESTS\_ESP32tests\ESP32-C3 mini\DeepSleepAwakeGPIO0\DeepSleepAwakeGPIO0.ino: In function 'void setup()':
DeepSleepAwakeGPIO0:59:3: error: 'esp_sleep_enable_ext0_wakeup' was not declared in this scope; did you mean 'esp_sleep_enable_bt_wakeup'?
   59 |   esp_sleep_enable_ext0_wakeup(pin_Touch, 1);  //1 = High, 0 = Low
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |   esp_sleep_enable_bt_wakeup
exit status 1
'esp_sleep_enable_ext0_wakeup' was not declared in this scope; did you mean 'esp_sleep_enable_bt_wakeup'?

из документации на ESP32-C3

esp_err_tgpio_wakeup_enable(gpio_num_tgpio_num, gpio_int_type_tintr_type)
Enable GPIO wake-up function.

Return
ESP_OK Success

ESP_ERR_INVALID_ARG Parameter error

Parameters
gpio_num: GPIO number.

intr_type: GPIO wake-up type. Only GPIO_INTR_LOW_LEVEL or GPIO_INTR_HIGH_LEVEL can be used.

кнопка повешена на GPIO0, при нажатии на GPIO0 получаем HIGH
но после засыпания - не просыпается
вот setup()

// для отключения BT Wifi (see setup())
#include <esp_bt.h>
#include <esp_wifi.h>

#define pin_LED 8
#define pin_IR 1
#define pin_Touch 0
#define pin_WAKEUP GPIO_NUM_0
#define pin_Mosfet 10

#include "driver/rtc_io.h"

// the setup function runs once when you press reset or power the board
void setup() 
{
  
  Serial.begin(115200);
  delay(100);
  Serial.println(__FILE__);
  Serial.println(__DATE__);
  //Serial.print("Welcome for BLINK at ESP32-C3 mini\n");
  delay(100);  // initialize digital pin LED_BUILTIN as an output.
  // pinMode(LED_BUILTIN, OUTPUT);
  
  // turn off BT & WiFi
  esp_wifi_stop();
  esp_wifi_deinit();
  esp_bt_controller_disable();
  
  pinMode(pin_LED,OUTPUT);
  digitalWrite(pin_LED,HIGH); // turn off
  pinMode(pin_IR,INPUT);
  pinMode(pin_Touch,INPUT);
  pinMode(pin_Mosfet,OUTPUT);

  Serial.print("pin_Touch="); Serial.println(pin_Touch);
  Serial.print("pin_WAKEUP="); Serial.println(pin_WAKEUP);
  
  // разрешение пробуждения от GPIO (pin_Touch -> HIGH)
  /**/
  // pin_WAKEUP - тоже самое  что и pin_Touch
  if (ESP_OK!=gpio_wakeup_enable(pin_WAKEUP, GPIO_INTR_HIGH_LEVEL)) // HIGH or LOW
  {
    Serial.println("Error define gpio wakeup");  
    delay(5000);
  }
  Serial.println("after gpio_wakeup_enable()");
  delay(1000); 
  esp_sleep_enable_gpio_wakeup();
  /**/
  // esp_sleep_enable_ext0_wakeup(pin_Touch, 1);  //1 = High, 0 = Low

  // уход в сон
  //  esp_deep_sleep_start();
 

}

ошибок выполнения gpio_wakeup_enable - нет.
если я правильно понимаю, то при появлении HIGH на GPIO0 еспшка должна перезагрузиться? Но ничего не происходит… просто спит.

Помогите пжлста.

После многочисленных попыток заработал такой вариант разрешения пробуждения:

esp_deep_sleep_enable_gpio_wakeup(1 << pin_Touch, ESP_GPIO_WAKEUP_GPIO_HIGH);

Только непонимаю, что за конcтрукция в параметре (1 << GPIO_N… )
может кто даст пинок в нужном направлении, что бы понять что за операция такая в этой функции.

  uint64_t wakeup_pin_mask = 1;
  // получение битовой маски
  for (uint8_t i = 0; i < IGNITION_PIN; i++)
  {
    wakeup_pin_mask *= 2;
  }

  esp_deep_sleep_enable_gpio_wakeup(wakeup_pin_mask, ESP_GPIO_WAKEUP_GPIO_HIGH);
  esp_deep_sleep_start();

Используется не номер пина, а битовая маска пинов.

GPIO0 - 0x01 (0b00000001)
GPIO1 - 0x02 (0b00000010)
GPIO2 - 0x04 (0b00000100)
GPIO3 - 0x08 (0b00001000)
GPIO4 - 0x10 (0b00010000)
GPIO5 - 0x20 (0b00100000)

Если нужно использовать два (три и т.д.) пина - просто суммируете, например, для GPIO0 и GPIO4 это будет 0x011 (0b00010001)

Да, так и есть, после экспериментов оказалось, что можно последовательно вызвать повторно функцию с другим пином, будет просыпаться по любому из них.
… ну вот где это написано??? столько разной документации и везде чуть чуть по разному. И где то написано, что указывается номер GPIO, а получается, что не совсем…
Так и ходишь по граблям … Эх. Ну да ладно. Разобрались.

я резетом пробуждаю всегда

Строго говоря, в одном месте это нигде не написано: сначала в одном месте нужно прочитать, что такое операция сложения, потом в другом месте найти таблицу умножения и т.д.
Просто писатели подобной документации предполагают, что читатель УЖЕ знаком с таблицей умножения, и не тратят силы на объяснение последней.

1 лайк