关于蜂鸣器的实验,烦恼多多
(2023-09-17 21:49:33)分类: 研究-学习 |
对于开源硬件了解较少,之前只知道有蜂鸣器这个元器件,这段时间有个基础教育精品课的活动,我准备选择高中选修6开源硬件的内容,其原因有冷门、避开锋芒;暑期本区域搞了开源硬件的校本教材,正好跟这个有关。但是接触到蜂鸣器后,发现里面还是有点深奥的,首先蜂鸣器分为有源和无源的两种,这个源是指的震荡源。有源的有震荡源,只要供电就能发声,但也只能发一个固定频率的声音,比较单调。无源的无震荡源,需要制定一个频率来让其发声。【比较直观地判断就是有源蜂鸣器上面会有一个贴纸,内容是remove
seal after wahing清洗后拆除密封】一般来说,有源的接数字端口,控制其高低电平即可,如digitalWrite(buzzer,High);
buzzer就是先前定义的连接的数字端口号(#definer buzzer 8
);而无源的一般接模拟端口,需要给定频率,用法是tone(buzzer,frequency)。这里面还有一个知识点就是无源的不发声如何操作,用noTone(buzzer)。 当然,无源蜂鸣器也可以接数字端口。
Serial.begin(9600);
pinMode(buzzer,OUTPUT);
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
pinMode(ledbin,OUTPUT);
long duration,distance;
digitalWrite(trigPin,LOW);
delayMicroseconds(2);
digitalWrite(trigPin,HIGH);
delayMicroseconds(10);
duration=pulseIn(echoPin,HIGH);
distance=(duration/2)/29.1;//超声波换算距离
//当小于10cm时触发报警
if (distance<10){
digitalWrite(buzzer,HIGH);
digitalWrite(ledbin,HIGH);
delay(1000);
}
else{
digitalWrite(buzzer,LOW);
digitalWrite(ledbin,LOW);
}
pinMode(BUZZER_PIN,OUTPUT);
for (int i=200;i<=800;i++){
tone(BUZZER_PIN,i);
}
delay(1000);
for (int i=800;i>=200;i--){
tone(BUZZER_PIN,i);
delay(10);
}
Serial.begin(9600);
pinMode(buzzer,OUTPUT);
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
pinMode(ledbin,OUTPUT);
long duration,distance;
digitalWrite(trigPin,LOW);
delayMicroseconds(2);
digitalWrite(trigPin,HIGH);
delayMicroseconds(10);
digitalWrite(trigPin,LOW);
duration=pulseIn(echoPin,HIGH);
distance=(duration/2)/29.1;//超声波换算距离
if (distance>10){
noTone(5);
//delay(10);
//digitalWrite(buzzer,LOW);
digitalWrite(ledbin,LOW);
}
//当小于10cm时触发报警
if (distance<10){
//
digitalWrite(buzzer,HIGH);
digitalWrite(ledbin,HIGH);
//
delay(1000);
for (int i=200;i<=800;i++){
tone(buzzer,i);
}
delay(1000);
for (int i=800;i>=200;i--){
tone(buzzer,i);
delay(10);
}
}
今天在家练习了两个例子。一个是用超声波传感器来控制蜂鸣器的发声报警,使用的是有源蜂鸣器,代码如下:
// 安全距离报警器
#define buzzer 5 //蜂鸣器
#define trigPin 4//超声波trig
#define echoPin 2//超声波echo
#define ledbin 13//led
void setup()
{
}
void loop() {
digitalWrite(trigPin,LOW);
}
测试起来效果一切正常。
另一个例子是发出高低不同的警报声,这种情况只能用到无源蜂鸣器。
#define BUZZER_PIN A0//无源蜂鸣器
void setup(){
}
void loop(){
}
这种发出比较逼真的类似报警声,测试起来也是一切正常。
我就想把它们结合起来,让超声波传感器检测到有物体接近后发出高低起伏的报警声。
这个实施起来却很不顺利,到现在还没有解决问题。
仍然有错误的代码如下:
// 安全距离报警
//#define buzzer A0 //无源蜂鸣器
#define buzzer 5 //有源蜂鸣器
#define trigPin 10//超声波trig
#define echoPin 11//超声波echo
#define ledbin 13//led
void setup() {
}
int i;
void loop() {
}
现在的问题是这个只要一接电就一直循环地发声,没法停止,也不知道是何种原因导致触发了这个发声程序。
百思不得其解。