Основы ESP32: Ёмкостные сенсорные выводы

Основы ESP32: Ёмкостные сенсорные выводы

ESP32 — отличная плата для создания умных IoT-проектов, а добавление сенсорной функциональности сделает их ещё умнее.

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

Давайте разберёмся, как работать с этими сенсорными выводами и использовать их в проектах.

Совет

Обнаружение касания в ESP32 управляется сопроцессором ULP. Поэтому эти сенсорные выводы также можно использовать для пробуждения ESP32 из глубокого сна.

Как ESP32 распознаёт касание?

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

Это вызывает изменение ёмкости, что приводит к формированию аналогового сигнала. Два АЦП последовательного приближения (SAR ADC) затем преобразуют этот аналоговый сигнал в цифровое число.

Сенсорные выводы ESP32

ESP32 имеет 10 ёмкостных сенсорных GPIO. Когда ёмкостная нагрузка (например, кожа человека) находится в непосредственной близости от GPIO, ESP32 обнаруживает изменение ёмкости.

Хотя ESP32 имеет в общей сложности 10 ёмкостных сенсорных GPIO, только 9 из них выведены на контактные гребёнки с обеих сторон 30-контактной платы ESP32.

Сенсорные выводы ESP32

Считывание сенсора касания

Считывание сенсора касания выполняется просто. В Arduino IDE для этого используется функция touchRead(), которая принимает в качестве аргумента номер GPIO-вывода, который вы хотите прочитать.

touchRead(GPIOPin);

Подключение оборудования

Достаточно теории! Давайте рассмотрим практический пример.

Подключим провод к Touch #0 (GPIO #4). Вы можете прикрепить к этому выводу любой проводящий объект, например алюминиевую фольгу, проводящую ткань, проводящую краску и т.д., и превратить его в сенсорную панель.

Подключение провода к ESP32 для считывания сенсорного GPIO

Пример кода

Давайте посмотрим, как это работает, на примере из библиотеки. Откройте Arduino IDE и перейдите в File > Examples > ESP32 > Touch, затем откройте скетч TouchRead.

Этот пример просто считывает сенсорный вывод 0 и отображает результат в мониторе последовательного порта.

// ESP32 Touch Test
// Just test touch pin - Touch0 is T0 which is on GPIO 4.

void setup() {
  Serial.begin(115200);
  delay(1000); // give me time to bring up serial monitor
  Serial.println("ESP32 Touch Test");
}

void loop() {
  Serial.print("Touch: ");
  Serial.println(touchRead(4));  // get touch value on GPIO 4
  delay(1000);
}

После загрузки скетча откройте монитор последовательного порта со скоростью 115200 бод и нажмите кнопку EN на ESP32.

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

Вывод теста касания ESP32 в мониторе последовательного порта

Объяснение кода

Код довольно прост. В функции setup() мы сначала инициализируем последовательное соединение с ПК.

Serial.begin(115200);

В функции loop() мы используем функцию touchRead() и передаём в качестве аргумента вывод, который хотим считать. В данном случае это GPIO #4. Вы также можете передать номер сенсора касания T0.

Serial.println(touchRead(4));

Проект ESP32 — Светодиод, активируемый касанием

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

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

Определение порога

Прежде чем продолжить, вам следует посмотреть, какие показания вы фактически получаете от ESP32. Обратите внимание на значения, которые вы получаете, когда касаетесь вывода и когда не касаетесь.

Когда вы запустите предыдущий скетч, вы увидите примерно следующие показания в мониторе последовательного порта:

  • когда вы касаетесь вывода (~3)

  • когда вы не касаетесь вывода (~71)

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

Пример кода

Ниже приведён простой код, который включает встроенный светодиод при однократном касании вывода и выключает его при повторном касании.

// set pin numbers
const int touchPin = 4;
const int ledPin = 2;

const int threshold = 30;  // set the threshold

int ledState = LOW;         // the current state of the output pin
int touchState;             // the current reading from the input pin
int lastTouchState = LOW;   // the previous reading from the input pin

unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  pinMode(ledPin, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, ledState);
}

void loop() {
  // read the state of the pin
  int reading = touchRead(touchPin);

  // binarize touch reading for easy operation
  if (reading < threshold) {
    reading = HIGH;
  } else{
    reading = LOW;
  }

  // If the pin is touched:
  if (reading != lastTouchState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the touch state has changed:
    if (reading != touchState) {
      touchState = reading;

      // only toggle the LED if the new touch state is HIGH
      if (touchState == HIGH) {
        ledState = !ledState;
      }
    }
  }

  // set the LED:
  digitalWrite(ledPin, ledState);

  // save the reading. Next time through the loop, it'll be the lastTouchState:
  lastTouchState = reading;
}

Загрузите скетч на ESP32. Вы должны увидеть, как светодиод переключается каждый раз, когда вы касаетесь провода.