由于人口密度高,噪声污染确实开始变得越来越重要。正常的人耳可以听到0dB至140dB的声音,其中120dB至140dB的声音被认为是噪声。响度或声音水平通常以分贝(dB)为单位进行测量,我们有一些仪器可以以dB为单位测量声音信号,但是这些仪表价格昂贵,遗憾的是我们没有现成的传感器模块以分贝为单位进行测量。而且,为小型Arduino项目购买昂贵的麦克风并不经济,因为该项目应该测量小型教室或客厅中的声音水平。
因此,在此项目中,我们将使用带Arduino的普通Electret电容麦克风,并尝试以dB尽可能接近实际值来测量声音或噪声污染水平。我们将使用普通的放大器电路来放大声音信号,并将其输入到Arduino,在Arduino中,我们将使用回归方法计算以dB为单位的声音信号。要检查获得的值是否正确,我们可以使用“ Sound Meter” android应用程序,如果您有更好的仪表,则可以使用它进行校准。请注意,该项目的目的不是精确测量dB,而只是给出尽可能接近实际值的值。
所需材料:
- Arduino UNO
- 麦克风
- LM386
- 10K可变POT
- 电阻和电容
电路原理图:
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为
分贝=(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秒钟。
如果(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的频率范围内工作,如下数据表所示。
如果频率需求发生变化,则可以使用以下公式计算所需频率的电阻和电容值。
频率(F)= 1 /(2πRC)
另外,请注意,此处使用的电阻值也会影响放大器的增益。下面显示了该电路中使用的电阻和电容值的计算。您可以从此处下载excel工作表,以修改Frequency的值并计算回归值。
前一个电路工作令人满意,因此我从未尝试过。如果您碰巧尝试使用此电路,请通过注释让我知道它的功能是否比上一个更好。