Сенсорная кнопка без механики
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).
Сенсор работает и через тонкий пластик или стекло. Чем больше площадка, тем увереннее срабатывание.