arduino实验–有源蜂鸣器报警

做了之前的LED的实验,是不是感觉很无聊,接下来我们做一个有源蜂鸣器的报警器。

需要元器件:

有源蜂鸣器0001

电路图:

p11

因为模拟电路里面跟实际的有源蜂鸣器有区别,线路图如下(注意正负极哦):

478506441239557243

输入代码如下:

float sinVal;
int toneVal;
int pin = 8; //定义引脚

void setup() {
	pinMode(pin, OUTPUT);
}

void loop() {
	for (int x = 0; x<180; x++) {
		//当使用sin函数时,角度转换成弧度
		sinVal = (sin(x*(3.1412 / 180)));
		// 用sin函数值产生声音频率
		toneVal = 2000+ (int(sinVal * 1000));
		tone(pin, toneVal);
		delay(2);
	}
}

代码解释

首先,定义两个变量:

float sinVal;
int toneVal;

sinVal浮点变量存储正弦值,是声音产生高低变化。toneVal从sinVal变量中获得数值,并把它转换成所需要的频率。

在主循环中设置一个从0到179的for循环,保证正弦值不会产生赋值。之后,将这个值转变成报警声音的频率:

toneVal = 2000+ (int(sinVal * 1000));

之后,用tone()函数产生输出给有源蜂鸣器的频率:

tone(pin, toneVal);

tone()函数需要两个或三个参数,如下:

tone(pin, frequency)
tone(pin,frequency,duration)

pin是连接到有源蜂鸣器的数字引脚,frequency是以Hz为单位的频率值。这里只有一个可选的duration参数,它是以毫秒为单位的表示声音长度的参数。如果没有指定duration,声音将一直持续直到输出一个不同的声音或使用noTone(pin)函数结束在指定引脚上产生的声音。

最后,在频率变化的中间延时2ms,保证正弦波以需要的速度变化:

delay(2);

你可能有疑问,为什么不把2ms放在tone()函数的duration参数中,像下面这样:

tone(pin,toneVal,2);

这是因为for循环运行时间很短,它将在少于2ms的时间内改变频率值,因此使用duration参数是没有用的。所以,把延时2ms放在产生声音之后,保证这个声音在for循环重复并再次改变声音之前持续至少2ms。这里有点难以理解,但是动手试过之后就能明白其中的区别。

在这里,大家还可以改变toneVal计算中的2000和1000或延时时间,可以产生不同的报警声音。大家可以试试看哦。

 

0 Comments
Leave a Reply