由于人口密度高,噪音污染已经开始变得越来越重要。正常的人耳可以听到从0dB到140dB的声级,其中120dB到140dB的声级被认为是噪声。响度或声级通常以分贝(dB)为单位测量,我们有一些仪器能够以dB为单位测量声音信号,但这些仪表略贵,遗憾的是我们没有开箱即用的传感器模块来测量分贝的声级。为测量小型教室的声级的Arduino项目购买昂贵的麦克风是不经济的。
因此,在本篇文章中,我们将使用Arduino和普通驻极体电容式麦克风,尝试以dB为单位测量声音或噪声污染水平,使其尽可能接近实际值。我们将使用普通放大器电路放大声音信号并将其馈送到Arduino,使用回归方法(Regression Method)以dB为单位计算声音信号。要检查获得的值是否正确,我们可以使用“Sound Meter”的安卓应用程序,如果您有更好的仪表,可以使用它进行校准。请注意,此项目的目的不是准确测量dB,而是仅提供尽可能接近实际值的值。
所需的材料 ● Arduino UNO开发板 ● 麦克风 ● LM386 ● 10K可变电位器 ● 电阻和电容
电路原理图
这款Arduino声级计的电路非常简单,我们使用LM386音频放大器电路放大来自电容式麦克风的信号,并将其提供给Arduino的模拟端口。
使用引脚1和8上的电阻或电容,可以将此特定运算放大器的增益设置为20至200。如果它们为空,则默认情况下增益将设置为20。本文中,我们可以通过该电路实现最大增益,因此我们在引脚1和8之间使用值为10uF的电容,注意该引脚是有极性的,电容的负引脚应连接到引脚8。整个放大器电路由Arduino的5V引脚供电。
电容器C2用于过滤麦克风的直流噪声。基本上当麦克风感应到声音时,声波将被转换为AC信号。该AC信号可能具有与其耦合的一些DC噪声,其将被该电容器滤波。类似地,即使在放大之后,电容器C3也用于过滤在放大期间可能已经添加的任何DC噪声。
使用回归方法从ADC值计算dB 一旦我们准备好了电路,我们就可以将Arduino连接到计算机并从Arduino上传“模拟读取串行”示例程序,以检查我们是否从麦克风获得有效的ADC值。现在我们将此ADC值转换为dB。
与测量温度或湿度等其他值不同,测量dB不是一项简单的任务。因为dB的值与ADC的值不成线性关系。你可以通过几种方式计算,但我尝试的每一个可能的步骤都没有给我带来好结果。本文中,测量dB值时并不需要太多精确度,因此决定使用更简单的方法直接校准带有dB值的ADC值。对于这种方法,我们需要一个SPL仪表(一个SPL仪表是一个可以读取dB值并显示它的仪器)。所以我们可以使用名为“声音计”的Android应用程序,它可以免费从Play商店下载。这些应用程序使用手机的内置麦克风来检测噪音水平并将其显示在我们的手机上。它们不是很准确,但肯定会为我们的任务工作。所以让我们首先安装Android应用程序,打开时看起来如下所示
正如我之前所说,dB和模拟值之间的关系不是线性的,因此我们需要以不同的间隔比较这两个值。只需记下屏幕上显示的ADC值,即可显示手机上显示的不同dB。我拾取了大约10个读数,它们看起来如下所示,你可能会有所不同
打开一个Excel页面并输入这些值,现在我们将使用Excel查找上述数字的回归值。在此之前让我们绘制一个图表并检查它们是如何相关的,类似于下图。
我们可以看到dB的值与ADC无法线性关联,这意味着您不能为所有ADC值使用通用的乘法器来获得其等效的dB值。在这种情况下,我们可以使用“线性回归”方法。基本上,它会将这条不规则的蓝线转换为最接近的直线(黑线)并给出我们直线的方程。该公式可用于为Arduino测量的每个ADC值找到dB的等效值。
在excel中,我们有一个用于数据分析的插件,它将自动计算您的值集的回归并发布其数据。一旦计算出该值的回归,excel将给出如下所示的一些值。我们只对下面突出显示的数字感兴趣。
一旦你得到这些数字,你就可以形成如下等式 - ADC = (11.003* dB) – 83.2073
复制代码从中导出dB - dB = (ADC+83.2073) / 11.003
复制代码由于校准值可能不同,您需要修改成自己的等式。请确保这个值是正确的,因为我们在编程Arduino时需要它。
以dB为单位测量声级的Arduino程序 在本文末尾处给出了测量dB的完整程序,以下解释了一些重要的代码。
在以下两行代码中,我们读取了引脚A0的ADC值,并使用我们刚刚导出的公式将其转换为dB。这个dB值可能不是我们精确到真正的dB值,但仍然非常接近移动应用程序上显示的值。 - adc= analogRead(MIC); //Read the ADC value from amplifer
- dB = (adc+83.2073) / 11.003; //Convert ADC value to dB using Regression values
复制代码为了监测程序是否正常工作,我们还在数字引脚3上增加了一个LED,当Arduino测量到60dB以上的噪声时,该引脚会变为高电平1秒。 - if (dB>60)
- {
- digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level)
- delay(1000); // wait for a second
- digitalWrite(3, LOW);
- }
复制代码
Arduino声级计的工作过程 准备好代码和硬件后,只需上传代码并打开串行监视器即可查看Arduino测量的dB值。我在我的房间测试这个代码没有太大的噪音,我在串行监视器上得到了以下值,Android应用程序也显示了接近这个
工作令人满意,可以用于项目和其他基本原型。实际应用时硬件仍然会偶尔制造出噪音。所以我尝试了其他用于带有低通和高通滤波器的电路。
带滤波电路的放大器 在这里,我们使用带有放大器的低通和高通滤波器来降低此声级测量电路中的噪声,从而提高精度。
在上面的电路中,我们使用了流行的LM358放大器来放大来自麦克风的信号。除了放大器,我们还使用了两个滤波器,高通滤波器由R5和C2组成,低通滤波器由C1和R2使用。这些滤波器的设计频率仅为8Hz至10KHz,因为低通滤波器将滤除低于8Hz的任何值,高通滤波器将滤除15KHz以上的任何滤波器。选择此频率范围是因为我的电容式麦克风仅在10Hz至15KHZ范围内工作,如下面的数据表所示。
如果您的频率需求发生变化,那么您可以使用以下公式计算所需频率的电阻和电容值。 另请注意,此处使用的电阻值也会影响放大器的增益。计算该电路中使用的电阻和电容值如下所示。
这个电路很符合我的期望。如果你碰巧尝试这个电路,请在本帖下面进行回复,让我知道它是否比前一个电路的功能更好。
代码 本文使用的完整代码如下:
main.rar
(590 Bytes, 下载次数: 59)
|