2017-02-27 32 views
0

我嘗試了一些初學者的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

Arduino不是C. – Olaf

回答

2

按鈕是最有可能是機械的。它們反彈,即在短時間按下或釋放後打開和關閉觸點。在檢查新值之前,您必須等待按鈕穩定後(通常爲5-20毫秒,實際值取決於按鈕,應在數據表中指定)。

這就是所謂的去彈跳。

或者,你可以從週期性定時器中斷檢查按鈕。但是這會降低反應時間。