Вимикач на оплески: датчик звуку KY-038 і подвійний оплеск
Два оплески — світло вмикається, ще два — вимикається. Розбираємо модуль KY-038 з компаратором LM393: аналоговий і цифровий виходи, підстроювання порогу, «брязкіт» одного оплеску і як відрізнити подвійний оплеск від грюкання дверей.
Про проєкт
Класика ретро-гаджетів — лампа, що вмикається оплесками. Модуль KY-038 — це електретний мікрофон, підсилювач і компаратор LM393. Коли звук гучніший за поріг, заданий підстроювальним резистором, на виході DO з'являється сигнал. Навчимо ESP32 розрізняти подвійний оплеск, щоб лампа не клацала від кашлю чи грюкання дверей.
Що знадобиться
- ESP32 DevKit
- Модуль датчика звуку KY-038 (або KY-037 з більшим мікрофоном)
- Світлодіод і резистор 220 Ом (або модуль реле для справжньої лампи)
Схема
| KY-038 | ESP32 |
|---|---|
| AO (аналоговий) | не обов'язково (GPIO34, якщо хочете бачити рівень) |
| G | GND |
| + | 3V3 |
| DO (цифровий) | GPIO27 |
«Лампа»: GPIO26 → 220 Ом → світлодіод → GND. Для лампи на 230 В — модуль реле, як у статті про датчик руху, з усіма застереженнями щодо безпеки.
Два виходи модуля
- AO — підсилений звуковий сигнал навколо середини живлення (~1.65 В).
analogRead()бачить випадкові точки хвилі, тож гучність рахують як розмах: різницю між максимумом і мінімумом за 20–50 мс. - DO — вихід компаратора: HIGH, коли звук гучніший за поріг (на більшості модулів при цьому світиться другий світлодіод). Поріг задає синій підстроювальний резистор. Налаштуйте його так, щоб у тиші світлодіод DO ледь-ледь не світився.
Один оплеск — кілька імпульсів
Звук — це коливання, тож за 5–10 мс оплеску компаратор встигає перемкнутися кілька разів. Без захисту один оплеск порахується як три. Тому після першого імпульсу ігноруємо DO 150 мс: це той самий антидребезг, що й для кнопки.
Логіка подвійного оплеску
- Перший оплеск запам'ятовуємо разом із часом.
- Якщо другий приходить протягом 700 мс, перемикаємо лампу.
- Якщо ні, забуваємо перший. Одиночний звук нічого не робить.
Код
// Вимикач на оплески: KY-038 (вихід DO) + «лампа». Подвійний оплеск перемикає світло
const int MIC_DO = 27;
const int LAMP = 26;
const unsigned long DEBOUNCE_MS = 150; // один оплеск «деренчить» кілька мілісекунд
const unsigned long WINDOW_MS = 700; // другий оплеск має прийти протягом 0.7 с
bool lampOn = false;
int claps = 0;
unsigned long lastClap = 0, firstClap = 0;
void setup() {
Serial.begin(115200);
pinMode(MIC_DO, INPUT);
pinMode(LAMP, OUTPUT);
Serial.println("Плесніть двічі, щоб увімкнути або вимкнути світло");
}
void loop() {
unsigned long now = millis();
if (digitalRead(MIC_DO) == HIGH && now - lastClap > DEBOUNCE_MS) {
lastClap = now;
if (claps == 1 && now - firstClap <= WINDOW_MS) { // другий оплеск вчасно
claps = 0;
lampOn = !lampOn;
digitalWrite(LAMP, lampOn);
Serial.println(lampOn ? "Світло УВІМК" : "Світло ВИМК");
} else { // перший оплеск
claps = 1;
firstClap = now;
Serial.println("Один оплеск…");
}
}
if (claps == 1 && now - firstClap > WINDOW_MS) claps = 0; // одиночний звук ігноруємо
}
Корисно знати
- Поріг. Якщо DO світиться постійно (шумно, музика), лампа реагуватиме на все підряд. Якщо ніколи, плескайте голосніше або ближче: KY-038 чує оплески на відстані 1–2 метрів.
- Надійніше через AO. Замість DO рахуйте розмах сигналу на AO за 30 мс і порівнюйте з порогом у коді. Поріг тоді можна змінювати з телефона, а не викруткою.
- Ритм. Та сама логіка дозволяє розрізняти 2 і 3 оплески (дві різні дії) або задати «секретний ритм».
- У симуляторі клацніть по датчику, щоб плеснути. Повзунок «Фоновий шум» імітує галасливу кімнату.