Semorphe

蜂鳴器

用頻率做出聲音。 · ⏱ 約 25 分鐘

你會學到三件事

  1. tone 用頻率發聲,而頻率就是「一秒抖幾次」
  2. 音高和頻率的對應關係
  3. noTone 不是「音量歸零」,是停止

開始之前

接線:蜂鳴器一腳接 8 號腳、一腳接 GND。

⚠️ 要用「無源」蜂鳴器(passive)。有源的(active)自己會叫一個固定音, tone 對它沒用,那是最常見的「照著做卻沒聲音」原因。

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、頻率

tone 的第二個數字是頻率,單位是赫茲:

1tone(8, 262);
8262在腳位發出赫茲 持續毫秒1

262 是頻率,單位是赫茲(Hz),也就是一秒振動 262 次。

耳朵把不同的振動速度聽成不同的音高:

音 頻率
Do (C4) 262
Re 294
Mi 330
Fa 349
Sol 392
La 440
Si 494
高 Do (C5) 523

⚠️ 高八度就是頻率乘二(262 → 523)。這不是巧合,它是音階的定義方式。

二、tone 之後程式會繼續往下跑

所以要自己等,再叫它停:

1tone(8, 262);2delay(300);3noTone(8);
82623008停止腳位的聲音等待毫秒在腳位發出赫茲 持續毫秒123

⚠️ tone 不會等。它啟動之後立刻執行下一行。

所以想讓一個音持續 0.3 秒,要自己 delay(300), 然後 noTone(8) 把它停掉。

做什麼
tone(腳, 頻率) 開始發這個音,立刻返回
tone(腳, 頻率, 時長) 發這個音,時間到自己停(仍然立刻返回)
noTone(腳) 停

三、⚠️ 一次只有一個

Arduino 上 tone 同時只能發一個音。對第二支腳呼叫 tone,第一支會被停掉。

想要和弦?用 tone 的話做不到。這是硬體的限制,不是你寫錯。

完成的樣子

這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。

1void setup() {2    pinMode(8, OUTPUT);3}4 5void loop() {6    tone(8, 262);7    delay(300);8    noTone(8);9    delay(300);10}
8OUTPUT設定腳位為82623008300等待毫秒停止腳位的聲音等待毫秒在腳位發出赫茲 持續毫秒定義函式 回傳型別void(無回傳)loop定義函式 回傳型別void(無回傳)setup1256789

換你了

用陣列存一段旋律,用迴圈播它:

int notes[] = {262, 294, 330, 349, 392};
for (int i = 0; i < 5; i++) {
    tone(8, notes[i]);
    delay(300);
    noTone(8);
    delay(50);
}

⚠️ 那個 delay(50) 不能省:兩個音中間沒有空隙的話,聽起來會連成一片。

再進階:把第 5 課的 analogRead 接上去,做一個「用光控制音高」的樂器。

到編輯器做這一題:練習:用陣列存一段旋律,用迴圈播它

做一個

把「生日快樂」的前四個音用兩個陣列存起來(一個放頻率,一個放長度),用迴圈播。

🔴 為什麼是兩個陣列而不是一個?因為每個音有兩件事要記。 ⚠️ 做完跟旁邊的人交換陣列的內容,聽聽看對方寫了什麼歌。

到編輯器做這一題:做一個:用陣列存一首歌

這一課你做了什麼

如果卡住了

你看到 多半是因為
完全沒聲音 用了有源蜂鳴器。tone 只對無源的有用
一直叫不停 noTone 漏了
旋律連成一片 兩個音中間沒有空隙。加一小段 delay
換另一支腳沒聲音 tone 一次只能一支。前一支要先 noTone
在編輯器打開這一課 →