蜂鳴器
用頻率做出聲音。 · ⏱ 約 25 分鐘
你會學到三件事
tone 用頻率發聲,而頻率就是「一秒抖幾次」
- 音高和頻率的對應關係
noTone 不是「音量歸零」,是停止
開始之前
接線:蜂鳴器一腳接 8 號腳、一腳接 GND。
⚠️ 要用「無源」蜂鳴器(passive)。有源的(active)自己會叫一個固定音,
tone 對它沒用,那是最常見的「照著做卻沒聲音」原因。
🟢 先把編輯器打開,跟著下面一起做:跟著做
一、頻率
tone 的第二個數字是頻率,單位是赫茲:
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);
⚠️ 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}
換你了
用陣列存一段旋律,用迴圈播它:
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 |
在編輯器打開這一課 →