2017-08-11 57 views
0
unsigned long t; 
boolean isHigh; 

#define BUZZER_PIN 3 

void setup() { 
    // put your setup code here, to run once: 
    pinMode(BUZZER_PIN, OUTPUT); 
    isHigh = false; 
    t = micros(); 
} 

void loop() { 
    playNote('c'); 
} 

void playNote(char note) { 
    unsigned long timeToWait; 
    unsigned long timeToPlayTheNote = millis(); 
    while (timeToPlayTheNote - millis() < 1000) { 
    if (note == 'c') { 
     timeToWait = 1911; 
    } 
    if (micros() - t > timeToWait) { 
     if (!isHigh) { 
     digitalWrite(BUZZER_PIN, HIGH); 
     isHigh = true; 
     } else { 
     digitalWrite(BUZZER_PIN, LOW); 
     isHigh = false; 
     } 
     t = micros(); 
    } 
    } 
} 

我不知道爲什麼這不起作用。我曾經每1,000微秒播放一次頻率,但是有什麼辦法可以讓這個更簡單?此外,使用這種方法,我必須做(1/f)/ 2,然後將該值從秒轉換爲微秒,並將其用作timeToWait的值。C++蜂鳴器彈鋼琴音符爲Arduino

+1

代碼從不會在循環中調用'playNote'函數,也不會將其註冊爲'ISR' – Sma

+0

它現在可以正常工作,但無論如何它可以提高效率,因爲我需要很多其他的方法if statement for each note – Billy

+0

使用'Timmer Interrupts'來代替等待時間。 – Sma

回答

0
  • 'timeToWait`的初始化顯然應該在循環之外。
  • 一個數組可用於計時數據。
  • 't`應該在'play'內初始化'
  • 或者,您可以使用與筆記關聯的延遲枚舉。

    enum class notes 
    { 
        C = 1911 
    }; 
    

好了,所有的建議假設你不想補償漂移補償。

0

蜂鳴器有固定的頻率。他們根本不像喇叭一樣工作。真正的演講者會得到更好的結果。不要忘了放一個電容串聯它,因此揚聲器看到一個交流信號,你可以很容易地炒揚聲器,如果你餵它一個直流信號..

爲了獲得最佳效果,你應該使用2 x 47uF到100uF的電解電容背靠背,負極連接在一起,一個正極連接到duino,另一個正極連接到揚聲器。隨着更高的電容,你會得到更多的低音。

爲什麼不使用50%(128)的PWM並更改PWM頻率以生成聲音?您可以使用Timer1或Timer3庫。讓硬件來完成這項工作將更加重要,並且可以讓您的應用程序免費用於其他任務,例如讀取鍵盤。

https://playground.arduino.cc/Code/Timer1

設定爲0%的PWM用analogWrite()將削減的聲音。