Добавить в корзинуПозвонить
Найти в Дзене
Электроника, ESP32, Arduino

ESP32 Работа с сенсорным интерфейсом в процедуре прерываний

В среде Arduino IDE от разработчика можно найти 2 готовых примера, которые позволяют работать с сенсорным интерфейсом используя механизм прерываний, что позволяет не опрашивать сенсорные кнопки в основном цикле и не пропустить факт прикосновения к сенсорной площадке. У меня собран прототип на базе ESP32-S3 - поэтому расскажу что именно делает этот пример. Торчащая из ручки зеленого энкодера пластинка подключена к GPOI 7 Пример для работы с одной сенсорной кнопкой на GPOI 7 будет выглядеть следующим образом: При прикосновении в монитор порта выводится "Прикоснулись", если палец от сенсора убрать "Откоснулись" - полный аналог функций для обычной механической кнопки "Нажали"/"Отпустили" Как работает этот пример я думаю описывать не нужно. При прикосновении к кнопке вызывается процедура обработки прерываний: которая изменяет значение переменной touch1detected В основном цикле в любой удобный нам момент проверяем что она имеет значение true и вызываем функцию: bool touchInterruptGetLastStat

В среде Arduino IDE от разработчика можно найти 2 готовых примера, которые позволяют работать с сенсорным интерфейсом используя механизм прерываний, что позволяет не опрашивать сенсорные кнопки в основном цикле и не пропустить факт прикосновения к сенсорной площадке.

  • для платформы ESP32 пример называется TouchButton;
  • для платформ ESP32-S2/S3 пример называется TouchButtonV2

У меня собран прототип на базе ESP32-S3 - поэтому расскажу что именно делает этот пример.

-2

Торчащая из ручки зеленого энкодера пластинка подключена к GPOI 7

-3

Пример для работы с одной сенсорной кнопкой на GPOI 7 будет выглядеть следующим образом:

-4

При прикосновении в монитор порта выводится "Прикоснулись", если палец от сенсора убрать "Откоснулись" - полный аналог функций для обычной механической кнопки "Нажали"/"Отпустили"

-5

Как работает этот пример я думаю описывать не нужно. При прикосновении к кнопке вызывается процедура обработки прерываний:

-6

которая изменяет значение переменной touch1detected

В основном цикле в любой удобный нам момент проверяем что она имеет значение true и вызываем функцию:

bool touchInterruptGetLastStatus(uint8_t pin);

-7

которая возвращает значение true, если сенсорная панель была нажата и продолжает удерживаться, или false в противном случае.

У меня кнопочка не очень чтобы стандартная (в качестве нее используется корпус энкодера - ручка которого выведена на металлическую площадку в верхней части) поэтому изредка наблюдались ложные срабатывания при прикосновении к самой пластиковой ручке. Я залил другой тестовый пример:

Пока ручку не трогаем - значения телепаются в районе: 33000

-8

Если ручку плотно обхватить пальцами получаются значения в районе 37000

-9

Если коснутся механической площадки - больше 170000

-10

Запас большой. Залапанная пальцами ручка выдает в районе 37000. Возьмем с запасом 38000 - 33000 = 5000;

Вписываем это значение в скетч.

-11

Теперь можно как угодно "обниматься" с ручкой, сенсорная кнопка сработает только при прикосновении к металлической площадке.

-12

ВАЖНО! Функция обработки прерываний вызывается 2 раза в тот момент когда прикоснулись и в тот момент когда убрали палец с контактной площадки. Поэтому если основная программа будет занята чем то серьезным (например искать что-то в сети Интернет) по времени превышающим съем пальца с контактной площадки событие "Прикосновение" может быть пропущено.

Засунем в скетч небольшой delay();

-13

Факт снятия пальца с контактной площадки мы не пропустим никогда, а вот факт прикосновения можем пропустить.

Если нужен только "Click" можно воспользоваться специфичной для ESP32-S2/S3 функцией (touchInterruptGetLastStatus) - только вызывать её не в основном цикле, а в процедуре прерываний.

-14

Теперь не важно как будет написан основной цикл. Мы не пропустим прикосновение и код в результате прикосновения будет выполнен только ОДИН раз.

Документация от производителя доступна по этой ссылке.

TOUCH - - — Arduino ESP32 latest documentation

Там можно найти как переписать код и под ESP32. Примеры из этой статьи соберутся только для плат ESP32-S2/S3.

Калибровать сенсорный интерфейс разумеется необходимо после сборки конструкции, потому что первоначальные значения будут зависеть даже от длинны дорожек на печатной плате.

-15

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

Про чудо кнопку из ручки энкодера я писал тут:

Оглавление канала доступно тут:

Всем удачи!