Управление буззером с помощью ШИМ сигнала

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

tone(pin, frequency, duration) - генерирует ШИМ сигнал заданной частоты. В качестве аргументов она принимает следующие параметры:
pin - номер порта, на котором необходимо запустить ШИМ;
frequency - желаемую частоту в Герцах;
duration - время звучания в миллисекундах (не обязательный аргумент). Если параметр duration не передан, сигнал будет звучать пока не будет вызвана функция noTone().
noTone(pin) - выключает генерацию ШИМ на заданном порте.
Использование функции tone() имеет свои особенности. Например нельзя запустить сигнал сразу на двуг портах, а только на одном. Так же, ввиду того, что функция tone() использует Таймер0, ее вызов может помешать генерации обычного ШИМ сигнала на портах 3 и 11 с помощью функции analogWrite(). Об этом важно помнить!

Теперь соберем макет согласно рисунку и напишем программу, которая будет последовательно воспроизводить перечисленные частоты друг за другом с интервалом в 1 секунду. Длительность импульсов звука будет 3 секунды.

 

//Пин буззера
#define BUZZER_PIN 9
void setup() {
  pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
  //Подаем на буззер 8000 Гц на 3 секунды
  tone(BUZZER_PIN, 8000, 3000);
  delay(1000);
  //Подаем на буззер 12000 Гц на 3 секунды
  tone(BUZZER_PIN, 12000, 3000);
  delay(1000);
  //Подаем на буззер 15000 Гц на 3 секунды
  tone(BUZZER_PIN, 15000, 3000);
  delay(1000);
  //Подаем на буззер 16000 Гц на 3 секунды
  tone(BUZZER_PIN, 16000, 3000);
  delay(1000);
  //Подаем на буззер 17000 Гц на 3 секунды
  tone(BUZZER_PIN, 17000, 3000);
  delay(1000);
  //Подаем на буззер 19000 Гц на 3 секунды
  tone(BUZZER_PIN, 19000, 3000);
  delay(1000);
}