ESP32 Выход из глубокого сна с помощью касания

В этом руководстве показано, как вывести ESP32 из глубокого сна, используя сенсорные контакты. ESP32 будет программироваться с помощью Arduino IDE.

ESP32 может проснуться от глубокого сна, используя несколько источников пробуждения: таймер, внешнее пробуждение и пробуждение от прикосновения. 

ESP32 имеет 10 емкостных сенсорных GPIO. Эти GPIO могут чувствовать изменения во всем, что содержит электрический заряд, например, в коже человека. Таким образом, они могут обнаруживать изменения, возникающие при касании пальцами GPIO. Эти сенсорные контакты ESP32 можно использовать для пробуждения ESP32 от глубокого сна.

Сенсорные штифты

Сенсорные контакты ESP32 выделены цветом на следующей схеме.

Сенсорный датчик 0 соответствует GPIO 4, сенсорный датчик 2 - GPIO 2 и так далее.

 

Включение выхода из сна

 В Arduino IDE нужно использовать следующую функцию:

esp_sleep_enable_touchpad_wakeup()

Код 

Для программирования ESP32 мы будем использовать Arduino IDE. Итак, вам нужно убедиться, что у вас установлена ​​надстройка ESP32.

Давайте посмотрим, как работает touch wake up, на примере из библиотеки. Откройте IDE Arduino, перейдите в «Файл»> «Примеры»> «ESP32»> «Глубокий сон» и откройте пример эскиза TouchWakeUp.

/*
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

This code is under Public Domain License.

Author:
Pranav Cherukupalli <cherukupallip@gmail.com>
*/

#define Threshold 40 /* Greater the value, more the sensitivity */

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(){
  touch_pad_t pin;

  touchPin = esp_sleep_get_touchpad_wakeup_status();

  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;
  }
}

void callback(){
  //placeholder callback function
}

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();

  //Setup interrupt on Touch Pad 3 (GPIO15)
  touchAttachInterrupt(T3, callback, Threshold);

  //Configure Touchpad as wakeup source
  esp_sleep_enable_touchpad_wakeup();

  //Go to sleep now
  Serial.println("Going to sleep now");
  delay(1000);
  esp_deep_sleep_start();
  Serial.println("This will never be printed");
}

void loop(){
  //This will never be reached
}

Установка порога

Первое, что вам нужно сделать, это установить пороговое значение для сенсорных пинов. В этом случае мы устанавливаем порог на 40. Возможно, вам придется изменить пороговое значение в зависимости от вашего проекта.

#define Threshold 40

При прикосновении к сенсорному GPIO значение, считываемое датчиком, уменьшается. Таким образом, вы можете установить пороговое значение, чтобы что-то происходило при обнаружении касания.

Установленное здесь пороговое значение означает, что когда значение, считываемое сенсорным GPIO, ниже 40, ESP32 должен проснуться. Вы можете отрегулировать это значение в соответствии с желаемой чувствительностью.

Добавление прерываний

Вы должны прикрепить прерывания к контактам, чувствительным к прикосновению. При обнаружении касания в указанном GPIO выполняется коллбэк функция . Например, взгляните на следующую строку:

//Setup interrupt on Touch Pad 3 (GPIO15)
touchAttachInterrupt(T3, callback, Threshold); 

Когда значение, считанное на T3 (GPIO 15), меньше, чем значение, установленное в переменной Threshold, ESP32 активируется и выполняется коллбэк функция.

Функция callback() будет выполняться только в том случае, если ESP32 активен.

  • Если вы хотите выполнить функцию callback () при пробуждении ESP32, вам нужно некоторое время удерживать касание на этом выводе до тех пор, пока функция не будет выполнена.

В данном случае функция callback() пуста.

void callback(){
   //placeholder callback function
}

Если вы хотите разбудить ESP32, используя разные сенсорные контакты, вам просто нужно прикрепить прерывания к этим контактам.

Затем вам нужно использовать функцию esp_sleep_enable_touchpad_wakeup(), чтобы установить сенсорные контакты в качестве источника пробуждения.

//Configure Touchpad as wakeup source
esp_sleep_enable_touchpad_wakeup()

Схема

Чтобы проверить этот пример, подключите провод к GPIO 15, как показано на схеме ниже.

(В этой схеме используется версия модуля ESP32 DEVKIT V1 с 30 GPIO - если вы используете другую модель, проверьте схему расположения пинов используемой платы.)

Необходимые детали:

  • Плата разработки ESP32
  • Перемычки

 

Тестирование примера

Загрузите код в ESP32 и откройте Serial Monitor со скоростью 115200 бод.

ESP32 переходит в режим глубокого сна.

Вы можете разбудить его, коснувшись провода, подключенного к контакту 3.

При прикосновении к контакту на последовательном мониторе отображается номер загрузки, причина пробуждения и какой GPIO, чувствительный к прикосновению, вызвал пробуждение.

Завершение

В этой статье мы показали вам, как активировать ESP32 с помощью сенсорных GPIO. При обнаружении касания в указанном GPIO ESP32 просыпается и запускает функцию обратного вызова. После этого он снова ложится спать.