引脚中断不一致

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 毫秒,实际值取决于按钮并且应在数据表中指定)。

这称为去抖动。

或者,您可以通过周期性定时器中断检查按钮。但这会降低反应时间。