一板网电子技术论坛

风筝
发表于: 2020-2-28 21:53:27 | 显示全部楼层

在本篇文章中,我们将用声音模块和Arduino开发板制作一款分贝仪(Decibel Meter),专为检测从任何来源产生的声音级别及其强度而设计。 LCD显示屏直接以数字方式显示有关声级的信息。根据数字值,声音分为低、中和高级别声音。 LED亮起表示噪音过高。


所需的组件

●    ATmega328微控制器或Arduino开发板

●    Arduino声音模块

●    1602液晶屏

●    16 MHz晶振

●    5V电源


使用声音模块和Arduino的分贝仪的电路原理图

在本文中,我们将学习如何将声音模块与Arduino进行组装。对于使用arduino进行项目的面包板组装,您可以像如下图组装。

decibelmeter-arduino-how-to-electronics.jpg


但是,如果您想降低成本,以及使用ATmega328微控制器,则可以使用以下电路图。您将学习如何检测环境声音以及如何处理此模块生成的信号。该电路板带有一颗小型麦克风,并内置放大器(集成电路LM393),因为只有麦克风无法直接为Arduino发送数据。连接方案非常干净,仅由3个引脚组成:Vcc、GND和S(信号)。电路板中间有一个电位器,用于调节灵敏度。

Decibel-Meter-using-Sound-Module-Arduino-512x298.jpg


该电路板可在5V电压下工作,并且信号引脚最好连接到Arduino的模拟端口,因为生成的信号是可变的,我们可以看到麦克风拾取的噪声级别不同。电路测试将由声音传感器模块和显示1602 LCD组成。显示屏的顶部将显示声音级别(低、中和高),而显示屏的底部将实时显示一个字条,该字条将实时跟随麦克风检测到的声音级别。


Arduino声音模块的特征

➡主芯片:LM393,驻极体麦克风

➡工作电压:DC 4〜6V

➡有信号输出指令

➡单信号输出。

➡有效信号输出为低电平。

➡输出低电平,有声音时,信号灯点亮。

➡可用于声波灯,带有光敏传感器的声光报警器,也可用于声音控制和声音检测。

➡电路板输出开关值。

sound-module-how-to-electronics.jpg


声音检测传感器模块检测声音是否已超过阈值。通过麦克风检测到声音,并将其馈入LM393运算放大器。声级设定点通过板载电位器进行调节。当声音水平超过设定点时,模块上的LED指示灯将亮起,并且输出低电平。


关于程序和代码上传

ATmega328微控制器使用Arduino语言编程。输入输出引脚没有按照Atmega328的方式选择,而是以Arduino模拟和数字引脚选择。如上图所示组装电路。这样做是为了降低成本。这两个电路的程序是相同的。


对于上述电路,将带有引导加载程序的全新ATmega328微控制器插入Arduino开板上,并上传代码。

Decibelmeter-Arduino.jpg


分贝仪的源代码

下面给出了使用使用声音模块和Arduino的分贝仪的源代码。

  1. #include <LiquidCrystal.h>
  2. LiquidCrystal lcd(7,8,10,11,12,13);

  3. int num_Measure = 128 ; // Set the number of measurements   
  4. int pinSignal = A0; // pin connected to pin O module sound sensor  
  5. int redLed = 5;
  6. long Sound_signal;    // Store the value read Sound Sensor   
  7. long sum = 0 ; // Store the total value of n measurements   
  8. long level = 0 ; // Store the average value   
  9. int soundlow = 40;
  10. int soundmedium = 500;

  11. void setup ()  
  12. {   
  13.   pinMode (pinSignal, INPUT); // Set the signal pin as input   
  14.   Serial.begin (9600);
  15.   lcd.begin(16,2);
  16. }  
  17.    
  18. void loop ()  
  19. {  
  20.   // Performs 128 signal readings   
  21.   for ( int i = 0 ; i <num_Measure; i ++)  
  22.   {  
  23.    Sound_signal = analogRead (pinSignal);  
  24.     sum =sum + Sound_signal;  
  25.   }  

  26.   level = sum / num_Measure; // Calculate the average value   
  27.   Serial.print("Sound Level: ");
  28.   lcd.print("Sound Level= ");
  29.   Serial.println (level-33);  
  30.   lcd.print(level-33);
  31.   if(level-33<soundlow)
  32.   {
  33.     lcd.setCursor(0,2);
  34.     lcd.print("Intensity= Low");
  35.      digitalWrite(redLed,LOW);
  36.   }
  37.   if(level-33>soundlow && level-33<soundmedium)
  38.   {
  39.     lcd.setCursor(0,2);
  40.     lcd.print("Intensity=Medium");
  41.      digitalWrite(redLed,LOW);
  42.   }
  43.   if(level-33>soundmedium)
  44.   {
  45.     lcd.setCursor(0,2);
  46.     lcd.print("Intensity= High");   
  47.     digitalWrite(redLed,HIGH);
  48.   }
  49.   sum = 0 ; // Reset the sum of the measurement values  
  50.   delay(200);
  51.   lcd.clear();
  52. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 451 | 回复: 859



手机版|

GMT+8, 2020-3-30 15:00 , Processed in 0.062500 second(s), 30 queries . Powered by Discuz! X3.4

YiBoard一板网 © 2015-2018 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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