Уроки / Урок 5

Сенсорная кнопка без механики

ESP32 чувствует прикосновение пальца к проводу или металлической площадке.

У ESP32 есть 10 ёмкостных сенсорных каналов, 9 из них выведены на плату. Функция touchRead() измеряет ёмкость вывода: когда к проводу прикасается палец, ёмкость растёт, а число уменьшается. Кнопка из куска фольги под пластиком корпуса — и никакой механики.

Сначала посмотрим, какие числа выдаёт вывод. Воткните провод в GPIO4, откройте Инструменты → Плоттер по последовательному соединению и потрогайте конец провода.

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println(touchRead(4));  // Touch0 = GPIO4
  delay(100);
}

Обычно без касания получается 50–80, с касанием — 10–20. Числа зависят от длины провода и размера площадки, поэтому порог лучше вычислять при запуске.

Сенсорный выключатель

const int TOUCH = 4;
const int LED = 2;
int threshold;
bool ledOn = false;
bool wasTouched = false;

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);

  // калибровка: не трогайте провод первые полсекунды
  long sum = 0;
  for (int i = 0; i < 20; i++) { sum += touchRead(TOUCH); delay(25); }
  int base = sum / 20;
  threshold = base * 6 / 10;  // касание = на 40% меньше обычного
  Serial.printf("Без касания: %d, порог: %d\n", base, threshold);
}

void loop() {
  bool touched = touchRead(TOUCH) < threshold;
  if (touched && !wasTouched) {  // момент касания
    ledOn = !ledOn;
    digitalWrite(LED, ledOn);
  }
  wasTouched = touched;
  delay(50);
}

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

Touch0 — GPIO4, Touch2 — GPIO2, Touch3 — GPIO15, Touch4 — GPIO13, Touch5 — GPIO12, Touch6 — GPIO14, Touch7 — GPIO27, Touch8 — GPIO33, Touch9 — GPIO32. В скетче можно писать и номер GPIO, и имя: touchRead(T0) — то же, что touchRead(4).

Сенсор работает и через тонкий пластик или стекло. Чем больше площадка, тем увереннее срабатывание.