Arduino 第七章:蜂鸣器
引言
在之前的章节中,我们学习了 Arduino 的数字输入输出、串口通信、模拟输入输出等功能。在实际的 Arduino 项目里,声音也是一种重要的交互方式。蜂鸣器作为一种常见且简单的发声设备,能发出不同频率和节奏的声音,可用于报警、提示等场景。在这一章,我们将详细探讨如何使用 Arduino 控制蜂鸣器。
蜂鸣器的类型及工作原理
类型
蜂鸣器主要分为有源蜂鸣器和无源蜂鸣器。
有源蜂鸣器
有源蜂鸣器内部自带振荡源,只要给它加上合适的直流电压,就能发出固定频率的声音。其优点是驱动简单,缺点是发声频率固定,无法调节。
无源蜂鸣器
无源蜂鸣器内部没有振荡源,需要外部提供一定频率的脉冲信号才能发声。通过改变输入脉冲信号的频率,可以改变蜂鸣器发出声音的音调,因此使用起来更加灵活。
工作原理
有源蜂鸣器在通电时,内部的振荡电路产生固定频率的电信号,驱动压电陶瓷片或电磁线圈振动发声。
无源蜂鸣器则是基于电磁感应原理或压电效应。当外部施加的脉冲信号使电磁线圈产生交变磁场,或者使压电陶瓷片产生机械振动时,蜂鸣器就会发声。
硬件连接
有源蜂鸣器连接
- 找到有源蜂鸣器的正负极,通常长脚为正极,短脚为负极。
- 将蜂鸣器的正极通过一个 220Ω - 1KΩ 的电阻连接到 Arduino 的数字引脚(例如引脚 8),负极连接到 Arduino 的 GND 引脚。电阻的作用是限流,防止电流过大损坏蜂鸣器和 Arduino。
无源蜂鸣器连接
- 无源蜂鸣器没有正负极之分。
- 同样将蜂鸣器的一个引脚通过一个 220Ω - 1KΩ 的电阻连接到 Arduino 的数字引脚(例如引脚 9),另一个引脚连接到 Arduino 的 GND 引脚。
控制有源蜂鸣器的代码实现
// 定义蜂鸣器连接的引脚
const int buzzerPin = 9;
void setup() {
// 将蜂鸣器引脚设置为输出模式
pinMode(buzzerPin, OUTPUT);
}
void loop() {
// 点亮蜂鸣器
digitalWrite(buzzerPin, HIGH);
// 延迟 1000 毫秒(1 秒)
delay(1000);
// 关闭蜂鸣器
digitalWrite(buzzerPin, LOW);
// 延迟 1000 毫秒(1 秒)
delay(1000);
}
代码解释
- 变量定义:
const int buzzerPin = 9;
定义了蜂鸣器连接的引脚为数字引脚 9。 setup()
函数:pinMode(buzzerPin, OUTPUT);
将引脚 9 设置为输出模式,以便向蜂鸣器发送信号。loop()
函数:digitalWrite(buzzerPin, HIGH);
向引脚 9 输出高电平,使蜂鸣器发声。delay(1000);
程序暂停 1 秒,让蜂鸣器持续发声 1 秒。digitalWrite(buzzerPin, LOW);
向引脚 9 输出低电平,关闭蜂鸣器。delay(1000);
程序再暂停 1 秒,让蜂鸣器保持关闭状态 1 秒。
控制无源蜂鸣器的代码实现
// 定义蜂鸣器连接的引脚
const int buzzerPin = 9;
void setup() {
// 将蜂鸣器引脚设置为输出模式
pinMode(buzzerPin, OUTPUT);
}
void loop() {
// 以 1000Hz 的频率发声 1 秒
tone(buzzerPin, 1000);
delay(1000);
// 停止发声
noTone(buzzerPin);
delay(1000);
}
代码解释
- 变量定义:
const int buzzerPin = 9;
定义了蜂鸣器连接的引脚为数字引脚 9。 setup()
函数:pinMode(buzzerPin, OUTPUT);
将引脚 9 设置为输出模式。loop()
函数:tone(buzzerPin, 1000);
调用tone()
函数,向引脚 9 输出频率为 1000Hz 的脉冲信号,使蜂鸣器发出 1000Hz 的声音。delay(1000);
程序暂停 1 秒,让蜂鸣器持续发声 1 秒。noTone(buzzerPin);
调用noTone()
函数,停止向引脚 9 输出脉冲信号,使蜂鸣器停止发声。delay(1000);
程序再暂停 1 秒,让蜂鸣器保持安静 1 秒。
综合应用:播放简单旋律
// 定义蜂鸣器连接的引脚
const int buzzerPin = 9;
// 定义音符频率
int melody[] = {262, 294, 330, 349, 392, 440, 494, 523};
// 定义每个音符的持续时间
int noteDurations[] = {4, 4, 4, 4, 4, 4, 4, 4};
void setup() {
// 将蜂鸣器引脚设置为输出模式
pinMode(buzzerPin, OUTPUT);
}
void loop() {
// 遍历每个音符
for (int thisNote = 0; thisNote < 8; thisNote++) {
// 计算音符的持续时间
int noteDuration = 1000 / noteDurations[thisNote];
// 播放当前音符
tone(buzzerPin, melody[thisNote], noteDuration);
// 音符之间的间隔时间
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// 停止发声
noTone(buzzerPin);
}
// 整首旋律播放完后暂停 2 秒
delay(2000);
}
代码解释
- 变量定义:
const int buzzerPin = 9;
定义蜂鸣器连接的引脚。int melody[]
数组存储了不同音符的频率,例如 262Hz 对应音符 C。int noteDurations[]
数组存储了每个音符的持续时间,这里的数字表示几分之一拍。
setup()
函数:将蜂鸣器引脚设置为输出模式。loop()
函数:- 使用
for
循环遍历每个音符。 int noteDuration = 1000 / noteDurations[thisNote];
计算每个音符的持续时间(毫秒)。tone(buzzerPin, melody[thisNote], noteDuration);
播放当前音符。int pauseBetweenNotes = noteDuration * 1.30;
计算音符之间的间隔时间。delay(pauseBetweenNotes);
程序暂停,留出音符间隔。noTone(buzzerPin);
停止发声。- 整首旋律播放完后,程序暂停 2 秒,然后再次循环播放。
- 使用
总结
通过本章的学习,我们了解了蜂鸣器的类型、工作原理,掌握了使用 Arduino 控制有源蜂鸣器和无源蜂鸣器的方法,还实现了播放简单旋律的功能。蜂鸣器可以为我们的 Arduino 项目增添声音交互的元素,使项目更加生动有趣。在后续的项目中,我们可以根据需求利用蜂鸣器实现更多的功能,如报警系统、音乐播放器等。