Semorphe

蜂鳴器

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

你會學到三件事

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

開始之前

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

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

一、頻率

tone(8, 262);

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

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

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

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

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

tone(8, 262);
delay(300);
noTone(8);

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

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

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

三、⚠️ 一次只有一個

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

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

完成的樣子

void setup() {
    pinMode(8, OUTPUT);
}

void loop() {
    tone(8, 262);
    delay(300);
    noTone(8);
    delay(300);
}

換你了

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

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
在編輯器打開這一課 →