使用麦克风和Arduino测量以dB为单位的声音/噪声水平

原文:https://circuitdigest.com/microcontroller-projects/arduino-sound-level-measurement

使用麦克风和Arduino测量以dB为单位的声音/噪声水平

ARDUINO项目

阿斯温斯·拉吉(Aswinth Raj) 修改于2019年8月27日
在这里插入图片描述
使用麦克风和Arduino测量以dB为单位的声音/噪声水平

由于人口密度高,噪声污染确实开始变得越来越重要。正常的人耳可以听到0dB至140dB的声音,其中120dB至140dB的声音被认为是噪声。响度或声音水平通常以分贝(dB)为单位进行测量,我们有一些仪器可以以dB为单位测量声音信号,但这些仪表价格昂贵,遗憾的是我们没有现成的传感器模块以分贝为单位进行测量。而且,为小型Arduino项目购买昂贵的麦克风并不经济,因为该项目应该测量小型教室或客厅中的声音水平

因此,在此项目中,我们将使用带Arduino的普通Electret电容麦克风,并尝试以dB尽可能接近实际值来测量声音或噪声污染水平。我们将使用普通的放大器电路来放大声音信号并将其馈送到Arduino,在Arduino中我们将使用回归方法来计算以dB为单位的声音信号。要检查所获得的值是否正确,我们可以使用“ Sound Meter” android应用程序,如果您有更好的仪表,可以将其用于校准。请注意,该项目的目的不是精确测量dB,而只是给出尽可能接近实际值的值。

所需材料:

  1. Arduino UNO
  2. 麦克风
  3. LM386
  4. 10K可变POT
  5. 电阻和电容

电路图:

在这里插入图片描述
Arduino声级计的电路非常简单,我们使用LM386音频放大器电路放大来自电容麦克风的信号,并将其提供给Arduino的Analog端口。我们已经使用此LM386 IC来构建低压音频放大器电路,并且该电路或多或少保持不变。

可以使用跨接在引脚1和8上的电阻器或电容器将这个特定运算放大器的增益设置为20至200。如果它们不连接,默认情况下,增益将设置为20。对于我们的项目,我们将通过该电路获得最大的增益,因此我们在引脚1和8之间使用一个值为10uF的电容器,请注意,该引脚是极性敏感的,电容器的负极应连接至引脚8。完整的放大器电路由Arduino的5V引脚供电。

电容器C2用于过滤来自麦克风的DC噪声。基本上,当麦克风感知到声音时,声波将被转换为交流信号。此交流信号可能会带有一些直流噪声,并且会被该电容器滤除。同样,即使在放大之后,电容器C3仍可用于过滤放大期间可能添加的任何DC噪声。
在这里插入图片描述

使用回归方法从ADC值计算dB:

准备好电路后,我们可以将Arduino连接到计算机,并从Arduino上传*“ Analog Read Serial”*示例程序,以检查是否从麦克风中获取了有效的ADC值。现在我们必须将该ADC值转换为dB。

测量温度或湿度等其他值不同,测量dB不是一件容易的事。因为dB的值与ADC的值不是线性的。您可以通过几种方法获得结果,但是我尝试的每一个可能步骤都没有取得好的结果。如果您想尝试一下,可以在这里阅读该Arduino论坛。

对于我的应用程序,我在测量dB值时并不需要太多的准确性,因此决定使用一种更简便的方法直接用dB值校准ADC值。对于这种方法,我们将需要一个SPL仪表(SPL仪表是一种可以读取dB值并将其显示的仪器),但遗憾的是我没有一个,并且可以肯定我们大多数人都不会。因此,我们可以使用名为“ Sound meter”Android应用程序,应用程序可以从Play商店免费下载。这类应用程序很多,您可以下载任何选择。这些应用程序使用手机的内置麦克风来检测噪音水平并将其显示在我们的手机上。它们不是很准确,但是一定可以完成我们的任务。因此,让我们从安装Android应用程序开始,我的打开时如下图所示
在这里插入图片描述

正如我之前所说,dB和模拟值之间的关系不是线性的,因此我们需要以不同的间隔比较这两个值。只需记下屏幕上显示的ADC值,以显示手机上显示的不同dB。我读取了大约10个读数,它们看起来像下面这样,您可能会有所不同
在这里插入图片描述

打开一个excel页面并输入这些值,现在我们将使用Excel查找上述数字的回归值。在此之前,让我们绘制一个图表并检查它们之间的关系,下面是我的。
在这里插入图片描述

正如我们所看到的,dB的值与ADC并不是线性相关的,这意味着您不能为所有ADC值都拥有一个公共的乘法器来获得等效的dB值。在这种情况下,我们可以利用**“线性回归”方法**。基本上,它将把不规则的蓝线转换为最接近的可能的直线(黑线),并给出该直线的等式。该方程式可用于找到Arduino测量的每个ADC值的dB等效值。

