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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
 
Нет описания правки
 
(не показано 5 промежуточных версий 2 участников)
Строка 1: Строка 1:
{{ESP32 панель перехода}}
{{ESP32 панель перехода}}
{{Перевод от Сubewriter}}
{{Перевод от Сubewriter}}
{{Myagkij-редактор}}
{{Myagkij-редактор}}
{{Черновик}}


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


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
esp_sleep_enable_touchpad_wakeup();
esp_sleep_enable_touchpad_wakeup();
</syntaxhighlight>
</syntaxhighlight>
Строка 20: Строка 17:
=== Задаем порог ===
=== Задаем порог ===


'''Примечание:''' Перед тем, как продолжить, рекомендуем ознакомиться (если еще не ознакомились) с примером [[ESP32:Примеры/Считывание данных с тактильного датчика|Считывание данных с тактильного датчика]]. Он содержит подробное описание тактильных (емкостно-сенсорных) контактов [[ESP32]].
{{Примечание1|1=Перед тем, как продолжить, рекомендуем ознакомиться (если еще не ознакомились) с примером [[ESP32:Примеры/Считывание данных с тактильного датчика|Считывание данных с тактильного датчика]]. Он содержит подробное описание тактильных (емкостно-сенсорных) контактов [[ESP32]].}}


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


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
#define Threshold 40 /* чем больше это значение,
#define Threshold 40 /* чем больше это значение,
                         тем выше чувствительность сенсора */
                         тем выше чувствительность сенсора */
Строка 35: Строка 32:
Чтобы сделать этот емкостно-сенсорный контакт инициатором пробуждения, нам нужно привязать к нему прерывание с функцией обратного вызова. Это может выглядеть примерно так:
Чтобы сделать этот емкостно-сенсорный контакт инициатором пробуждения, нам нужно привязать к нему прерывание с функцией обратного вызова. Это может выглядеть примерно так:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
// задаем прерывание для сенсорного контакта 3 (GPIO15):
// задаем прерывание для сенсорного контакта 3 (GPIO15):
   touchAttachInterrupt(T3, callback, Threshold);
   touchAttachInterrupt(T3, callback, Threshold);
