Основы 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.
Считывание сенсора касания
Считывание сенсора касания выполняется просто. В Arduino IDE для этого используется функция touchRead(), которая принимает в качестве аргумента номер GPIO-вывода, который вы хотите прочитать.
touchRead(GPIOPin);
Подключение оборудования
Достаточно теории! Давайте рассмотрим практический пример.
Подключим провод к Touch #0 (GPIO #4). Вы можете прикрепить к этому выводу любой проводящий объект, например алюминиевую фольгу, проводящую ткань, проводящую краску и т.д., и превратить его в сенсорную панель.
Пример кода
Давайте посмотрим, как это работает, на примере из библиотеки. Откройте 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.
Теперь попробуйте коснуться металлической части провода и посмотрите, как он реагирует на прикосновение.
Объяснение кода
Код довольно прост. В функции 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. Вы должны увидеть, как светодиод переключается каждый раз, когда вы касаетесь провода.