C ++蜂鸣器为Arduino演奏钢琴音符

时间:2017-08-11 10:07:21

标签: c++ arrays if-statement arduino

unsigned long t;
boolean isHigh;

#define BUZZER_PIN 3

void setup() {
  // put your setup code here, to run once:
  pinMode(BUZZER_PIN, OUTPUT);
  isHigh = false;
  t = micros();
}

void loop() {
  playNote('c');
}

void playNote(char note) {
  unsigned long timeToWait;
  unsigned long timeToPlayTheNote = millis();
  while (timeToPlayTheNote - millis() < 1000) {
    if (note == 'c') {
      timeToWait = 1911;
    }
    if (micros() - t > timeToWait) {
      if (!isHigh) {
        digitalWrite(BUZZER_PIN, HIGH);
        isHigh = true;
      } else {
        digitalWrite(BUZZER_PIN, LOW);
        isHigh = false;
      }
      t = micros();
    }
  }
}

我不知道为什么这不起作用。我曾经每1000微秒播放一次频率,但有没有办法让这个更简单?此外,使用此方法,我必须执行(1 / f)/ 2,然后将该值从秒转换为微秒,并将其用作timeToWait的值。

2 个答案:

答案 0 :(得分:0)

  • 'timeToWait`的初始化显然应该在循环之外。
  • 阵列可用于计时数据。
  • 't`应该在'playNote'
  • 中初始化
  • 或者,您可以使用enum作为与笔记相关联的延迟。

    enum class notes
    {
        C = 1911
    };
    

好吧,所有建议都假设您不想补偿漂移偏移。

答案 1 :(得分:0)

蜂鸣器的频率固定。他们根本不像扬声器那样工作。使用真实的扬声器,您将获得更好的效果。不要忘记将电容器与其串联,这样扬声器就会看到一个交流信号,如果你给它一个直流信号,你可以很容易地炸一个扬声器。

为获得最佳效果,您应该背对背使用2 x 47uF至100uF电解电容,负极连接在一起,一个正极连接到扬声器,另一个正极连接到扬声器。电容越高,你就能获得更多低音。

为什么不使用50%(128)的PWM并更改PWM频率以产生声音?您可以使用Timer1或Timer3库。让硬件完成工作将更加明确,并且可以将您的应用程序释放给其他任务,例如阅读键盘。

https://playground.arduino.cc/Code/Timer1

使用analogWrite()将PWM设置为0%会切断声音。