Працюємо з 09:00 до 19:00 Пн-Пт
Київ біля ТЦ Квадрат бул.Перова

Привіт друзі! Тема статті: ESP32 сенсорні входи

Ви напевно вже чули, що у контролера ESP32 є апаратні сенсорні Піни. Сенсорні або по іншому тактильні - означає, що вони реагують на дотик людини, а так само інших тварин. Принцип роботи такої фічі заснований на зміні ємності в ланцюзі входу контролера при дотику.

На зображенні розпіновки ESP32 тактильні піни підписані словом TOUCH. У ESP32 нам доступні 10 таких ємнісних сенсорних входів. Перший тач висить на нульовому GPIO, який тут виведений на кнопку BOOT. Пін, зконфігурований як сенсорний можна зчитувати отримуючи аналогове значення ступеня дотику. Ще такий пін може запускати переривання і навіть пробуджувати контролер від сну. Тепер саме час лайкнути і підписатися на канал і йдемо далі.


Такий інструмент дає нам просту і функціональну можливість будувати проекти з прикольними кнопками

і навіть псевдо-аналоговими слайдерами.


Виготовивши друковану плату з обрисами кнопок і наклеївши зверху наклейку з модними фотошопними кнопками, можна зібрати пристрій на продаж, за який вас буде переповнювати почуття гордості.


Давайте тепер ознайомимося з програмами для обробки ємнісних входів ESP32.

Відкриваємо Arduino IDE і вибираємо контролер ESP32 Dev module. Відкриваємо приклади для ESP32-> Touch-> Touch Interrupt. Скетч TouchInterrupt як бачимо конфігурує переривання на два таких піни. Тут зверніть увагу на позначення номера сенсорного входу. T2 - це другий сенсорний вхід, Т3 - третій і ці позначення не відповідають звичним номерам GPIO. Тому дивіться не плутайте. Хоча сюди можна писати і номер піна GPIO без приставки T. Як вам зручно.

int threshold = 40;
bool touch1detected = false;
bool touch2detected = false;
void gotTouch1(){
 touch1detected = true;
}
void gotTouch2(){
 touch2detected = true;
}
void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("ESP32 Touch Interrupt Test");
  touchAttachInterrupt(T2, gotTouch1, threshold);
  touchAttachInterrupt(T3, gotTouch2, threshold);
}
void loop(){
  if(touch1detected){
    touch1detected = false;
    Serial.println("Touch 1 detected");
  }
  if(touch2detected){
    touch2detected = false;
    Serial.println("Touch 2 detected");
  }
}

Я хочу підключити ємнісну кнопку до щасливого GPIO 13. Відкривши розпіновку ESP32, бачимо TOUCH4, який відповідає піну номер 13. У скетч можна написати четвірку Т4 замість Т2, але так само можна і просто 13

Для підключення переривання по тач-входу передбачена функція з поетичною назвою touchAttachInterrupt. Перший аргумент в ній - це номер тача. Другий - це назва активованої функції при торканні. Третій аргумент - це поріг спрацьовування переривання. Цей поріг встановлюється на початку скетчу. У функціях по перериваннях взводяться змінні - прапорці, які в основному циклі програми активують роздруківку повідомлень в монітор порту. Змінна для порогу спрацьовування тут має тип uint16_t з можливими значеннями в межах від нуля до 65535.

Відразу відкриємо приклад для аналогового читання ємнісного входу TouchRead. І тут я скопіюю два рядки основного циклу і вставлю в програму з перериваннями. Виправлю T0 на 13. Функція touchRead повертає аналогове значення тактильного входу. І отриманий скетч повинен писати нам в монітор порту як спрацювання переривань так і ступінь дотику.

int threshold = 40;
bool touch1detected = false;
bool touch2detected = false;
void gotTouch1(){
 touch1detected = true;
}
void gotTouch2(){
 touch2detected = true;
}
void setup() {
  Serial.begin(115200);
  delay(1000); 
  Serial.println("ESP32 Touch Interrupt Test");
  touchAttachInterrupt(13, gotTouch1, threshold);
  touchAttachInterrupt(T3, gotTouch2, threshold);
}
void loop(){
  if(touch1detected){
    touch1detected = false;
    Serial.println("Touch 1 detected");
  }
  if(touch2detected){
    touch2detected = false;
    Serial.println("Touch 2 detected");
  }
  Serial.println(touchRead(13));
  delay(1000);
}


Тепер завантажуємо скетч в контролер, підключаємо провід до 13 піна і потестуємо. Мені найбільше цікаво, з якої відстані спрацьовує дотик. Доторкаюся до металевої частини проводу, і звичайно спрацьовує переривання і цифра, яка характеризує ступінь дотику падає ближче до нуля. Стає ясно, що чутливість такого ємнісного входу становить в одиницях відстані десь 1 мм.

Якщо ви очікували щось більш далеке, то зверніть увагу на спеціалізовані мікросхеми типу AT42QT або TTP223.

