
Интернет-магазин «Неглупый Дом»
Потенциометр WH148 плавно задаёт темп от 40 до 200 ударов в минуту — пассивный зуммер отбивает короткий щелчок ровно в такт, без необходимости лезть в настройки через кнопки.
Потенциометр — это переменный резистор: поворот ручки меняет напряжение на среднем выводе от 0 до 5V, а Arduino через `analogRead()` переводит это напряжение в число от 0 до 1023. Функция `map()` дальше просто пересчитывает этот диапазон 0-1023 в диапазон 40-200 ударов в минуту (BPM) — чем правее крутанули ручку, тем больше BPM и тем чаще щёлкает зуммер.
Сам темп в тактах удобнее для человека, но программе нужен интервал времени между ударами в миллисекундах, поэтому BPM переводится в `beatInterval` по формуле 60000 (миллисекунд в минуте) делённое на BPM. Скетч не "спит" между ударами через `delay()`, а в каждом проходе `loop()` проверяет, прошло ли уже `beatInterval` миллисекунд с последнего щелчка (через `millis()`) — такой подход позволяет менять темп потенциометром прямо во время работы, без рывков и перезапуска.
Функция `tone(buzzerPin, 1500, 50)` заставляет пассивный зуммер сыграть короткий звук на частоте 1500 Гц длительностью 50 мс — в отличие от активного зуммера (который либо просто пищит на своей фиксированной частоте, либо молчит), пассивный зуммер через `tone()` можно заставить издавать разные ноты разной длины.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
const int potPin = A0; // средний вывод потенциометра
const int buzzerPin = 8; // пассивный зуммер
unsigned long lastBeat = 0; // время последнего щелчка
void setup() {
pinMode(buzzerPin, OUTPUT);
}
void loop() {
int potValue = analogRead(potPin); // 0-1023 от положения ручки
int bpm = map(potValue, 0, 1023, 40, 200); // перевод в удары в минуту
unsigned long beatInterval = 60000UL / bpm; // интервал между ударами, мс
if (millis() - lastBeat >= beatInterval) { // пора делать щелчок?
tone(buzzerPin, 1500, 50); // звук 1500 Гц, 50 мс
lastBeat = millis(); // запоминаем момент щелчка
}
}
`beatInterval` в миллисекундах пересчитывается из BPM каждый цикл `loop()`, поэтому темп можно крутить прямо во время работы метронома, без перезапуска.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 137 ₽ 123 ₽ (экономия 14 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.