加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于蜂鸣器的实验,烦恼多多

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




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有