蜂鳴器
用頻率做出聲音。 · ⏱ 約 25 分鐘
你會學到三件事
tone 用頻率發聲,而頻率就是「一秒抖幾次」
- 音高和頻率的對應關係
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 發出了指定頻率的聲音
- 你知道音高就是頻率,而高八度是乘二
- 你知道
tone 不會等,時長要自己 delay
如果卡住了
| 你看到 |
多半是因為 |
| 完全沒聲音 |
用了有源蜂鳴器。tone 只對無源的有用 |
| 一直叫不停 |
noTone 漏了 |
| 旋律連成一片 |
兩個音中間沒有空隙。加一小段 delay |
| 換另一支腳沒聲音 |
tone 一次只能一支。前一支要先 noTone |
在編輯器打開這一課 →