2017-02-27 5 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-20ms, 실제 값은 버튼에 따라 다르며 데이터 시트에 지정되어야 함).

이것을 디 바운싱 (de-bouncing)이라고합니다.

또는 주기적 타이머 인터럽트에서 단추를 확인할 수 있습니다. 그러나 그것은 반응 시간을 떨어 뜨릴 것입니다.