Arduino入门教程:9、蜂鸣器
飞书文档https://x509p6c8to.feishu.cn/docx/HQwUdLHm5oCNjvxQfEpcjibQn4g
一、应用场景
大部分的电子产品、家电(风扇、空调、电水壶)都会有蜂鸣器,用于提示设备的工作状态
| |
二、原理
蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号。
蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器
有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定。
无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。
蜂鸣器有正负极,顶部印有+号的为正极,若蜂鸣器引脚没剪,则长的为正极。
三、接线图
加NPN型三极管进行驱动,因为单片机的引脚驱动能力有限,蜂鸣器的功率比较大,所以需要通过三极管来驱动,R2为限流电阻,单片机引脚如果给高电平,则三极管导通,VCC便给蜂鸣器供电,如果给低电平,则三极管断开
| |
四、参考代码
有源蜂鸣器(课程选择)
#include <Arduino.h>//蜂鸣器引脚
#define PIN_BUZZER 18void setup()
{ pinMode(PIN_BUZZER, OUTPUT);
}void loop()
{digitalWrite(PIN_BUZZER, HIGH);delay(2000);digitalWrite(PIN_BUZZER, LOW);delay(2000);
}
无源蜂鸣器
PWM:脉冲宽度调制
#include <Arduino.h>//蜂鸣器引脚
#define PIN_BUZZER 18int freq = 2000; //设置频率2000kHz
int channel = 0; //通道号,取值0 ~ 15
int resolution = 8; //分辨率,取值0~20,占空比duty最大取值为2^resolution-1void setup() {Serial.begin(9600);//设置通道频率和分辨率ledcSetup(channel, freq, resolution);//将通道0与引脚15连接ledcAttachPin(PIN_BUZZER, channel);//输出指定音阶、音调ledcWriteNote(channel,NOTE_D,5);delay(3000);ledcWrite(channel, 0);
}void loop() {//设置通道频率ledcWriteTone(channel, 2000);//动态修改占空比for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle = dutyCycle + 10) {Serial.println(dutyCycle);ledcWrite(channel, dutyCycle);delay(1000);}//设置通道占空比 125/2^8 50%ledcWrite(channel, 125);//动态修改频率for (int freq = 255; freq < 10000; freq = freq + 250) {Serial.println(freq);ledcWriteTone(channel, freq);delay(1000);}
}