我编写了一个代码,每次按下按钮时,它将播放歌曲中的下一个音符。但是问题是,由于某种原因,它会不断跳过数组中的相同注释。
例如(我的代码):
int mariomelody[] = {
NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_C5, NOTE_E5, NOTE_G5, NOTE_G4,
//THERE ARE TWO 'NOTE_E5's BECAUSE THE THIRD NOTE DOESNT PLAY
NOTE_C5, NOTE_G4, NOTE_E4, NOTE_A4, NOTE_B5, NOTE_AS4, NOTE_A4,
NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5, NOTE_E5,
NOTE_C5, NOTE_D5, NOTE_B4,
//buttonPin sits at DIG. 12
int buttonPin = 12;
void setup()
{
// put your setup code here, to run once:
pinMode(buttonPin, INPUT);
}
void loop()
{
// put your main code here, to run repeatedly:
for (int i = 0; i < sizeof(mariomelody) / sizeof(mariomelody[0]); i++)
{
while (digitalRead(buttonPin) == HIGH)
{
tone(8, mariomelody[i], 20);
}
while (digitalRead(buttonPin) == LOW)
{
}
}
每个人都知道马里奥旋律是正确的。前三个音符在不同速度下是相同的(4是速度8的一半)。 E(4)E(4)E(8)。由于某种原因,它只跳过了第三个NOTE_E5
,所以我在这里放了另一个NOTE_E5
,现在它可以正常工作了。
有人知道为什么它跳过注释吗?是我的代码吗?
答案 0 :(得分:1)
我不知道mario的旋律,但无论如何,我认为您的代码是错误的:
尝试一下:
void loop()
{
for (int i = 0; i < sizeof(mariomelody) / sizeof(mariomelody[0]); i++)
{
while (digitalRead(buttonPin) == LOW)
{
// wait until button is pressed
}
tone(8, mariomelody[i], 20);
while (digitalRead(buttonPin) == HIGH)
{
// wait until button is released
}
}
}