【入门教程】DFR0100 Arduino教程07-报警器-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4226|回复: 0

【入门教程】DFR0100 Arduino教程07--报警器

[复制链接]
发表于 2016-12-5 16:51 | 显示全部楼层 |阅读模式
本帖最后由 dfrobot 于 2016-12-5 17:01 编辑

该教程实验平台:Arduino入门套件
上一篇教程:Arduino教程 Lesson 6 -- 炫彩RGB LED

这里我们要接触一个新的电子元件——蜂鸣器,从字面意思就可以知道,这是一个会发声的元件。这次做一个报警器,通过连接蜂鸣器到Arduino数字输出引脚,并配合相应的程序就可以产生报警器的声音。其原理是利用正弦波产生不同频率的声音。如果结合一个LED,配合同样的正弦波产生灯光的话,就是一个完整的报警器了。

步骤1 硬件电路搭建
连接之前,先判别RGB是共阴还是共阳,如果不是很清楚的,可以先跳到这个项目的硬件部分介绍。连接时,还需注意一点,引脚的顺序,可参照右边的引脚图。

arduino uno dfrobot100

arduino uno dfrobot100

步骤2 输入代码

完成硬件连接后,打开Arduino IDE,输入下面这段代码。
[mw_shl_code=c,true]float sinVal;
int toneVal;
  
void setup(){
     pinMode(8, OUTPUT);
}
  
void loop(){
     for(int x=0; x<180; x++){
            //将sin函数角度转化为弧度
            sinVal = (sin(x*(3.1412/180)));
            //用sin函数值产生声音的频率
            toneVal = 2000+(int(sinVal*1000));
            //给引脚8一个
            tone(8, toneVal);
            delay(2);
     }   
}[/mw_shl_code]
下载程序完成后,你会听到一高一低的报警声,如同汽车报警器。


步骤3 代码回顾

首先,定义两个变量:

[mw_shl_code=c,true]float sinVal;
int toneVal;
[/mw_shl_code]


浮点型变量sinVal用来存储正弦值,正弦波呈现一个波浪形的变化,变化比较均匀,所以我们选用正弦波的变化来作为我们声音频率的变换,toneVal从sinVal变量中获得数值,并把它转换为所需要的频率。


这里用的是sin()函数,一个数学函数,可以算出一个角度的正弦值,这个函数采用弧度单位。因为我们不想让函数值出现负数,所以设置for循环在0~179之间,也就是0~180度之间。

[mw_shl_code=c,true]for(int x=0; x<180; x++){}
[/mw_shl_code]

函数sin()用的弧度单位,不是角度单位。要通过公式3.1412/180)将角度转为弧度:

[mw_shl_code=c,true]sinVal = (sin(x*(3.1412/180)));
[/mw_shl_code]

之后,将这个值转变成相应的报警声音的频率:

[mw_shl_code=c,true]toneVal = 2000+(int(sinVal*1000));
[/mw_shl_code]

浮点型值转换为整型

sinVal是个浮点型变量,也就是含小数点的值,而我们不希望频率出现小数点的,所以需要有一个浮点值转换为整型值得过程,也就是下面这句语句就完成了这件事:

[mw_shl_code=c,true]int(sinVal*1000)
[/mw_shl_code]

把sinVal乘以1000,转换为整型后再加上2000赋值给变量toneVal,现在toneVal就是一个适合声音频率了。


之后,我们用tone()函数把生成的这个频率给我们的蜂鸣器。


步骤4 tone函数

下面我们来介绍一下tone相关的三个函数
[mw_shl_code=c,true]tone(pin,frequency)
[/mw_shl_code]
Pin都是指连接到蜂鸣器的数字引脚,frequency是以Hz为单位的频率值。
[mw_shl_code=c,true]tone(pin,frequency,duration)
[/mw_shl_code]

第二个函数,有个duration参数,它是以毫秒为单位,表示声音长度的参数。像第一个函数,如果没有指定duration,声音将一直持续直到输出一个不同频率的声音产生。
[mw_shl_code=c,true]noTone(pin)
[/mw_shl_code]

noTone(pin)函数,结束该指定引脚上产生的声音。


步骤5 硬件回顾

蜂鸣器
蜂鸣器其实就是一种会发声的电子元件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

压电式蜂鸣器和电磁式蜂鸣器区别
压电式蜂鸣器是以压电陶瓷的压电效应,来带动金属片的振动而发声。当受到外力导致压电材料发生形变时压电材料会产生电荷。电磁式的蜂鸣器,则是利用通电导体会产生磁场的特性,通电时将金属振动膜吸下,不通电时依振动膜的弹力弹回。不太明白也没太大关系,不影响我们使用。

压电式蜂鸣器需要比较高的电压才能有足够的音压,一般建议为9V以上。电磁式蜂鸣器用1.5V就可以发出85dB以上的音压了,唯消耗电流会大大的高于压电式蜂鸣器。所以还是建议初学者使用电磁式蜂鸣器。

有源蜂鸣器和无源蜂鸣器区别
无论是压电式蜂鸣器还是电磁式蜂鸣器,都有有源蜂鸣器和无源蜂鸣器两种区分。

有源蜂鸣器和无源蜂鸣器的根本区别是输入信号的要求不一样。这里的“源”不是指电源,而是指振荡源,有源蜂鸣器内部带振荡源,说白了就是只要一通电就会响。而无源内部不带震荡源,所以如果仅用直流信号无法使其响,必须用2K-5K的方波去驱动它。

从外观上看,有源无源的区别在于,有源蜂鸣器有长短脚,也就是所谓正负极,长脚为正极,短脚为负极。而无源蜂鸣器则没有正负极,两个引脚长度相同。

套件中,用的蜂鸣器类型是电磁式有源蜂鸣器。当然,如果有源蜂鸣器玩的够熟练的话,不妨考虑买一个无源蜂鸣器玩玩,可以演奏出不用的音乐效果。

蜂鸣器的应用有很多,我们都可以就蜂鸣器做一些好玩的东西,比如常见的会结合蜂鸣器的有,红外传感器,超声波传感器,用于监测物体靠近报警。温度传感器,测到温度过高报警。气体传感器,有气体泄漏报警等等。除了报警,还可以用来作为乐器,通过不同频率,调成乐谱的不同调式等等等。。。。


步骤6 可以做些其他的事

1、结合红色LED灯做一个完整的报警器。
提示:可以让LED也随着sin函数变化,使声音与灯光节奏保持一致。

2、结合项目三中介绍的按钮,做个简易门铃的效果,每次按下按钮,蜂鸣器发出提示音。


下一篇教程:Arduino教程 Lesson 8 -- 温度报警器




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 03:31 , Processed in 0.232145 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表