Сенсорні кнопки без кнопок: диммер на ємнісних входах ESP32
ESP32 має 10 вбудованих сенсорних входів. Шматок фольги, монета чи мідна пластина під склом стають кнопками: вмикаємо світлодіод і плавно змінюємо яскравість дотиком.
Як це працює
Кожен сенсорний вхід ESP32 вимірює ємність підключеного до нього провідника. Коли ви торкаєтеся пальцем, ємність зростає, і значення touchRead() на класичному ESP32 зменшується (наприклад, з 70 до 20). Жодних механічних кнопок — лише провідник, який можна сховати під пластиком чи склом товщиною до кількох міліметрів.
Компоненти
- ESP32 DevKit (класичний ESP32; про S2/S3 — нижче)
- 3 «кнопки»: фольга, монети, мідні пластини або площадки на друкованій платі
- Світлодіод + резистор 330 Ом (або вбудований LED на GPIO 2)
Підключення
| Сенсор | Вхід | GPIO |
|---|---|---|
| Увімк./вимк. | T0 | 4 |
| Яскравіше | T3 | 15 |
| Тьмяніше | T4 | 13 |
Дроти до пластин робіть якомога коротшими — довгий дріт сам по собі реагує на наближення руки.
Код
const int PADS[3] = {T0, T3, T4}; // GPIO 4, 15, 13
const int LED_PIN = 2;
uint32_t baseline[3];
bool ledOn = false;
bool wasTouched = false;
int brightness = 128;
unsigned long lastStep = 0;
unsigned long lastPrint = 0;
bool touched(int i) {
// Дотик = значення впало нижче 70 % від «спокійного» рівня
return touchRead(PADS[i]) < baseline[i] * 0.7;
}
void apply() {
ledcWrite(LED_PIN, ledOn ? brightness : 0);
}
void setup() {
Serial.begin(115200);
ledcAttach(LED_PIN, 5000, 8); // ШІМ 5 кГц, 8 біт
// Калібрування: не торкайтеся пластин перші 0.5 с
for (int i = 0; i < 3; i++) {
uint32_t sum = 0;
for (int n = 0; n < 20; n++) {
sum += touchRead(PADS[i]);
delay(20);
}
baseline[i] = sum / 20;
Serial.printf("Pad %d baseline: %u\n", i, baseline[i]);
}
apply();
}
void loop() {
// Перша пластина — перемикач (реагуємо на момент дотику)
bool t = touched(0);
if (t && !wasTouched) {
ledOn = !ledOn;
apply();
}
wasTouched = t;
// Друга й третя — поки тримаєте палець, яскравість змінюється
if (ledOn && millis() - lastStep > 30) {
lastStep = millis();
if (touched(1)) { brightness = min(255, brightness + 3); apply(); }
if (touched(2)) { brightness = max(5, brightness - 3); apply(); }
}
// Сирі значення — для підбору порогу
if (millis() - lastPrint > 500) {
lastPrint = millis();
Serial.printf("%u\t%u\t%u\n", touchRead(PADS[0]), touchRead(PADS[1]), touchRead(PADS[2]));
}
delay(10);
}
Налаштування чутливості
- Відкрийте Serial Plotter — побачите три лінії.
- Торкніться кожної пластини й подивіться, наскільки падає значення.
- Якщо спрацьовує від наближення руки — зменшіть коефіцієнт
0.7до0.5; якщо не реагує крізь товстий пластик — збільште до0.8.
ESP32-S2 / S3
На цих чипах сенсор працює «навпаки»: при дотику значення зростає і вимірюється в тисячах. Замініть умову на touchRead(...) > baseline[i] * 1.3.
Пробудження дотиком
Сенсорний вхід може будити ESP32 з deep sleep — ідеально для пристроїв на батарейці:
touchSleepWakeUpEnable(T3, 40); // поріг для класичного ESP32
esp_deep_sleep_start();
Ідеї
- Сенсорна панель вимикача світла під склом.
- Лічильник доторків до «чарівної» дверної ручки.
- Піаніно з 10 клавіш із фольги та п'єзо-динаміка.