Строка 44: Строка 41:
Функция '''callback()''' будет выполнена, только если [[ESP32]] будет ''«разбуженной»''. Если [[ESP32]] в режиме сна, и вы коснулись контакта '''T3''', а потом сразу отпустили его, то плата ''«проснется»'', но функция '''callback()''' от этого не запустится. Для того, чтобы она запустилась, вам необходимо какое-то время нажимать на контакт. В нашем случае функция обратного вызова '''callback()''' будет пустой.
Функция '''callback()''' будет выполнена, только если [[ESP32]] будет ''«разбуженной»''. Если [[ESP32]] в режиме сна, и вы коснулись контакта '''T3''', а потом сразу отпустили его, то плата ''«проснется»'', но функция '''callback()''' от этого не запустится. Для того, чтобы она запустилась, вам необходимо какое-то время нажимать на контакт. В нашем случае функция обратного вызова '''callback()''' будет пустой.


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
void callback(){
void callback(){
   // пустая функция обратного вызова
   // пустая функция обратного вызова
Строка 54: Строка 51:
Далее пишем функцию [[esp_sleep_enable_touchpad_wakeup()]], чтобы сделать сенсорные контакты инициаторами пробуждения [[ESP32]].
Далее пишем функцию [[esp_sleep_enable_touchpad_wakeup()]], чтобы сделать сенсорные контакты инициаторами пробуждения [[ESP32]].


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
// делаем сенсорные контакты инициаторами пробуждения:
// делаем сенсорные контакты инициаторами пробуждения:
esp_sleep_enable_touchpad_wakeup();
esp_sleep_enable_touchpad_wakeup();
Строка 84: Строка 81:
==Схема==
==Схема==


{{Спойлер|На данной схеме используется плата [[ESP32S-HiLetgo]], если вы используете другую, сверьтесь с вашей распиновкой.}}
{{Примечание1|На данной схеме используется плата [[ESP32S-HiLetgo]], если вы используете другую, сверьтесь с вашей распиновкой.}}


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


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
Режим глубокого сна и пробуждение от прикосновения
Режим глубокого сна и пробуждение от прикосновения
Строка 216: Строка 213:


<references />
<references />
{{Навигационная таблица/Портал/ESP32}}


[[Категория:ESP32]]
[[Категория:ESP32]]

Текущая версия от 09:20, 18 июня 2023

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


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

Вы можете вывести 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 при помощи сенсорных контактов.

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

Схема

Примечание

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

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

Код

/*
Режим глубокого сна и пробуждение от прикосновения
=====================================
Этот код демонстрирует, как пробуждать ESP32 
от режима глубокого сна при помощи прикосновений,
а также как сохранять данные в RTC-память,
чтобы потом снова использовать их между загрузками.

Этот код распространяется по лицензии всеобщего достояния.
Автор: Пранав Черукупалли <cherukupallip@gmail.com>
*/

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

RTC_DATA_ATTR int bootCount = 0;

/*
Эта функция печатает причину вывода ESP32 из режима глубокого сна 
*/
void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;

  wakeup_reason = esp_sleep_get_wakeup_cause();

  switch(wakeup_reason)
  {
    case 1  : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
                          // "Пробуждение от внешнего сигнала при помощи RTC_IO"
    case 2  : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
                          // "Пробуждение от внешнего сигнала при помощи RTC_CNTL"
    case 3  : Serial.println("Wakeup caused by timer"); break;
                          // "Пробуждение по таймеру"
    case 4  : Serial.println("Wakeup caused by touchpad"); break;
                          // "Пробуждение от прикосновений"
    case 5  : Serial.println("Wakeup caused by ULP program"); break;
                          // "Пробуждение от ULP-программы"
    default : Serial.println("Wakeup was not caused by deep sleep"); break;
                          // "Пробуждение не связано с режимом глубокого сна"
  }
}

/*
Эта функция печатает номер емкостно-сенсорного контакта,
при помощи которого ESP32 выводится из режима глубокого сна
*/
void print_wakeup_touchpad(){
  touch_pad_t touchPin;

  touchPin = esp_sleep_get_touchpad_wakeup_status();

  switch(touchPin)
  {
    case 0  : Serial.println("Touch detected on GPIO 4"); break;
                          // "Обнаружено касание на контакте GPIO4" 
    case 1  : Serial.println("Touch detected on GPIO 0"); break;
                          // "Обнаружено касание на контакте GPIO0"
    case 2  : Serial.println("Touch detected on GPIO 2"); break;
                          // "Обнаружено касание на контакте GPIO2"
    case 3  : Serial.println("Touch detected on GPIO 15"); break;
                          // "Обнаружено касание на контакте GPIO15"
    case 4  : Serial.println("Touch detected on GPIO 13"); break;
                          // "Обнаружено касание на контакте GPIO13"
    case 5  : Serial.println("Touch detected on GPIO 12"); break;
                          // "Обнаружено касание на контакте GPIO12"
    case 6  : Serial.println("Touch detected on GPIO 14"); break;
                          // "Обнаружено касание на контакте GPIO14"
    case 7  : Serial.println("Touch detected on GPIO 27"); break;
                          // "Обнаружено касание на контакте GPIO27"
    case 8  : Serial.println("Touch detected on GPIO 33"); break;
                          // "Обнаружено касание на контакте GPIO33"
    case 9  : Serial.println("Touch detected on GPIO 32"); break;
                          // "Обнаружено касание на контакте GPIO32"
    default : Serial.println("Wakeup not by touchpad"); break;
                          // "Пробуждение вызвано не касанием"
  }
}

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

void setup(){
  Serial.begin(115200);
  delay(1000); // даем время на запуск последовательной коммуникации 

  // увеличиваем счетчик загрузок
  // и печатаем значение в переменной «bootCount» с каждой загрузкой:
  ++bootCount;
  Serial.println("Boot number: " + String(bootCount));
             //  "Количество загрузок: "

  // печатаем причину пробуждения 
  // и номер сенсорного контакта, через который была разбужена ESP32:
  print_wakeup_reason();
  print_wakeup_touchpad();

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

  // переводим ESP32 в режим пробуждения
  // при помощи сенсорно-емкостных контактов:
  esp_sleep_enable_touchpad_wakeup();

  // переходим в режим сна:
  Serial.println("Going to sleep now");
             //  "Переход в режим сна"
  delay(1000);
  esp_deep_sleep_start();
  Serial.println("This will never be printed");
             //  "Это никогда не будет напечатано "
}

void loop(){
  // до обработки этого фрагмента дело никогда не дойдет
}

См.также

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