← До всіх проєктів
Сенсори Початковий

Сенсорні кнопки без кнопок: диммер на ємнісних входах ESP32

ESP32 має 10 вбудованих сенсорних входів. Шматок фольги, монета чи мідна пластина під склом стають кнопками: вмикаємо світлодіод і плавно змінюємо яскравість дотиком.

Складність
Початковий
Час
30 min
Категорія
Сенсори

Як це працює

Кожен сенсорний вхід 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);
}

Налаштування чутливості

  1. Відкрийте Serial Plotter — побачите три лінії.
  2. Торкніться кожної пластини й подивіться, наскільки падає значення.
  3. Якщо спрацьовує від наближення руки — зменшіть коефіцієнт 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 клавіш із фольги та п'єзо-динаміка.