无源蜂鸣器是一种需要外部驱动信号才能发声的电子元件。与有源蜂鸣器不同,无源蜂鸣器内部没有振荡电路,因此需要通过外部提供的方波信号来驱动。
1、工作原理:
无源蜂鸣器的发声原理类似于扬声器。通过给音圈接入交变电流,形成电磁铁与永磁铁的相互作用,推动振膜发声。接入直流电只能持续推动振膜,无法产生声音。
2、驱动方式:
无源蜂鸣器需要外部提供一定频率的方波信号来驱动。通过改变方波的频率,可以控制蜂鸣器发出不同的音调。这使得无源蜂鸣器可以用于播放简单的音乐。
3、频率与音调:
无源蜂鸣器的声音频率可调。通过改变输入信号的频率,可以实现不同的音调。例如,常见的音符频率对照表可以帮助你生成特定的音调。
4、应用场景:
无源蜂鸣器广泛应用于各种电子设备中,如计算机、报警器、电子玩具等。由于其声音频率可控,适用于需要发出特定音调的场合。
5、模块优点:
无源蜂鸣器通常比有源蜂鸣器便宜,且声音频率可控,可以实现多种音效。此外,在某些情况下,无源蜂鸣器可以与LED复用一个控制口,节省资源。
Arduino实验接线示意图(实验接脚不同)
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十二:ESP32-S3 WROOM N16R8 CAM开发板WiFi+蓝牙模块
OV2640/5640摄像头模组
{花雕动手做}项目之十九:使用ESP32-S3-CAM WROOM N16R8驱动报警器
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十二:ESP32-S3 WROOM N16R8 CAM开发板WiFi+蓝牙模块
OV2640/5640摄像头模组
{花雕动手做}项目之十九:使用ESP32-S3-CAM WROOM N16R8驱动报警器
*/
#define PIN_BUZZER 21 // 定义蜂鸣器连接的引脚为21
#define PIN_BUTTON 47 // 定义按钮连接的引脚为47
#define CHN 0 // 定义PWM通道
void setup() {
pinMode(PIN_BUTTON, INPUT); // 设置按钮引脚为输入模式
pinMode(PIN_BUZZER, OUTPUT); // 设置蜂鸣器引脚为输出模式
ledcAttachChannel(PIN_BUZZER, 1, 10, CHN); // 将蜂鸣器引脚连接到PWM通道
ledcWriteTone(PIN_BUZZER, 2000); // 以2kHz的频率发声0.3秒
delay(300); // 延迟300毫秒
}
void loop() {
if (digitalRead(PIN_BUTTON) == LOW) { // 如果读取到按钮引脚为低电平(按钮被按下)
alert(); // 调用alert函数
} else {
ledcWriteTone(PIN_BUZZER, 0); // 停止发声
}
}
void alert() {
float sinVal; // 定义一个变量保存正弦值
int toneVal; // 定义一个变量保存声音频率
for (int x = 0; x < 360; x += 10) { // 从0度到360度,每次增加10度
sinVal = sin(x * (PI / 180)); // 计算x的正弦值
toneVal = 2000 + sinVal * 500; // 根据x的正弦值计算声音频率
ledcWriteTone(PIN_BUZZER, toneVal); // 设置蜂鸣器的频率
delay(10); // 延迟10毫秒
}
}
代码解读:
1、定义常量:
```cpp
#define PIN_BUZZER 21 // 定义蜂鸣器连接的引脚为21
#define PIN_BUTTON 47 // 定义按钮连接的引脚为47
#define CHN 0 // 定义PWM通道
```
这里定义了蜂鸣器和按钮连接的引脚,以及使用的PWM通道。PIN_BUZZER表示蜂鸣器连接的GPIO引脚,PIN_BUTTON表示按钮连接的GPIO引脚,CHN表示使用的PWM通道。
2、初始化设置:
```cpp
void setup() {
pinMode(PIN_BUTTON, INPUT); // 设置按钮引脚为输入模式
pinMode(PIN_BUZZER, OUTPUT); // 设置蜂鸣器引脚为输出模式
ledcAttachChannel(PIN_BUZZER, 1, 10, CHN); // 将蜂鸣器引脚连接到PWM通道
ledcWriteTone(PIN_BUZZER, 2000); // 以2kHz的频率发声0.3秒
delay(300); // 延迟300毫秒
}
```
在setup函数中,设置按钮引脚为输入模式,蜂鸣器引脚为输出模式。使用ledcAttachChannel函数将蜂鸣器引脚连接到PWM通道,并使用ledcWriteTone函数以2kHz的频率发声0.3秒。
3、主循环:
```cpp
void loop() {
if (digitalRead(PIN_BUTTON) == LOW) { // 如果读取到按钮引脚为低电平(按钮被按下)
alert(); // 调用alert函数
} else {
ledcWriteTone(PIN_BUZZER, 0); // 停止发声
}
}
```
在loop函数中,检查按钮的状态。如果按钮被按下(读取到低电平),则调用alert函数;否则,停止蜂鸣器发声。
4、报警函数:
```cpp
void alert() {
float sinVal; // 定义一个变量保存正弦值
int toneVal; // 定义一个变量保存声音频率
for (int x = 0; x < 360; x += 10) { // 从0度到360度,每次增加10度
sinVal = sin(x * (PI / 180)); // 计算x的正弦值
toneVal = 2000 + sinVal * 500; // 根据x的正弦值计算声音频率
ledcWriteTone(PIN_BUZZER, toneVal); // 设置蜂鸣器的频率
delay(10); // 延迟10毫秒
}
}
```
alert函数生成一个频率变化的声音。通过计算正弦值来改变声音频率,形成一个类似警报的声音效果。循环从0度到360度,每次增加10度,计算正弦值并相应调整蜂鸣器的频率。
5、PWM控制:
使用ledcAttachChannel和ledcWriteTone函数实现PWM控制。ledcAttachChannel函数将引脚连接到PWM通道,ledcWriteTone函数设置PWM信号的频率。通过这种方式,可以精确控制无源蜂鸣器的发声频率,实现复杂的声音效果。
实验场景图
评论