Пассивный зуммер работает с AnalogWrite(), но не с DigitalWrite(). Он также имеет постоянный статический шум.
У меня есть пассивный пьезозуммер YL-44/MH-FMD, подключенный к ESP8266/NodeMCU.
Подключается так: Зуммер ---> NodeMCU
- ЗЕМЛЯ ---> G
- VCC ---> 3В
- Ввод-вывод ---> D2
Этот код издает четкий звуковой сигнал.
void loop() {
analogWrite(BUZZER, 255);
delay(100);
analogWrite(BUZZER, 0);
}
Этот код издает странный тихий щелчок без звукового сигнала.
void loop() {
digitalWrite(BUZZER, HIGH);
delay(100);
digitalWrite(BUZZER, LOW);
}
Я понятия не имею, почему второй вариант не работает, поскольку все руководства ссылаются на него.
Кроме того, почему зуммер издает странный постоянный статический шум и нагревается?
Я делаю что-то не так с проводкой? Я не использую резисторы, так как в руководствах это не показано.
@Ivan, 👍0
Обсуждение3 ответа
Лучший ответ:
Чтобы включить пассивный зуммер, используйте функцию Arduinotone(). Если вы установите штырь ВЫСОКОЕ, пьезоповерхности стянутся (или отойдут). Это то, что вызывает один клик, но не более того. Чтобы создать тональный сигнал, входной сигнал должен колебаться на правильной частоте. ШИМ — это один из способов подачи звукового сигнала. Используйте функциюtone() для генерации тонов желаемой частоты.
Ваш аналогWrite(255) использует ШИМ на 1/4 от полной мощности, поскольку максимальное значение аналогаWrite на esp8266 по умолчанию равно 1023. Поэтому при 255 он издает приятный звуковой сигнал.
Если вы используете динамик или пассивный пьезоэлектрический преобразователь с esp8266, вы можете ожидать шума, создаваемого операциями Wi-Fi. Я установил вывод как INPUT послеtone(), чтобы устранить шум.
Но почему аналоговая запись работает, а цифровая — нет?, @Ivan
AnalogWrite — это ШИМ. колебание или «последовательность импульсов». https://en.wikipedia.org/wiki/Pulse-width_modulation, @Juraj
На ESP8266 [analogWrite изменяется от 0 до 1023](https://github.com/esp8266/Arduino/issues/2895), а не от 0 до 255, поэтому analogWrite(BUZZER, 255);
— это не то же самое, что digitalWrite (ЗВУК, ВЫСОКИЙ);
. Это больше похоже на AnalogWrite(BUZZER, 63); на Arduino., @Majenko
@Маженко, спасибо. Я добавил это, чтобы ответить, @Juraj
Одно замечание относительно цифровой записи. Хотя у вас есть задержка между HIGH
и LOW
, нет задержки для возврата к HIGH
(кроме времени выхода из цикла и повторный вход; что может занять очень небольшой промежуток времени).
Хотя на более медленном процессоре (например, AVR) этого времени может быть достаточно, чтобы вызвать некоторое гудение (и постоянное гудение ), на esp8266 оно будет достаточно быстрым, чтобы вывод ввода-вывода вообще не мог изменить состояние с LOW
до ВЫСОКИЙ
. В Esp8266 частота физического контакта ввода-вывода отличается от частоты подсчета команд. Я считаю, что это всего лишь 8 МГц. Из-за времени, прежде чем изменение состояния контакта вступит в силу, возврат до изменения физического состояния может игнорировать это изменение состояния. В конкретном примере LOW
может часто игнорироваться, и вы получите больше случайных эффектов от этого скетча.
Попробуйте добавить еще одну задержку в 100 мс после установки контакта LOW
. это будет моделировать ШИМ длительностью 1000 мс с рабочим циклом 1100 мс.
А еще лучше, уменьшите задержки в 100 раз (первая задержка 10 мс, новая задержка 1 мс), вы получите гул на частоте 10 (или около того) Гц.
Ваш пример кода не работает, поскольку у вас ПАССИВНЫЙ зуммер. Ваш пример будет работать нормально с АКТИВНЫМ зуммером.
При использовании пассивного зуммера вам необходимо включать/выключать цифровой вход/выход на желаемой звуковой частоте. Использование APItone() — простой способ сделать это.
тон(BUZZER_PIN, 432, 250); // Включите зуммер с частотой 432 Гц в течение 250 мс
Ваш зуммер нагревается, потому что он, вероятно, использует PNP-транзистор для переключения катушки на вашем модуле зуммера. Транзистор этого типа проводит ток, когда на входе НИЗКИЙ уровень. Некоторые модули зуммеров используют NPN-транзисторы и проводят ток, когда на входе ВЫСОКИЙ уровень.
Чтобы ваш зуммер не перегревался (и не тратил ток), установите на его входе ВЫСОКИЙ уровень, чтобы выключить его (при условии, что он использует PNP-транзистор, который, похоже, основан на вашем описании)
digitalWrite(BUZZER_PIN, HIGH);
Вам нужно будет делать это после использованияtone() каждый раз, когда на выходном контакте остается НИЗКИЙ уровень.
Недавно я создал обсуждение этой темы на форуме AVRFreaks: Модуль зуммера нагревается и тратит энергию
- Не выходит из цикла for
- все работает независимо, но не вместе. Пьезо не генерирует тон
- Как вывести истинное аналоговое напряжение на выходной контакт
- Как публиковать запросы HTTP POST на моем веб-сайте?
- Отправка значения с одного Arduino на другой
- Цепь с зуммером не работает
- Различия между процессором Nodemcu и Arduino
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
это пассивно, как указано в названии. он не вибрирует сам по себе. используйте функцию тон(). пример с базовыми примерами в IDE, @Juraj
@Юрай, у тебя есть идеи, почему возникает статический шум и становится жарко?, @Ivan
это похоже на катушку. под действием тока он стягивается. щелчок – это звук. 0 Гц :-) шум в том, что нехорошо держать его под постоянным током, @Juraj
@juraj Не могли бы вы объяснить, как мне исправить постоянный шум? Я не вижу пути., @Ivan
@Юрай, я использую тон. Он издает шум до и после звука. ВЫСОКОГО уровня нет., @Ivan
это Wi-Fi. Я установил вывод как INPUT после тона(). это делает это лучше, @Juraj
@Юрай Ниииииииице. Огромное спасибо, Юрай, ты герой! Я новичок в этом, и вы мне очень помогли., @Ivan
YL-44 – активный зуммер. у тебя есть что-то еще, @Juraj
Вы не показали свою функцию
setup()
. Вы забыли установить для вывода значение «OUTPUT» при использовании его с «digitalWrite()»?, @Majenko@Majko У меня есть это:
#define BUZZER 4;
иpinMode(BUZZER, OUTPUT);
в настройке., @Ivan