Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

ESP32:Примеры/Режим глубокого сна: пробуждение при помощи прикосновения

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2753 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Режим глубокого сна: пробуждение при помощи прикосновения

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

Перевод ESP32 в режим пробуждения при помощи сенсорных контактов выполняется очень просто. Вам нужно лишь добавить в скетч IDE Arduino следующую функцию:

esp_sleep_enable_touchpad_wakeup();

Как работает этот код

Задаем порог

Примечание: Перед тем, как продолжить, рекомендуем ознакомиться (если еще не ознакомились) с примером Считывание данных с тактильного датчика. Он содержит подробное описание тактильных (емкостно-сенсорных) контактов ESP32.

В начале кода задаем пороговое значение для тактильных контактов.

#define Threshold 40 /* чем больше это значение,
                        тем выше чувствительность сенсора */

При прикосновении к тактильному контакту считываемое значение уменьшится. Это пороговое значение необходимо для того, чтобы вывести ESP32 из глубокого сна, если оно упадет ниже «40». Но вы можете, если хотите, поэкспериментировать и задать вместо «40» какое-то другое число.

Задаем прерывание

Чтобы сделать этот емкостно-сенсорный контакт инициатором пробуждения, нам нужно привязать к нему прерывание с функцией обратного вызова. Это может выглядеть примерно так:

// задаем прерывание для сенсорного контакта 3 (GPIO15):
  touchAttachInterrupt(T3, callback, Threshold);

В этой строчке мы задаем, что если значение на 3 сенсорном контакте (GPIO15) упадет ниже порога, заданного в переменной «Threshold», это разбудит ESP32.

Функция callback() будет выполнена, только если ESP32 будет «разбуженной». Если ESP32 в режиме сна, и вы коснулись контакта T3, а потом сразу отпустили его, то плата «проснется», но функция callback() от этого не запустится. Для того, чтобы она запустилась, вам необходимо какое-то время нажимать на контакт. В нашем случае функция обратного вызова callback() будет пустой.

void callback(){
  // пустая функция обратного вызова
}

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

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

// делаем сенсорные контакты инициаторами пробуждения:
esp_sleep_enable_touchpad_wakeup();

Проверка проекта-примера

Загружаем код на ESP32 и открываем монитор порта на скорости 115200 бод.

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

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

Когда вы касаетесь контакта, ESP32 сообщит в мониторе порта следующие данные: номер загрузки, причину пробуждения и GPIO-контакт, на котором было обнаружено касание.

Esp32 deepsleep touch wakeup 1.PNG

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

Необходимое оборудование

Схема

Ambox content.png На данной схеме используется плата ESP32S-HiLetgo, если вы используете другую, сверьтесь с вашей распиновкой.


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

Esp32 deepsleep touch wakeup 2.PNG.png

