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的值。
答案 0 :(得分:0)
或者,您可以使用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%会切断声音。