在excel中,我们有一个用于数据分析的插件,它将自动为您的一组值计算回归并发布其数据。我将不介绍如何使用excel进行操作,因为它不在本项目的范围之内,而且您可以轻松地使用它来学习和学习它。计算完该值的回归后,excel将提供一些如下所示的值。我们只对下面突出显示的数字感兴趣。
在这里插入图片描述

一旦获得这些数字,您将能够形成以下等式

ADC =(11.003 * dB)– 83.2073

从中可以得出dB为

db=(ADC + 83.2073)/ 11.003

由于校准可能不同,因此您可能必须驱动自己的方程式。但是,请确保此值安全,因为在编程Arduino时我们将需要它。

Arduino程序,以dB为单位测量声级:

下面给出了测量dB的完整程序,下面解释了一些重要的代码

在以上这两行中,我们读取了引脚A0的ADC值,并使用刚刚导出的公式将其转换为dB。这个dB值可能无法精确到真实的dB值,但仍与移动应用程序上显示的值非常接近。

adc = AnalogRead(MIC); //从放大器中读取ADC值
dB =(adc + 83.2073)/ 11.003; //使用回归值将ADC值转换为dB

为了检查程序是否正常运行,我们还在数字引脚3上添加了一个LED,当Arduino测量到60dB以上的大噪声时,该LED会变高1秒钟。

if(dB> 60)
{ 
  digitalWrite(3,HIGH); //打开LED(HIGH是电压电平)
  delay(1000); //等待第二个
  digitalWrite(3,LOW); 
}

Arduino声级计的工作原理:

准备好代码和硬件后,只需上传代码并打开串行监视器,即可查看Arduino测量的dB值。我在房间里测试了这段代码,除了外面的流量外没有太多噪音,我在串行监视器上得到了以下值,并且android应用程序也显示了一些与此接近的值
在这里插入图片描述

您可以在本页末尾的视频中找到该项目的完整工作。您可以使用投影来检测房间中的声音,并检查每个教室中是否有任何活动或产生了多少噪音等。如果录制的声音超过60dB,我刚刚将LED调高了2秒钟。

这项工作令人惊讶地令人满意,但是可以肯定地将其用于项目和其他基本原型。经过更多的挖掘,我发现问题实际上出在硬件上,而这仍然时不时地给我带来噪音。因此,我尝试了在具有低通和高通滤波器的火花有趣麦克风板上使用的其他电路。我已经说明了以下电路供您尝试。

带有滤波电路的放大器:

在这里,我们使用了带放大器的低通和高通滤波器,以减少此声级测量电路中的噪声,从而可以提高精度。
在这里插入图片描述

在上面的电路中,我们使用了流行的LM358放大器来放大来自麦克风的信号。除放大器外,我们还使用了两个滤波器,高通滤波器由R5,C2构成,低通滤波器由C1和R2构成。这些滤波器设计为仅允许从8Hz到10KHz的频率,因为低通滤波器将滤除8Hz以下的任何东西,而高通滤波器将滤除15KHz以上的任何东西。选择此频率范围是因为我的电容式麦克风只能在10Hz至15KHZ的频率范围内工作,如下数据表所示。
在这里插入图片描述

如果您的频率需求发生变化,则可以使用以下公式计算所需频率的电阻和电容值。

Frequency(F)= 1 /(2πRC)

另外,请注意,此处使用的电阻值也会影响放大器的增益。下面显示了该电路中使用的电阻和电容值的计算。您可以从此处下载excel表格,以修改Frequency的值并计算回归值。
在这里插入图片描述
前一个电路工作符合我的期望,所以我从没有尝试过。如果您碰巧尝试使用此电路,请通过注释让我知道它的功能是否比上一个更好。

代码

const int MIC = 0; //the microphone amplifier output is connected to pin A0
int adc;
int dB, PdB; //the variable that will hold the value read from the microphone each time

void setup() {
Serial.begin(9600); //sets the baud rate at 9600 so we can check the values the microphone is obtaining on the Serial Monitor
  pinMode(3, OUTPUT);
}

void loop(){

  PdB = dB; //Store the previous of dB here
  
adc= analogRead(MIC); //Read the ADC value from amplifer 
//Serial.println (adc);//Print ADC for initial calculation 
dB = (adc+83.2073) / 11.003; //Convert ADC value to dB using Regression values

if (PdB!=dB)
Serial.println (dB);

if (dB>60)
{
  digitalWrite(3, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(2000);                       // wait for a second
  digitalWrite(3, LOW); 
}
//delay(100);

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值