引脚中断不一致
Pin interrupt being inconsistent
我正在尝试一些初学者 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);
}
问题是按钮不一致。有时,按下它,音乐会立即停止。其他时候,它会继续播放,我必须再按一次或两次。同样,当我想让音乐重新开始时,有时我一按下按钮它就会开始,但有时我需要按两次或更多次才能让音乐恢复。我不知道是什么原因造成的。建议?
您或许应该在代码中添加一些反跳逻辑。
https://www.arduino.cc/en/Tutorial/Debounce
该按钮很可能是机械按钮。它们弹跳,即在短时间按下或释放后打开和关闭触点。在检查新值之前,您必须等到按钮稳定(通常为 5-20 毫秒,实际值取决于按钮并且应在数据表中指定)。
这称为去抖动。
或者,您可以通过周期性定时器中断检查按钮。但这会降低反应时间。
我正在尝试一些初学者 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);
}
问题是按钮不一致。有时,按下它,音乐会立即停止。其他时候,它会继续播放,我必须再按一次或两次。同样,当我想让音乐重新开始时,有时我一按下按钮它就会开始,但有时我需要按两次或更多次才能让音乐恢复。我不知道是什么原因造成的。建议?
您或许应该在代码中添加一些反跳逻辑。 https://www.arduino.cc/en/Tutorial/Debounce
该按钮很可能是机械按钮。它们弹跳,即在短时间按下或释放后打开和关闭触点。在检查新值之前,您必须等到按钮稳定(通常为 5-20 毫秒,实际值取决于按钮并且应在数据表中指定)。
这称为去抖动。
或者,您可以通过周期性定时器中断检查按钮。但这会降低反应时间。