tone()
Запускает на выбранном выводе прямоугольный сигнал заданной частоты — пьезоизлучатель воспримет его как звук; необязательный параметр duration задаёт длительность в миллисекундах.
Полная статья
Описание
tone() запускает на выбранном выводе прямоугольный сигнал со скважностью 50% и заданной частотой. Именно такой сигнал воспринимается пьезоизлучателем или небольшим динамиком как звук определённой высоты.
Если передать необязательный параметр duration, сигнал автоматически прекратится через указанное число миллисекунд. Без него тон будет звучать непрерывно, пока вы явно не вызовете noTone().
Важное ограничение: одновременно может работать только один тон. Если в момент вызова сигнал уже идёт на другом выводе, новый вызов tone() будет проигнорирован. Если же тон воспроизводится на том же выводе, частота изменится на новую.
Использование tone() конфликтует с PWM на выводах 3 и 11 — это касается всех плат, кроме Mega. Если вам нужен ШИМ на этих выводах одновременно со звуком, придётся искать обходное решение.
Минимально достижимая частота — 31 Гц. Генерировать тоны ниже этого значения функция не умеет. Технические подробности о реализации см. Заметки Бретта Хэгмана.
Синтаксис
tone(pin, frequency)tone(pin, frequency, duration)
Параметры
pin— вывод Arduino, на котором нужно сгенерировать сигнал.frequency— частота тона в герцах. Тип данных:unsigned int.duration— продолжительность сигнала в миллисекундах (необязательный параметр). Тип данных:unsigned long.
Возвращает
Ничего.
Пример кода
Генерация прямоугольного сигнала на выводе D0 в течение одной секунды.
#define BUZZER_PIN D0 // Пример пина
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
tone(BUZZER_PIN, 1000, 1000); // Тон 1 kHz
delay(1000);
}
Практические замечания
- Функция неблокирующая. Даже если вы передали параметр
duration, скетч продолжит выполняться немедленно, не ожидая окончания тона. Если следующее действие должно произойти именно после завершения звука, добавьтеdelay()на то же время. - Переключение между выводами. Если вы хотите поочерёдно воспроизводить тоны на разных выводах, перед каждым новым вызовом
tone()обязательно вызывайтеnoTone()на текущем выводе — иначе новый вызов будет проигнорирован. - Конфликт с PWM. Пока активен
tone(),analogWrite()на выводах 3 и 11 (на большинстве плат) работать не будет. Планируйте распиновку заранее. - Нижняя граница частоты. Значения
frequencyниже 31 приведут к непредсказуемому поведению — функция просто не рассчитана на такой диапазон.