原文: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 timevoid setup() {
Serial.begin(9600); //sets the baud rate at 9600 so we can check the values the microphone is obtaining on the Serial MonitorpinMode(3, OUTPUT);
}void loop(){PdB = dB; //Store the previous of dB hereadc= 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 valuesif (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 seconddigitalWrite(3, LOW);
}
//delay(100);}

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

  1. 使用麦克风和Arduino测量噪音水平(以dB为单位)

    由于人口密度高,噪音污染已经开始变得越来越重要.正常的人耳可以听到从0dB到140dB的声级,其中120dB到140dB的声级被认为是噪声.响度或声级通常以分贝(dB)为单位测量,我们有一些仪器能够以 ...

  2. 噪声dba是什么单位_声音的大小dB,到底是什么单位?

    上来就进入正题. 首先来说说声音的大小的单位dB,dB这个单位其实可以叫没有单位,因为他其实表示的是一种比例关系,给出计算公式: SPL=20 x log10[ p(e) / p(ref) ] SPL ...

  3. 2db多少功率_搞懂“dB”这个单位,到底有多难?

    原标题:搞懂"dB"这个单位,到底有多难? 随便搜索一下,网络上的相关文章其实有不少了,但是仍然不断的有朋友发私信问我相关的问题.宥于此因,现写一些文字对此些概念说明如下: 分贝 ...

  4. 使用 Arduino 测量血氧饱和度

    我们所经历的,并且在某种意义上仍在经历的冠状病毒疫情,已经把间质性肺炎.肺呼吸机.重症监护和饱和度计等词放在了大家的嘴边.; 新闻媒体每天都会带入我们家中的东西,幸运的是,对于那些不是内部人员或直接涉 ...

  5. 使用arduino测量电压的超级简单的方法

    /**使用俩个相同的电阻串联,并将其中一个电阻的两端分别接入arduino的A0接口与GND接口实现电压的测量*注意所测的电压不能超过"串联电阻数量"乘"5V" ...

  6. 利用DHT22和Arduino测量温湿度并显示在串口和OLED显示屏上

    实验结果 温湿度显示在串口: 温湿度显示在OLED屏幕: 实验代码 #include "U8glib.h" #include "DHT.h"U8GLIB_SSD ...

  7. 关于分贝(dB)单位的解释(理解),关于dB增益是什么意思,他们放大了多少倍?为何他们的计算公式不一样。

    dB是一个数据存储单位,也是量度两个相同单位之数量比例的计量单位,主要用于度量声音强度,这里主要说一下计量单位的理解和声强的度量. 一,什么是分贝 分贝是较常用的计量单位.可表示为: 1. 表示功率量 ...

  8. 交流信号叠加直流偏置_示波器助您更好地测量直流电源轫上的纹波噪声

    选择是德科技示波器和探测解决方案的三大理由 增强您对测量结果的信心 通过使用S 系列示波器和 N7020A 电源完整性探头,您可以充满信心地确定您的电源是否在容限范围内. 更深入地分析您的信号 S 系 ...

  9. Meshlab软件测量出来的尺寸单位是什么?

    Meshlab软件测量出来的尺寸是没有单位的,测量出来的数值只取决于你导入的模型信息.模型的原始点云数据是多少meshlab测量出来的数值就是多少,它的单位与原始点云数据制作出来的单位保持一致. 如何 ...

最新文章

  1. 求数组的子数组之和的最大值
  2. 【java】从进程角度理解java
  3. 201计算机基础知识,201年计算机应用基础备考练习题及答案
  4. 动态规划(四)--最长公共子序列
  5. day_work_01
  6. 强大的SQL计算利器-SPL
  7. 项目质量监测(三)e2e test端到端测试——单元测试和端到端测试 e2e test工具-Cypress Nightwatch TeatCafe Codecov-测试结果可视化
  8. oracle罗马字符转数字,一些关于罗马字符的知识
  9. 微信公众平台 登陆php,javascript - 微信公众号开发,如何使用户保持登录状态
  10. 银河帝国----基地前奏
  11. Markdown 图片排版
  12. iOS获取高德地图实现持续定位功能
  13. android模拟器访问电脑本机
  14. bootstrap(手风琴、图片轮换和固定定位)
  15. 如何从 0 到 1 设计、构建移动分析架构
  16. 项目开发(质检督查)
  17. 语音识别WFST核心算法讲解(1. WFST的基本概念)
  18. 在vue中使用Mock模拟数据
  19. 2021年茶艺师(中级)考试题库及茶艺师(中级)新版试题
  20. 一个超酷的开源uHand2.0机械手掌项目

热门文章

  1. python将图片转换成二进制文本_python将图片文件转换成base64编码的方法
  2. 序列java_java序列和反序列
  3. mysql分区 alter_mysql分区表设计(一)
  4. Apifox 学习笔记 - 前置操作
  5. STM32 B3 B5 A13 A14 A15端口复用
  6. 编译原理知识点总结——识别单词的DFA
  7. 骁龙778g相当于麒麟多少
  8. 扇贝python编程课_【扇贝编程python安卓手机下载】扇贝编程app v1.1.47 破解版-趣致软件园...
  9. Java核心知识:面向对象-多态
  10. 从事计算机视觉必知的「大牛」有哪些?