все работает независимо, но не вместе. Пьезо не генерирует тон

Моя цель с кодом проста. Пусть пьезо издает звук, когда температура достигает 25 градусов. Мой пьезо подключен правильно, потому что он издает звук, когда загружается ардуино или когда я помещаю эту строку кода в любое другое место в моем коде.

Я также проверил, был ли вызван оператор If. И да, он был вызван! То есть оператор if выполняется, но я не слышу жужжания.

Я знаю, что я ломаю свой семисегментный экран, используя задержку. Но я не против того, чтобы экран работал, когда зуммер.

void loop()
{
  //локальные переменные
  if (millis() % 5000 <= 10) {
      float lm35TempC = lm35.getTempC();
      sevseg.setNumber(lm35TempC, 2);
      if (lm35TempC > 25.00) {
        tone(1,500,1000);
        delay(3000);  <------- WHERE IT PROBABLY GOES WRONG
      }
      if (lm35TempC < 25.00) {
        noTone(1);
      }
  }
  sevseg.refreshDisplay(); // Должен запускаться многократно; не используйте блокирующий код (например: delay()) в функции loop(), иначе это не будет работать правильно
}

В заключение: оператор If работает, но я не слышу гудка. Как это происходит?

Заранее спасибо!

, 👍0

Обсуждение

Окна millis() % 5000 <= 10 составляют всего 10 мс каждые 5 секунд. Сколько времени занимает функция sevseg.refreshDisplay? более 10 мс?, @Jot

Нет, я не думаю, что эта функция займет намного больше времени, но я должен признать, что это некрасивый способ создания задержки в 5 секунд, но если я, например, увеличу 10 до 50, мой дисплей иногда будет обновляться дважды в течение короткого периода времени., @Anton van der Wel

Тогда прекратите делать это некрасиво. Используйте https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay с интервалом в 5 секунд. После этого вам нужно исправить тон, я думаю, что это тоже некрасиво. Тон с длительностью задержится и не нуждается в noTone. Также могут быть проблемы с оборудованием. Исправьте все по одному., @Jot


1 ответ


Лучший ответ:

4

Вы подключили пьезо к контакту 1? Выберите другой контакт. Контакт 1 — это последовательный TX. Вы «перекачиваете» ШИМ в USB.

Функция tone() издаст звук независимо от того, есть ли у вас задержка. Вы устанавливаете 1 секунду с 1000 в качестве третьего параметра. Она будет звучать 1 секунду и затем выключаться. Вам не нужны delay() и noTone().

500 — это низкая частота. Если это звучит всего одну секунду, вы можете это уловить?

попробуйте tone(TONE_PIN, 4500, 500). с динамиком это приятный писк

,

Вы были правы! Единственная причина, по которой я использовал пин 1, заключалась в том, что я уже использовал все остальные цифровые пины (кроме 0, но этот похож на 1). Теперь я настроил аналоговый пин как выход, и он работает идеально!, @Anton van der Wel