ESP32:Примеры/Режим глубокого сна: пробуждение при помощи прикосновения: различия между версиями
Myagkij (обсуждение | вклад) (→Схема) |
Myagkij (обсуждение | вклад) Нет описания правки |
||
(не показано 5 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
{{ESP32 панель перехода}} | {{ESP32 панель перехода}} | ||
{{Перевод от Сubewriter}} | {{Перевод от Сubewriter}} | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=Режим глубокого сна: пробуждение при помощи прикосновения= | =Режим глубокого сна: пробуждение при помощи прикосновения= | ||
Строка 12: | Строка 9: | ||
Перевод [[ESP32]] в режим пробуждения при помощи сенсорных контактов выполняется очень просто. Вам нужно лишь добавить в скетч [[IDE Arduino]] следующую функцию: | Перевод [[ESP32]] в режим пробуждения при помощи сенсорных контактов выполняется очень просто. Вам нужно лишь добавить в скетч [[IDE Arduino]] следующую функцию: | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
esp_sleep_enable_touchpad_wakeup(); | esp_sleep_enable_touchpad_wakeup(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 20: | Строка 17: | ||
=== Задаем порог === | === Задаем порог === | ||
{{Примечание1|1=Перед тем, как продолжить, рекомендуем ознакомиться (если еще не ознакомились) с примером [[ESP32:Примеры/Считывание данных с тактильного датчика|Считывание данных с тактильного датчика]]. Он содержит подробное описание тактильных (емкостно-сенсорных) контактов [[ESP32]].}} | |||
В начале кода задаем пороговое значение для тактильных контактов. | В начале кода задаем пороговое значение для тактильных контактов. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
#define Threshold 40 /* чем больше это значение, | #define Threshold 40 /* чем больше это значение, | ||
тем выше чувствительность сенсора */ | тем выше чувствительность сенсора */ | ||
Строка 35: | Строка 32: | ||
Чтобы сделать этот емкостно-сенсорный контакт инициатором пробуждения, нам нужно привязать к нему прерывание с функцией обратного вызова. Это может выглядеть примерно так: | Чтобы сделать этот емкостно-сенсорный контакт инициатором пробуждения, нам нужно привязать к нему прерывание с функцией обратного вызова. Это может выглядеть примерно так: | ||
<syntaxhighlight lang="c | <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 | <syntaxhighlight lang="c"> | ||
void callback(){ | void callback(){ | ||
// пустая функция обратного вызова | // пустая функция обратного вызова | ||
Строка 54: | Строка 51: | ||
Далее пишем функцию [[esp_sleep_enable_touchpad_wakeup()]], чтобы сделать сенсорные контакты инициаторами пробуждения [[ESP32]]. | Далее пишем функцию [[esp_sleep_enable_touchpad_wakeup()]], чтобы сделать сенсорные контакты инициаторами пробуждения [[ESP32]]. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
// делаем сенсорные контакты инициаторами пробуждения: | // делаем сенсорные контакты инициаторами пробуждения: | ||
esp_sleep_enable_touchpad_wakeup(); | esp_sleep_enable_touchpad_wakeup(); | ||
Строка 84: | Строка 81: | ||
==Схема== | ==Схема== | ||
{{ | {{Примечание1|На данной схеме используется плата [[ESP32S-HiLetgo]], если вы используете другую, сверьтесь с вашей распиновкой.}} | ||
Чтобы проверить этот проект, подключите провод-перемычку к контакту GPIO15 как показано на схеме ниже. | Чтобы проверить этот проект, подключите провод-перемычку к контакту GPIO15 как показано на схеме ниже. | ||
Строка 92: | Строка 89: | ||
==Код== | ==Код== | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <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();
Как работает этот код
Задаем порог
В начале кода задаем пороговое значение для тактильных контактов.
#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 при помощи сенсорных контактов.
- Во-первых, мы привязали прерывание к сенсорному контакту при помощи функции touchAttachInterrupt(Touchpin, callback, Threshold)
- Во-вторых, мы перевели ESP32 в режим пробуждения от сенсорных контактов при помощи esp_sleep_enable_touchpad_wakeup()
- Наконец, в-третьих, мы снова ввели ESP32 в режим глубокого сна при помощи функции esp_deep_sleep_start()
Необходимое оборудование
- Плата ESP32 - 1шт.;
- Макетная плата - 1шт.;
- Провода-перемычки - 1шт.;
Схема
Чтобы проверить этот проект, подключите провод-перемычку к контакту 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(){
// до обработки этого фрагмента дело никогда не дойдет
}
См.также
Внешние ссылки