🛒
0 товар.
0 руб.
Логотип

Интернет-магазин «Неглупый Дом»

☰
ИИ-консультант Wildberries OZON Яндекс Маркет
Поиск по сайту
Гугл таблица с ассортиментом

👏 Проект: тап-темп метроном по ритму нажатий на кнопку

Кнопка KY-004 и зуммер

Несколько нажатий кнопки в нужном темпе — устройство вычислит BPM по интервалам и продолжит отбивать ритм.

Как это работает

Принцип "tap tempo" используется в драм-машинах и гитарных процессорах: вместо ввода числа BPM пользователь отмечает ритм нажатиями, а устройство измеряет интервал между ними через `millis()`.

Чтобы одна неровная пауза не сбивала весь темп, интервал сглаживается скользящим средним: новое значение смешивается с предыдущим в равной пропорции, поэтому выброс влияет лишь частично, а несколько ровных тапов быстро сходятся к стабильному значению.

Пошаговая сборка

Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, что указаны ниже — сориентируйтесь по названиям контактов на своей плате.

  1. KY-004: сигнал → D2, VCC → 5V, GND → GND.
  2. Пассивный зуммер: сигнал → D8, GND → GND.
  3. Несколько раз нажмите кнопку в желаемом темпе — метроном подхватит его.
  4. Если тапы считаются "дважды" — у KY-004 обычно нет аппаратного антидребезга.

Скетч

// ВНИМАНИЕ: рекомендую отладить код через монитор порта, я языковая
// модель, а не специализированный кодер, могу что-то упустить.

const int buttonPin = 2;
const int buzzerPin = 8;
unsigned long lastTap = 0;
unsigned long avgInterval = 500;
unsigned long lastBeat = 0;
bool wasPressed = false;

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
}

void loop() {
  bool pressed = digitalRead(buttonPin) == HIGH;
  if (pressed && !wasPressed) {
    unsigned long now = millis();
    unsigned long tapInterval = now - lastTap;
    if (tapInterval < 2000) {
      avgInterval = (avgInterval + tapInterval) / 2;
      Serial.print("Темп, BPM: ");
      Serial.println(60000 / avgInterval);
    }
    lastTap = now;
    tone(buzzerPin, 1500, 50);
  }
  wasPressed = pressed;

  if (millis() - lastBeat >= avgInterval) {
    tone(buzzerPin, 1000, 30);
    lastBeat = millis();
  }
}
                

`avgInterval` сглаживается как скользящее среднее — темп не «скачет» от одного неровного тапа.

Частые проблемы

Как улучшить проект

Товары по теме

Ещё модули для Arduino: Электронные модули.

← ⏲️ кухонный таймер обратного отсч…🔢 ручной счётчик на энкодере KY-… →

🎁 Купить весь комплект со скидкой 10%

Все 2 товара сразу: 130 ₽ 117 ₽ (экономия 13 ₽)

Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.

Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.

Корзина

Поиск


Пример: понижающий или DC-DC или mini360 или aw-023 или арт. OZ/WB/YA