引脚中断不一致

时间:2017-02-27 23:50:44

标签: arduino iot esp8266

我正在尝试一些初学者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);
}

问题是,按钮不一致。有时,按下它时,音乐会立即停止。其他时候,它将继续播放,我将不得不再按一次或两次。同样地,当我想要再次开始播放音乐时,有时我会在按下按钮时开始播放音乐,但有时我需要按两次或更多次才能重新播放音乐。我不知道造成这种情况的原因。建议?

2 个答案:

答案 0 :(得分:2)

按钮很可能是机械按钮。它们反弹,即在按下或释放一小段时间后打开和关闭触点。在检查新值之前,您必须等到按钮稳定后(通常为5-20ms,实际值取决于按钮,并且应在数据表中指定)。

这称为反弹。

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

答案 1 :(得分:0)

您应该为代码添加一些去抖动逻辑。 https://www.arduino.cc/en/Tutorial/Debounce