We use tone() to play sounds or melodies on a speaker connected to an Arduino. It helps make projects more fun and interactive.
Playing melodies with tone() in Arduino
tone(pin, frequency, duration);
pin is the Arduino pin connected to the speaker.
frequency is the sound pitch in Hertz (Hz).
duration is how long the tone plays in milliseconds (optional).
tone(8, 440);
tone(8, 523, 500);
noTone(8);This program plays a simple melody of 8 notes on a speaker connected to pin 8. Each note plays for a quarter note duration, then pauses briefly before the next note. The melody repeats forever.
const int speakerPin = 8; // Notes in the melody (frequencies in Hz) int melody[] = {262, 294, 330, 349, 392, 440, 494, 523}; // Note durations: 4 = quarter note, 8 = eighth note, etc. int noteDurations[] = {4, 4, 4, 4, 4, 4, 4, 4}; void setup() { // no setup needed } void loop() { for (int thisNote = 0; thisNote < 8; thisNote++) { int noteDuration = 1000 / noteDurations[thisNote]; tone(speakerPin, melody[thisNote], noteDuration); // Pause between notes int pauseBetweenNotes = noteDuration * 1.3; delay(pauseBetweenNotes); noTone(speakerPin); } delay(1000); // Wait before repeating melody }
You must connect a piezo speaker or buzzer to the Arduino pin and ground to hear the sound.
Use noTone(pin) to stop the sound before playing the next note.
Delays control the timing between notes to make the melody sound right.
tone() plays a sound at a specific pitch on a speaker pin.
You can create melodies by playing notes one after another with pauses.
Use noTone() to stop sounds before playing new ones.
Practice
tone() function do in Arduino?Solution
Step 1: Understand the purpose of
Thetone()tone()function generates a square wave of the specified frequency on a pin, producing sound through a speaker.Step 2: Compare options with function behavior
Only It plays a sound at a specific frequency on a speaker. describes playing sound at a frequency, which matchestone()usage.Final Answer:
It plays a sound at a specific frequency on a speaker. -> Option CQuick Check:
tone()= plays sound [OK]
- Confusing tone() with analogWrite() for LEDs
- Thinking tone() reads sensor data
- Assuming tone() sends serial data
Solution
Step 1: Recall tone() function parameters
The correct order istone(pin, frequency, duration). So pin 8, frequency 440 Hz, duration 500 ms.Step 2: Check each option's parameter order
tone(8, 440, 500); matches the correct order. tone(8, 440); delay(500); plays tone without duration, relying on delay, which is valid but not the asked syntax.Final Answer:
tone(8, 440, 500); -> Option DQuick Check:
tone(pin, freq, duration) = tone(8, 440, 500) [OK]
- Swapping frequency and pin parameters
- Confusing duration with frequency
- Omitting duration but expecting timed tone
void setup() {
tone(9, 262, 250);
delay(300);
tone(9, 294, 250);
delay(300);
noTone(9);
}
void loop() {}Solution
Step 1: Analyze tone() and delay() calls
The code plays 262 Hz tone for 250 ms, waits 300 ms, then plays 294 Hz tone for 250 ms, waits 300 ms.Step 2: Understand noTone() effect
noTone(9) stops any tone on pin 9 after the notes play. The loop is empty, so no repetition.Final Answer:
Play two notes (C4 and D4) on pin 9 with pauses, then stop sound. -> Option AQuick Check:
tone + delay + noTone = two notes then stop [OK]
- Assuming tones play simultaneously
- Thinking noTone() stops before notes play
- Believing empty loop causes error
void setup() {
tone(7, 330);
delay(500);
tone(7, 349);
delay(500);
noTone(7);
}
void loop() {}Solution
Step 1: Understand tone() without duration
Calling tone(pin, freq) plays the tone continuously until stopped or replaced by another tone() on the same pin.Step 2: Analyze timing of tones and delays
The first tone starts and plays for 500 ms during delay(). The second tone replaces it immediately, playing the new frequency for the next 500 ms. No overlap occurs.Final Answer:
The second tone replaces the first (which continues until replaced), resulting in sequential notes without overlap. -> Option BQuick Check:
tone without duration replaced by next tone() = sequential notes [OK]
- Assuming tone() stops automatically after delay
- Thinking tone() calls on same pin cause overlap
- Believing delay controls tone length without duration
Solution
Step 1: Understand timing requirements
Each note plays 300 ms, plus 100 ms pause, total 400 ms delay between notes.Step 2: Check code for correct tone duration and delay
for (int i = 0; i < 3; i++) { int notes[] = {262, 294, 330}; tone(10, notes[i], 300); delay(400); } noTone(10); uses tone with duration 300 ms and delay 400 ms, matching timing. noTone(10) after loop stops sound.Step 3: Verify other options
int notes[] = {262, 294, 330}; for (int i = 0; i < 3; i++) { tone(10, notes[i]); delay(250); noTone(10); delay(100); } calls noTone inside loop, cutting notes short. int notes[] = {262, 294, 330}; for (int i = 0; i < 3; i++) { tone(10, notes[i], 300); delay(250); noTone(10); delay(100); } delays only 250 ms, missing pause. int notes[] = {262, 294, 330}; for (int i = 0; i < 3; i++) { tone(10, notes[i]); delay(400); } noTone(10); plays tone without duration, causing overlap.Final Answer:
for (int i = 0; i < 3; i++) { int notes[] = {262, 294, 330}; tone(10, notes[i], 300); delay(400); } noTone(10); -> Option AQuick Check:
tone(duration) + delay(total note+pause) = for (int i = 0; i < 3; i++) { int notes[] = {262, 294, 330}; tone(10, notes[i], 300); delay(400); } noTone(10); [OK]
- Calling noTone() inside loop too early
- Using delay shorter than note+pause
- Omitting duration causing overlapping notes
Ready to prove it?
Pass the test and this pattern moves unknown
