Функция playTone зуммера

Я делаю игру "Саймон говорит", используя Arduino на TinkerCad. Я столкнулся с проблемой в звуковой функции зуммера. Я хочу что-то вроде этого:

  1. Выполните следующие действия, чтобы сгенерировать звуковой сигнал для красного светодиода: Воспроизведение 440 Гц в течение 150 мс Ждите 1136us Воспроизведение 440 Гц в течение 150 мс

  2. Выполните следующие действия, чтобы сгенерировать тон для желтого светодиода: Воспроизведение 784 Гц в течение 150 мс Ждите 638us Воспроизведение 784 Гц в течение 150 мс

  3. Выполните следующие действия, чтобы сгенерировать тон для синего светодиода: Воспроизведение 587 Гц в течение 150 мс Ждите 851us Воспроизведение 587 Гц в течение 150 мс

  4. Выполните следующие действия, чтобы сгенерировать звуковой сигнал для зеленого светодиода: Воспроизведение 880 Гц в течение 150 мс Ждите 568us Воспроизведение 880 Гц в течение 150 мс

У меня есть следующие функции для вышеперечисленного:

 void playTone2(int tone, int duration) {
  Serial.println(tone);
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWriteGeneric(buzzer, true);
    delayMicroseconds(tone);
    digitalWriteGeneric(buzzer, false);
    delayMicroseconds(tone);
  }
}

void playTone(int tone1) {
  Serial.println(tone1);
  if (tone1 == 440) {
    playTone2(440, 150);
    delayMicroseconds(1136);
    playTone2(440, 150);
  }
  if (tone1 == 784) {
    playTone2(784, 150);
    delayMicroseconds(638);
    playTone2(784, 150);
  }
  if (tone1 == 587) {
    playTone2(587, 150);
    delayMicroseconds(851);
    playTone2(587, 150);
  }
  if (tone1 == 880) {
    playTone2(880, 150);
    delayMicroseconds(568);
    playTone2(880, 150);
  }
  if (tone1 == 2700) {
    playTone2(250, 250);
    delay(250);
    playTone2(150, 250);
  }

}

Сначала был только код playTone, но мне нужны были разные значения для разных светодиодов, поэтому я включил функцию playTone и вызвал playTone2. Но тоны, которые я получаю, не точны, возможно, из-за двух функций. Я смогу решить эту проблему, если смогу понять работу функции playTone2. Я пробовал, но бесполезно, пожалуйста, поделитесь, как именно playtone2 функционирует здесь, чтобы я мог соответствующим образом отредактировать свою функцию playTone.

, 👍1

Обсуждение

в чем конкретно проблема? ... все, что вы сказали, - это "проблема" и "неточно", ни одно из которых не описывает реальную проблему, @jsotola

Проблема в том, что звук зуммера с этими функциями не точен, задержка больше, чем ожидалось., @Snoke

вы уже сказали "неточно"., @jsotola

пожалуйста, запустите простой скетч, который воспроизводит масштаб, @jsotola


1 ответ


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

1

Вот простой скетч для проверки тонов, используемых для каждого цвета светодиода. Я не тестировал его с динамиком, но он компилируется в Arduino IDE, так что, возможно, он будет работать как есть.

Вызов delayMicroseconds() является "блокирующим" кодом, поэтому вы можете изменить его, чтобы использовать "неблокирующий" код, например, использовать пример BlinkWithoutDelay в IDE для создания таймера на основе micros ().

/* Arduino Uno. IDE 1.8.9
   Sketch uses 2540 bytes (7%) of program storage space.
   Global variables use 28 bytes (1%) of dynamic memory.

   red    LED: Play 440 Hz for 150ms Wait for 1136us Play 440 Hz for 150ms
   yellow LED: Play 784 Hz for 150ms Wait for 638us Play 784 Hz for 150ms
   blue   LED: Play 587 Hz for 150ms Wait for 851us Play 587 Hz for 150ms
   green  LED: Play 880 Hz for 150ms Wait for 568us Play 880 Hz for 150ms
*/
byte tonePin = 8;

void setup(){
  pinMode(tonePin, OUTPUT);
  RedLEDSound();
  YellowLEDSound();
  BlueLEDSound();
  GreenLEDSound();
}

void loop(){}

void PlayTone(unsigned int m_frequency, unsigned long m_duration, unsigned long m_pause){
  tone(tonePin, m_frequency, m_duration);
  delayMicroseconds(m_pause);
  noTone(tonePin);
}

void RedLEDSound(){
  PlayTone(440, 150, 1136);
  PlayTone(440, 150, 0);
}

void YellowLEDSound(){
  PlayTone(784, 150, 638);
  PlayTone(784, 150, 0);
}

void BlueLEDSound(){
  PlayTone(587, 150, 851);
  PlayTone(587, 150, 0);
}

void GreenLEDSound(){
  PlayTone(880, 150, 568);
  PlayTone(880, 150, 0);
}
,