我正在尝试一些初学者Arduino编程。
任务是让我拥有的电路板(ESP8266)播放一些音乐,然后当我按下按钮时音乐应该停止,然后当我再次按下它时重新启动。
这是我的代码,
#include "pitches.h" // contains frequencies for notes
#define PIN_BUTTON 0 // the button
#define PIN_BUZZER 13 // the digital pin the Buzzer is attached to
bool stop = false; // button pressed
void play_note(int freq){
if (freq > 0 && !stop){
analogWrite(PIN_BUZZER, 512);
analogWriteFreq(freq);
} else {
analogWrite(PIN_BUZZER, 0);
}
}
void stopMusic(){
stop = !stop;
play_note(0);
}
void setup() {
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_BUTTON, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIN_BUTTON), stopMusic, RISING);
}
void loop() {
// intro
play_note(NOTE_E7);
delay(110);
play_note(NOTE_E7);
delay(220);
play_note(NOTE_E7);
delay(220);
play_note(NOTE_C7);
delay(110);
play_note(NOTE_E7);
delay(220);
play_note(NOTE_G7);
delay(440);
play_note(NOTE_G6);
delay(440);
}
问题是,按钮不一致。有时,按下它时,音乐会立即停止。其他时候,它将继续播放,我将不得不再按一次或两次。同样地,当我想要再次开始播放音乐时,有时我会在按下按钮时开始播放音乐,但有时我需要按两次或更多次才能重新播放音乐。我不知道造成这种情况的原因。建议?
答案 0 :(得分:2)
按钮很可能是机械按钮。它们反弹,即在按下或释放一小段时间后打开和关闭触点。在检查新值之前,您必须等到按钮稳定后(通常为5-20ms,实际值取决于按钮,并且应在数据表中指定)。
这称为反弹。
或者,您可以从定期计时器中断检查按钮。但这会降低反应时间。
答案 1 :(得分:0)
您应该为代码添加一些去抖动逻辑。 https://www.arduino.cc/en/Tutorial/Debounce