2017-02-27 8 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); 
} 

です。時々、それを押すと、音楽はすぐに止まるでしょう。それ以外の場合は、それが再生され続けるだろうと私はそれをもう一度押す必要があります。同様に、音楽を再開するには、ボタンを押すとすぐに音楽が始まることがありますが、音楽を元に戻すには2回以上押す必要があります。私はこれを引き起こして何がわからない。提案?

+0

ArduinoはCではありません。 – Olaf

答えて

2

ボタンはおそらく機械的なものです。それらは跳ね返る、すなわち、短時間のプレスまたはリリース後にコンタクトを開閉する。新しい値を確認する前に、ボタンが安定するまで待つ必要があります(通常5〜20msです。実際の値はボタンによって異なり、データシートで指定する必要があります)。

これは、デバウンスと呼ばれます。

また、ボタンを定期的なタイマー割り込みからチェックすることもできます。しかし、それは反応時間を低下させます。