点击上方“蘑菇云创造”可以关注我们哦
这里我们要接触一个新的电子元件——蜂鸣器,从字面意思就可以知道,这是一个会发声的元件。这次做一个报警器,通过连接蜂鸣器到Arduino数字输出引脚,并配合相应的程序就可以产生报警器的声音。其原理是利用正弦波产生不同频率的声音。如果结合一个LED,配合同样的正弦波产生灯光的话,就是一个完整的报警器了。
所需元件
■ 1× 蜂鸣器
硬件连接
按下图连接图连接,注意蜂鸣器引脚正(+),负(-)。标有+的引脚接到数字口8,另一个接GND。
图 6-1报警器连线图
图形化编程
样例程序 6-1:
下载程序完成后,你会听到一高一低的报警声,如同汽车报警器。
图形化指令学习
代码学习
项目代码如下
1. #include <DFRobot_Libraries.h>
2. // 创建对象
3. DFRobot_Tone DFTone;
4.
5. // 主程序开始
6. void setup() {
7.
8. }
9. void loop() {
10. DFTone.play(8, 131, 250);
11. DFTone.play(8, 523, 250);
12. }
Loop中只有一个新的函数,DFTone.Play( )。对应指令
函数格式如下:
如果我们希望蜂鸣器能够发出更加多样,和不同时长的声音,就会发现,单单依靠Mind+的图形化编程已经无法满足预期的要求了,“播放音符”指令后对应的节拍表示发音持续时间,在Mind+中可以理解为1拍=1秒。如图,Mind+的发音时长只有几个固定的选项,无法再减小发声时间。
Mind+的图形指令虽然使用便捷,但是一定程度上牺牲了代码的灵活性,也限制了使用者天马行空的创造力。所以从现在开始,我们将图形化编程这根拐杖放在一旁,只用代码编程完成后续课程的项目,快来感受它的魅力吧!
代码编程
在手动编辑区输入样例代码6-2
//项目六 报警器
float sinVal;
int toneVal;
#include <DFRobot_Libraries.h>
// 创建对象
DFRobot_Tone DFTone;
void setup(){
pinMode(8, OUTPUT);
}
void loop(){
for(int x=0; x<180; x++){
//将sin函数角度转化为弧度
sinVal = (sin(x*(3.1415/180)));
//用sin函数值产生声音的频率
toneVal = 2000+(int(sinVal*1000));
//给引脚8一个蜂鸣器声音输出信号.
DFTone.play(8, toneVal,2);
}
}
下载完代码后,我们能够听见蜂鸣器发出由低到高、再由高到低的警报声。不同于之前图形化编程发出较为简单的声音,使用代码能够让输出更具有变化和多样性。
代码学习
首先,定义两个变量:
float sinVal;
int toneVal;
浮点型变量sinVal用来存储正弦值,这是由于正弦值有小数。正弦波呈现一个波浪形的变化,变化比较均匀,所以我们选用正弦波的变化来作为我们声音频率的变换,toneVal从sinVal变量中获得数值,并把它转换为所需要的频率。
#include <DFRobot_Libraries.h>
// 创建对象
DFRobot_Tone DFTone;
对于库和对象,将在项目十中做详细解释,那时有了几次使用的基础将更容易理解。
void setup(){
pinMode(8, OUTPUT);
}
setup中的函数pinMode()的格式如下:
这个函数的作用是,来规定某个引脚是作为输入,或是输出,mode的值分别对应INPUT(输入)和OUTPUT(输出)。为什么在Mind+中没有这条指令,是因为它已经被封装在了其他指令中,比如digitalwrite(pin),当程序运行数字信号输出指令的时候,其实已经使用了pinMod(OUT)指令,但是这一过程没有在代码中体现。
这里用的是sin()函数,一个数学函数,可以算出一个角度的正弦值,这个函数采用弧度单位。因为我们不想让函数值出现负数,所以设置for循环在0~179之间,也就是0~180度之间。
■ for(int x=0; x<180; x++){
函数sin()用的弧度单位,不是角度单位。要通过公式将角度转为弧度:
■ sinVal = (sin(x*(3.1415/180)));
之后,将这个值转变成相应的报警声音的频率:
■ toneVal = 2000+(int(sinVal*1000));
这里有个知识点——浮点型值转换为整型。
sinVal是个浮点型变量,也就是含小数点的值,而我们不希望频率出现小数点的,所以需要有一个浮点值转换为整型值的过程,下方语句完成了这件事:
■ int(sinVal*1000)
把sinVal乘以1000,转换为整型后再加上2000赋值给变量toneVal,现在toneVal就是一个适合声音频率了。
之后,我们用tone()函数把生成的这个频率给我们的蜂鸣器。
■ DFTone.play(8, toneVal,2);
硬件回顾
蜂鸣器
蜂鸣器其实就是一种会发声的电子元件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
压电式蜂鸣器和电磁式蜂鸣器区别
压电式蜂鸣器是以压电陶瓷的压电效应,来带动金属片的振动而发声。当受到外力导致压电材料发生形变时压电材料会产生电荷。电磁式的蜂鸣器,则是利用通电导体会产生磁场的特性,通电时将金属振动膜吸下,不通电时依振动膜的弹力弹回。不太明白也没太大关系,不影响我们使用。
压电式蜂鸣器需要比较高的电压才能有足够的音压,一般建议为9V以上。电磁式蜂鸣器用1.5V就可以发出85dB以上的音压了,唯消耗电流会大大的高于压电式蜂鸣器。所以还是建议初学者使用电磁式蜂鸣器。
有源蜂鸣器和无源蜂鸣器区别
无论是压电式蜂鸣器还是电磁式蜂鸣器,都有有源蜂鸣器和无源蜂鸣器两种区分。
有源蜂鸣器和无源蜂鸣器的根本区别是输入信号的要求不一样。这里的“源”不是指电源,而是指振荡源,有源蜂鸣器内部带振荡源,说白了就是只要一通电就会响,适合做一些单一的提示音。而无源内部不带震荡源,所以如果仅用直流信号无法使其响,必须用2K-5K的方波去驱动它,但是无源蜂鸣器比有源蜂鸣器音效更好,适合需要多种音调的应用。
从外观上看,有源无源的区别在于,有源蜂鸣器有长短脚,也就是所谓正负极,长脚为正极,短脚为负极。而无源蜂鸣器则没有正负极,两个引脚长度相同。
在套件中,我们为初学者选用的蜂鸣器类型是电磁式无源蜂鸣器。当然,如果喜欢探究,不妨考虑买一个有源蜂鸣器玩玩,直观感受一下两者的区别。
蜂鸣器的应用有很多,我们都可以就蜂鸣器做一些好玩的东西,比如常见的会结合蜂鸣器的有红外传感器,超声波传感器,用于监测物体靠近报警。温度传感器,测到温度过高报警。气体传感器,有气体泄漏报警等等。
除了报警,还可以用来作为乐器,通过不同频率,调成乐谱的不同调式,是不是很amazing啊?
课后作业
点击上方“蘑菇云创造”可以关注我们哦
这里我们要接触一个新的电子元件——蜂鸣器,从字面意思就可以知道,这是一个会发声的元件。这次做一个报警器,通过连接蜂鸣器到Arduino数字输出引脚,并配合相应的程序就可以产生报警器的声音。其原理是利用正弦波产生不同频率的声音。如果结合一个LED,配合同样的正弦波产生灯光的话,就是一个完整的报警器了。
所需元件
■ 1× 蜂鸣器
硬件连接
按下图连接图连接,注意蜂鸣器引脚正(+),负(-)。标有+的引脚接到数字口8,另一个接GND。
图 6-1报警器连线图
图形化编程
样例程序 6-1:
下载程序完成后,你会听到一高一低的报警声,如同汽车报警器。
图形化指令学习
代码学习
项目代码如下
1. #include <DFRobot_Libraries.h>
2. // 创建对象
3. DFRobot_Tone DFTone;
4.
5. // 主程序开始
6. void setup() {
7.
8. }
9. void loop() {
10. DFTone.play(8, 131, 250);
11. DFTone.play(8, 523, 250);
12. }
Loop中只有一个新的函数,DFTone.Play( )。对应指令
函数格式如下:
如果我们希望蜂鸣器能够发出更加多样,和不同时长的声音,就会发现,单单依靠Mind+的图形化编程已经无法满足预期的要求了,“播放音符”指令后对应的节拍表示发音持续时间,在Mind+中可以理解为1拍=1秒。如图,Mind+的发音时长只有几个固定的选项,无法再减小发声时间。
Mind+的图形指令虽然使用便捷,但是一定程度上牺牲了代码的灵活性,也限制了使用者天马行空的创造力。所以从现在开始,我们将图形化编程这根拐杖放在一旁,只用代码编程完成后续课程的项目,快来感受它的魅力吧!
代码编程
在手动编辑区输入样例代码6-2
//项目六 报警器
float sinVal;
int toneVal;
#include <DFRobot_Libraries.h>
// 创建对象
DFRobot_Tone DFTone;
void setup(){
pinMode(8, OUTPUT);
}
void loop(){
for(int x=0; x<180; x++){
//将sin函数角度转化为弧度
sinVal = (sin(x*(3.1415/180)));
//用sin函数值产生声音的频率
toneVal = 2000+(int(sinVal*1000));
//给引脚8一个蜂鸣器声音输出信号.
DFTone.play(8, toneVal,2);
}
}
下载完代码后,我们能够听见蜂鸣器发出由低到高、再由高到低的警报声。不同于之前图形化编程发出较为简单的声音,使用代码能够让输出更具有变化和多样性。
代码学习
首先,定义两个变量:
float sinVal;
int toneVal;
浮点型变量sinVal用来存储正弦值,这是由于正弦值有小数。正弦波呈现一个波浪形的变化,变化比较均匀,所以我们选用正弦波的变化来作为我们声音频率的变换,toneVal从sinVal变量中获得数值,并把它转换为所需要的频率。
#include <DFRobot_Libraries.h>
// 创建对象
DFRobot_Tone DFTone;
对于库和对象,将在项目十中做详细解释,那时有了几次使用的基础将更容易理解。
void setup(){
pinMode(8, OUTPUT);
}
setup中的函数pinMode()的格式如下:
这个函数的作用是,来规定某个引脚是作为输入,或是输出,mode的值分别对应INPUT(输入)和OUTPUT(输出)。为什么在Mind+中没有这条指令,是因为它已经被封装在了其他指令中,比如digitalwrite(pin),当程序运行数字信号输出指令的时候,其实已经使用了pinMod(OUT)指令,但是这一过程没有在代码中体现。
这里用的是sin()函数,一个数学函数,可以算出一个角度的正弦值,这个函数采用弧度单位。因为我们不想让函数值出现负数,所以设置for循环在0~179之间,也就是0~180度之间。
■ for(int x=0; x<180; x++){
函数sin()用的弧度单位,不是角度单位。要通过公式将角度转为弧度:
■ sinVal = (sin(x*(3.1415/180)));
之后,将这个值转变成相应的报警声音的频率:
■ toneVal = 2000+(int(sinVal*1000));
这里有个知识点——浮点型值转换为整型。
sinVal是个浮点型变量,也就是含小数点的值,而我们不希望频率出现小数点的,所以需要有一个浮点值转换为整型值的过程,下方语句完成了这件事:
■ int(sinVal*1000)
把sinVal乘以1000,转换为整型后再加上2000赋值给变量toneVal,现在toneVal就是一个适合声音频率了。
之后,我们用tone()函数把生成的这个频率给我们的蜂鸣器。
■ DFTone.play(8, toneVal,2);
硬件回顾
蜂鸣器
蜂鸣器其实就是一种会发声的电子元件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
压电式蜂鸣器和电磁式蜂鸣器区别
压电式蜂鸣器是以压电陶瓷的压电效应,来带动金属片的振动而发声。当受到外力导致压电材料发生形变时压电材料会产生电荷。电磁式的蜂鸣器,则是利用通电导体会产生磁场的特性,通电时将金属振动膜吸下,不通电时依振动膜的弹力弹回。不太明白也没太大关系,不影响我们使用。
压电式蜂鸣器需要比较高的电压才能有足够的音压,一般建议为9V以上。电磁式蜂鸣器用1.5V就可以发出85dB以上的音压了,唯消耗电流会大大的高于压电式蜂鸣器。所以还是建议初学者使用电磁式蜂鸣器。
有源蜂鸣器和无源蜂鸣器区别
无论是压电式蜂鸣器还是电磁式蜂鸣器,都有有源蜂鸣器和无源蜂鸣器两种区分。
有源蜂鸣器和无源蜂鸣器的根本区别是输入信号的要求不一样。这里的“源”不是指电源,而是指振荡源,有源蜂鸣器内部带振荡源,说白了就是只要一通电就会响,适合做一些单一的提示音。而无源内部不带震荡源,所以如果仅用直流信号无法使其响,必须用2K-5K的方波去驱动它,但是无源蜂鸣器比有源蜂鸣器音效更好,适合需要多种音调的应用。
从外观上看,有源无源的区别在于,有源蜂鸣器有长短脚,也就是所谓正负极,长脚为正极,短脚为负极。而无源蜂鸣器则没有正负极,两个引脚长度相同。
在套件中,我们为初学者选用的蜂鸣器类型是电磁式无源蜂鸣器。当然,如果喜欢探究,不妨考虑买一个有源蜂鸣器玩玩,直观感受一下两者的区别。
蜂鸣器的应用有很多,我们都可以就蜂鸣器做一些好玩的东西,比如常见的会结合蜂鸣器的有红外传感器,超声波传感器,用于监测物体靠近报警。温度传感器,测到温度过高报警。气体传感器,有气体泄漏报警等等。
除了报警,还可以用来作为乐器,通过不同频率,调成乐谱的不同调式,是不是很amazing啊?
课后作业
1. 在手动编辑中,输入本项目的代码。
2. 结合红色LED灯做一个完整的报警器。
提示:可以让LED也随着sin函数变化,使声音与灯光节奏保持一致。
3. 结合项目三中介绍的按钮,做个简易门铃的效果,每次按下按钮,蜂鸣器发出提示音。
——————— 正文完 ———————
教育的目的是为了培养学生协作能力、沟通能力、批判思维以及创造力,其中最核心的是创造力,蘑菇云创客教育作为国内为数不多的一站式创客教育服务供应商旨在培养孩子的创造力。
为让学生们在课堂上学习到的知识更好地连接现实世界,蘑菇云将指导学校规划、建立、运营自己的创客空间。并根据学生年龄段的不同,在设计与布局上进行了区分
小学创客空间注重趣味性,
强调互动场景;
初中创客空间注重实用性,
强调学习场景;
高中创客空间注重技术性,
强调应用场景;
在内容上, 蘑菇云和国内一线创客名师联手,编纂了一系列适合国内创客教育的教材。并拥有一套完整的创客教育课程体系,包括课程内容及教具,课程培训,技术答疑。同样根据学生年龄段的不同,在课程分类与设计上也会有所区别。
小学通过游戏化和体验化的方式来开展,要以“玩中学”为主。
初中引导学生在实际动手过程中进行探究式学习,促进“做中学”。
高中基于问题和设计的学习,需要教师为学生创设相关的真实情境,使高中生在“思中学”。
推荐阅读:
【炫彩 RGB LED】基于Mind+Arduino入门教程05
【S.O.S求救信号】基于Mind+ Ardunio入门教程02
【初识Arduino & Mind+】基于mind+ Arduino入门教程00
我知道你在看呦

