|
在本篇文章中,我们将用声音模块和Arduino开发板制作一款分贝仪(Decibel Meter),专为检测从任何来源产生的声音级别及其强度而设计。 LCD显示屏直接以数字方式显示有关声级的信息。根据数字值,声音分为低、中和高级别声音。 LED亮起表示噪音过高。
所需的组件 ● ATmega328微控制器或Arduino开发板 ● Arduino声音模块 ● 1602液晶屏 ● 16 MHz晶振 ● 5V电源
使用声音模块和Arduino的分贝仪的电路原理图 在本文中,我们将学习如何将声音模块与Arduino进行组装。对于使用arduino进行项目的面包板组装,您可以像如下图组装。
但是,如果您想降低成本,以及使用ATmega328微控制器,则可以使用以下电路图。您将学习如何检测环境声音以及如何处理此模块生成的信号。该电路板带有一颗小型麦克风,并内置放大器(集成电路LM393),因为只有麦克风无法直接为Arduino发送数据。连接方案非常干净,仅由3个引脚组成:Vcc、GND和S(信号)。电路板中间有一个电位器,用于调节灵敏度。
该电路板可在5V电压下工作,并且信号引脚最好连接到Arduino的模拟端口,因为生成的信号是可变的,我们可以看到麦克风拾取的噪声级别不同。电路测试将由声音传感器模块和显示1602 LCD组成。显示屏的顶部将显示声音级别(低、中和高),而显示屏的底部将实时显示一个字条,该字条将实时跟随麦克风检测到的声音级别。
Arduino声音模块的特征 ➡主芯片:LM393,驻极体麦克风 ➡工作电压:DC 4〜6V ➡有信号输出指令 ➡单信号输出。 ➡有效信号输出为低电平。 ➡输出低电平,有声音时,信号灯点亮。 ➡可用于声波灯,带有光敏传感器的声光报警器,也可用于声音控制和声音检测。 ➡电路板输出开关值。
声音检测传感器模块检测声音是否已超过阈值。通过麦克风检测到声音,并将其馈入LM393运算放大器。声级设定点通过板载电位器进行调节。当声音水平超过设定点时,模块上的LED指示灯将亮起,并且输出低电平。
关于程序和代码上传 ATmega328微控制器使用Arduino语言编程。输入输出引脚没有按照Atmega328的方式选择,而是以Arduino模拟和数字引脚选择。如上图所示组装电路。这样做是为了降低成本。这两个电路的程序是相同的。
对于上述电路,将带有引导加载程序的全新ATmega328微控制器插入Arduino开板上,并上传代码。
分贝仪的源代码 下面给出了使用使用声音模块和Arduino的分贝仪的源代码。 - #include <LiquidCrystal.h>
- LiquidCrystal lcd(7,8,10,11,12,13);
- int num_Measure = 128 ; // Set the number of measurements
- int pinSignal = A0; // pin connected to pin O module sound sensor
- int redLed = 5;
- long Sound_signal; // Store the value read Sound Sensor
- long sum = 0 ; // Store the total value of n measurements
- long level = 0 ; // Store the average value
- int soundlow = 40;
- int soundmedium = 500;
-
- void setup ()
- {
- pinMode (pinSignal, INPUT); // Set the signal pin as input
- Serial.begin (9600);
- lcd.begin(16,2);
- }
-
- void loop ()
- {
- // Performs 128 signal readings
- for ( int i = 0 ; i <num_Measure; i ++)
- {
- Sound_signal = analogRead (pinSignal);
- sum =sum + Sound_signal;
- }
-
- level = sum / num_Measure; // Calculate the average value
- Serial.print("Sound Level: ");
- lcd.print("Sound Level= ");
- Serial.println (level-33);
- lcd.print(level-33);
- if(level-33<soundlow)
- {
- lcd.setCursor(0,2);
- lcd.print("Intensity= Low");
- digitalWrite(redLed,LOW);
- }
- if(level-33>soundlow && level-33<soundmedium)
- {
- lcd.setCursor(0,2);
- lcd.print("Intensity=Medium");
- digitalWrite(redLed,LOW);
- }
- if(level-33>soundmedium)
- {
- lcd.setCursor(0,2);
- lcd.print("Intensity= High");
- digitalWrite(redLed,HIGH);
- }
- sum = 0 ; // Reset the sum of the measurement values
- delay(200);
- lcd.clear();
- }
复制代码
|