Код

  1. /*
  2. Режим глубокого сна и пробуждение от прикосновения
  3. =====================================
  4. Этот код демонстрирует, как пробуждать ESP32
  5. от режима глубокого сна при помощи прикосновений,
  6. а также как сохранять данные в RTC-память,
  7. чтобы потом снова использовать их между загрузками.
  8.  
  9. Этот код распространяется по лицензии всеобщего достояния.
  10. Автор: Пранав Черукупалли <cherukupallip@gmail.com>
  11. */
  12.  
  13. #define Threshold 40 /* чем больше это значение,
  14.                         тем выше чувствительность сенсора */
  15.  
  16. RTC_DATA_ATTR int bootCount = 0;
  17.  
  18. /*
  19. Эта функция печатает причину вывода ESP32 из режима глубокого сна
  20. */
  21. void print_wakeup_reason(){
  22.   esp_sleep_wakeup_cause_t wakeup_reason;
  23.  
  24.   wakeup_reason = esp_sleep_get_wakeup_cause();
  25.  
  26.   switch(wakeup_reason)
  27.   {
  28.     case 1  : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
  29.                           // "Пробуждение от внешнего сигнала при помощи RTC_IO"
  30.     case 2  : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
  31.                           // "Пробуждение от внешнего сигнала при помощи RTC_CNTL"
  32.     case 3  : Serial.println("Wakeup caused by timer"); break;
  33.                           // "Пробуждение по таймеру"
  34.     case 4  : Serial.println("Wakeup caused by touchpad"); break;
  35.                           // "Пробуждение от прикосновений"
  36.     case 5  : Serial.println("Wakeup caused by ULP program"); break;
  37.                           // "Пробуждение от ULP-программы"
  38.     default : Serial.println("Wakeup was not caused by deep sleep"); break;
  39.                           // "Пробуждение не связано с режимом глубокого сна"
  40.   }
  41. }
  42.  
  43. /*
  44. Эта функция печатает номер емкостно-сенсорного контакта,
  45. при помощи которого ESP32 выводится из режима глубокого сна
  46. */
  47. void print_wakeup_touchpad(){
  48.   touch_pad_t touchPin;
  49.  
  50.   touchPin = esp_sleep_get_touchpad_wakeup_status();
  51.  
  52.   switch(touchPin)
  53.   {
  54.     case 0  : Serial.println("Touch detected on GPIO 4"); break;
  55.                           // "Обнаружено касание на контакте GPIO4"
  56.     case 1  : Serial.println("Touch detected on GPIO 0"); break;
  57.                           // "Обнаружено касание на контакте GPIO0"
  58.     case 2  : Serial.println("Touch detected on GPIO 2"); break;
  59.                           // "Обнаружено касание на контакте GPIO2"
  60.     case 3  : Serial.println("Touch detected on GPIO 15"); break;
  61.                           // "Обнаружено касание на контакте GPIO15"
  62.     case 4  : Serial.println("Touch detected on GPIO 13"); break;
  63.                           // "Обнаружено касание на контакте GPIO13"
  64.     case 5  : Serial.println("Touch detected on GPIO 12"); break;
  65.                           // "Обнаружено касание на контакте GPIO12"
  66.     case 6  : Serial.println("Touch detected on GPIO 14"); break;
  67.                           // "Обнаружено касание на контакте GPIO14"
  68.     case 7  : Serial.println("Touch detected on GPIO 27"); break;
  69.                           // "Обнаружено касание на контакте GPIO27"
  70.     case 8  : Serial.println("Touch detected on GPIO 33"); break;
  71.                           // "Обнаружено касание на контакте GPIO33"
  72.     case 9  : Serial.println("Touch detected on GPIO 32"); break;
  73.                           // "Обнаружено касание на контакте GPIO32"
  74.     default : Serial.println("Wakeup not by touchpad"); break;
  75.                           // "Пробуждение вызвано не касанием"
  76.   }
  77. }
  78.  
  79. void callback(){
  80.   // пустая функция обратного вызова
  81. }
  82.  
  83. void setup(){
  84.   Serial.begin(115200);
  85.   delay(1000); // даем время на запуск последовательной коммуникации
  86.  
  87.   // увеличиваем счетчик загрузок
  88.   // и печатаем значение в переменной «bootCount» с каждой загрузкой:
  89.   ++bootCount;
  90.   Serial.println("Boot number: " + String(bootCount));
  91.              //  "Количество загрузок: "
  92.  
  93.   // печатаем причину пробуждения
  94.   // и номер сенсорного контакта, через который была разбужена ESP32:
  95.   print_wakeup_reason();
  96.   print_wakeup_touchpad();
  97.  
  98.   // задаем прерывание для сенсорного контакта 3 (GPIO15):
  99.   touchAttachInterrupt(T3, callback, Threshold);
  100.  
  101.   // переводим ESP32 в режим пробуждения
  102.   // при помощи сенсорно-емкостных контактов:
  103.   esp_sleep_enable_touchpad_wakeup();
  104.  
  105.   // переходим в режим сна:
  106.   Serial.println("Going to sleep now");
  107.              //  "Переход в режим сна"
  108.   delay(1000);
  109.   esp_deep_sleep_start();
  110.   Serial.println("This will never be printed");
  111.              //  "Это никогда не будет напечатано "
  112. }
  113.  
  114. void loop(){
  115.   // до обработки этого фрагмента дело никогда не дойдет
  116. }

См.также

Внешние ссылки