При торканні за ізоляцію проводу, переривання не спрацьовує, тому що поріг у нас виставлено на 40, але падіння цифри вельми помітне і підвищивши значення порогу, можна домогтися переривань і при торканні проводу через ізоляцію. Так само як ми вже обговорювали, цілком реально нанести на контактні площадки сенсорних кнопок декоративну наклейку і домогтися їх надійної роботи. Але для цього звичайно треба мати контактну площадку ширше. Покладемо металеву лінійку на контакт проводу і через діелектричну прокладку натискаємо пальцем - бачимо помітне збільшення чутливості.

Тепер я приберу з програми переривання, зроблю звернення до монітора порту частіше і оновлю програму. Запускаю замість монітора порта плотер для наочності. І пропоную потестить роботу тача у водному середовищі. Наллю водопровідну воду в один судок, а дистильовану в інший, вставлю по черзі в кожен сенсорний провід і поспостерігаємо разом.

І тепер пропоную потестувати інші властивості тактильного входу, використовуючи різні підручні предмети. Для точних вимірювань знову запустимо монітор порту. Мені цікаво, через які предмети і середовища можна передавати сигнал дотику, і так само чи буде реагувати значення нашого параметра на дотик до неживих предметів. Для початку візьмемо кілька фруктів. Підключимося до них проводом і запишемо результати вимірювань в таблицю.

ФруктНе торкаючисьТоркаючись
Банан587
Мандарин680
Ківі699
Грейпфрут600


В результаті бачимо, що найвідчутніше реагують ті фрукти, шкірка яких містить більше води.

Тепер беремо для дослідів вазон і впровадимо провід в землю. Спочатку обхоплю пластмасовий вазон руками на рівні землі. Потім доторкнуся пальцем до землі з краю вазона і нарешті помацаю за стебла і листя квітки.

int threshold = 40;
bool touch1detected = false;
bool touch2detected = false;
void gotTouch1(){
 touch1detected = true;
}
void gotTouch2(){
 touch2detected = true;
}
void setup() {
  Serial.begin(115200);
  delay(1000); // give me time to bring up serial monitor
  Serial.println("ESP32 Touch Interrupt Test");
  touchAttachInterrupt(13, gotTouch1, threshold);
  touchAttachInterrupt(T3, gotTouch2, threshold);
}
void loop(){
  
  Serial.println(touchRead(13));
  delay(400);
}

Пора зробити висновки щодо юзабіліті тактильного апаратного входу контролера ESP32. Це було пізнавально і весело. Щодо води, я бачив в ютубі спроби кількох людей міряти її рівень в ємності з тонкими стінками, розміщуючи щупи з алюмінієвої фольги із зовнішнього боку цієї ємності. Це виходить дискретний вимір, але якщо приліпити до ємності кілька щупів по всій висоті, то можна міряти рівень з великою роздільною здатністю. Я поки не готовий судити про надійність таких вимірів. Знаю тільки, що вони сильно залежні до дотиків людини до ємності.

Щодо фруктів - знання про їх чутливість до дотику дають нам ідеї створення наприклад жартівливої сигналізації на спроби взяти фрукт або овоч, або створення електронних приколів для дітей. Можна генерувати звукові сигнали при доторканні дитиною до різних фруктів, це можуть бути і навчальні електронні ігри.

Що стосується вазону, то мені приходить в голову ідея лякалки для домашнього кота, який унадився залазити лапами у вазон.

А основне своє завдання піни виконують теж. Порадувала можливість виставляти пороги спрацьовування переривань. І запам'ятовуємо, що чутливість у них входить не космос. Тому діелектричні прокладки робимо не дуже товсті.

Сподіваюся розбір сенсорних входів ESP32 був вам корисний. Чекаю від вас зливи з лайків і коментів у ютубі. До нової зустрічі!




<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Модуль подключения DS18B20

Модуль подключения DS18B20

Модуль для удобного подключения датчика температуры DS18B20, особенно в герметичном корпусе с провод..

16.06грн.

Кінцевик оптичний безконтактний

Кінцевик оптичний безконтактний

Датчик працює на основі відкритої оптопари. Спрацьовує при появі непрозорого об'єкту в розрізі між в..

22.74грн.

Конектор JST 2,54мм розібраний на 2, 3 або 4 дроти

Конектор JST 2,54мм розібраний на 2, 3 або 4 дроти

Комплект для зборки 2-х, 3-х або 4-дротового швидкороз'ємного конектора..

4.91грн.

Ніжки для лазерного гравера CNC 4 шт. с кріпленням

Ніжки для лазерного гравера CNC 4 шт. с кріпленням

Ніжки з МДФ для побудови CNC лазерного гравера. Виконують роль власне ніжок, а також повноцінного кр..

119.00грн.

Ремінь зубчастий 6 мм 200 мм

Ремінь зубчастий 6 мм 200 мм

Зубчастий вкритий гумою ремінь для передачі механічної енергії обертання від одного зубчастого колес..

28.95грн.