2017-02-27 3 views
0

Ich versuche einige Anfänger Arduino Programmierung.Pin Interrupt ist inkonsistent

Die Aufgabe ist es, das Board, das ich habe (ESP8266) etwas Musik spielen und dann sollte die Musik aufhören, wenn ich die Taste drücke, und dann neu starten, wenn ich es erneut drücke.

Hier ist mein Code,

#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); 
} 

Das Problem ist, dass die Schaltfläche inkonsistent wird. Manchmal wird die Musik beim Drücken sofort gestoppt. Zu anderen Zeiten wird es weiterspielen und ich muss es ein- oder zweimal mehr drücken. Wenn ich die Musik neu starten möchte, startet sie manchmal, sobald ich die Taste drücke, aber manchmal muss ich sie zweimal drücken, um die Musik wieder hochzuladen. Ich weiß nicht, was das verursacht. Vorschläge?

+0

Arduino ist nicht C. – Olaf

Antwort

2

Der Knopf ist höchstwahrscheinlich ein mechanischer. Sie prallen auf, d. H. Öffnen und schließen die Kontakte nach einem Drücken oder Freigeben für eine kurze Zeit. Sie müssen warten, bis sich die Schaltfläche stabilisiert hat (normalerweise 5-20 ms, der tatsächliche Wert hängt von der Schaltfläche ab und sollte im Datenblatt angegeben werden), bevor Sie nach einem neuen Wert suchen.

Dies wird als Entprellen bezeichnet.

Alternativ können Sie die Schaltfläche von einem periodischen Timer-Interrupt überprüfen. Aber das würde die Reaktionszeit verschlechtern.

Verwandte Themen