1、tone(pin, frequency, duration)函数 #
pin:生成音调的 Arduino 引脚。
frequency:以赫兹为单位的音调频率。允许的数据类型:unsigned int。
duration:以毫秒为单位的音调持续时间(可选)。允许的数据类型:unsigned long。
在引脚上生成指定频率(和 50% 占空比)的方波。可以指定持续时间,否则波形会继续直到调用noTone()。该引脚可以连接到压电蜂鸣器或其他扬声器以播放音调。一次只能产生一种音调。如果音调已经在不同的引脚上播放,则tone()将无效。如果音调在同一引脚上播放,则函数调用将设置其频率。
使用该tone()功能会干扰引脚 3 和 11(在 Mega 以外的板上)上的 PWM 输出。
不可能产生低于 31Hz 的音调。
2、noTone(pin)函数 #
pin:停止生成音调的 Arduino 引脚
停止生成由 触发的方波tone()。如果没有产生音调,则无效。
如果您想在多个引脚上演奏不同的音高,则需要先调用noTone()一个引脚,然后再调用tone()下一个引脚。3、
3、震动频率与音调 #
NOTE_B0 31
NOTE_C1 33
NOTE_CS1 35
NOTE_D1 37
NOTE_DS1 39
NOTE_E1 41
NOTE_F1 44
NOTE_FS1 46
NOTE_G1 49
NOTE_GS1 52
NOTE_A1 55
NOTE_AS1 58
NOTE_B1 62
NOTE_C2 65
NOTE_CS2 69
NOTE_D2 73
NOTE_DS2 78
NOTE_E2 82
NOTE_F2 87
NOTE_FS2 93
NOTE_G2 98
NOTE_GS2 104
NOTE_A2 110
NOTE_AS2 117
NOTE_B2 123
NOTE_C3 131
NOTE_CS3 139
NOTE_D3 147
NOTE_DS3 156
NOTE_E3 165
NOTE_F3 175
NOTE_FS3 185
NOTE_G3 196
NOTE_GS3 208
NOTE_A3 220
NOTE_AS3 233
NOTE_B3 247
NOTE_C4 262
NOTE_CS4 277
NOTE_D4 294
NOTE_DS4 311
NOTE_E4 330
NOTE_F4 349
NOTE_FS4 370
NOTE_G4 392
NOTE_GS4 415
NOTE_A4 440
NOTE_AS4 466
NOTE_B4 494
NOTE_C5 523
NOTE_CS5 554
NOTE_D5 587
NOTE_DS5 622
NOTE_E5 659
NOTE_F5 698
NOTE_FS5 740
NOTE_G5 784
NOTE_GS5 831
NOTE_A5 880
NOTE_AS5 932
NOTE_B5 988
NOTE_C6 1047
NOTE_CS6 1109
NOTE_D6 1175
NOTE_DS6 1245
NOTE_E6 1319
NOTE_F6 1397
NOTE_FS6 1480
NOTE_G6 1568
NOTE_GS6 1661
NOTE_A6 1760
NOTE_AS6 1865
NOTE_B6 1976
NOTE_C7 2093
NOTE_CS7 2217
NOTE_D7 2349
NOTE_DS7 2489
NOTE_E7 2637
NOTE_F7 2794
NOTE_FS7 2960
NOTE_G7 3136
NOTE_GS7 3322
NOTE_A7 3520
NOTE_AS7 3729
NOTE_B7 3951
NOTE_C8 4186
NOTE_CS8 4435
NOTE_D8 4699
NOTE_DS8 4978
4、所需元件清单 #
Arduino Uno主板
USB数据线
有源蜂鸣器/无源蜂鸣器
面包板
9V电池
杜邦导线
5、动手实验 #
实验1、对照震动频率与音调关系表,播放do re mi fa sol la si
A实验接线
VCC—5v
GND—GND
I/0—D3
B实验代码
const int buzzPin=3;
delayTime=200;
void setup() {
// put your setup code here, to run once:
pinMode(buzzPin,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
tone(buzzPin,262, 150);
delay(delayTime);
noTone(buzzPin);
tone(buzzPin,294, 150);
delay(delayTime);
noTone(buzzPin);
tone(buzzPin,330, 150);
delay(delayTime);
noTone(buzzPin);
tone(buzzPin,349, 150);
delay(delayTime);
noTone(buzzPin);
tone(buzzPin,292, 150);
delay(delayTime);
noTone(buzzPin);
tone(buzzPin,440, 150);
delay(delayTime);
noTone(buzzPin);
tone(buzzPin,494, 150);
delay(delayTime);
noTone(buzzPin);
}
实验2、播放melody音乐
实验代码
#define NOTE_C4 262
#define NOTE_G3 196
#define NOTE_A3 220
#define NOTE_B3 247
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
void setup() {
// iterate over the notes of the melody:
}
void loop() {
for (int thisNote = 0; thisNote < 8; thisNote++) {
// to calculate the note duration, take one second divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000 / noteDurations[thisNote];
tone(3, melody[thisNote], noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(3);
}
}
实验3,循环播放马里奥世界
实验代码
#include pitches.h
void Play_MarioUW()
{
for (int thisNote = 0; thisNote < (sizeof(MarioUW_note)/sizeof(int)); thisNote++) {
int noteDuration = 1000 / MarioUW_duration[thisNote];//convert duration to time delay
tone(3, MarioUW_note[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.80;
delay(pauseBetweenNotes);
noTone(3); //stop music on pin 8
}
}
void setup() {
pinMode(3, OUTPUT); //Button 2 with internal pull up
Serial.begin(9600);
}
void loop() {
Serial.println("Selected -> 'Mario UnderWorld' ");
Play_MarioUW();
}