Arduino开发实例-DIY分贝测量仪

DIY分贝测量仪

1、应用介绍

分贝计,它通常用于测量声音的强度和水平。 声音响度是用分贝来衡量的。 从飞机到人类耳语的不同发声介质都有一定的声音响度,以分贝表示。 声波是具有来回运动的纵波,给出高音或低音,如图所示:

在这里插入图片描述

声音的响度取决于频率或波长或传播所需的时间。 下表显示了不同的声音级别(以 dB 为单位)及其影响。

在这里插入图片描述

备注:上图来源于https://m.thepaper.cn/newsDetail\_forward\_15217039

本文将实现一个带有LCD的简单分贝计。分贝计通过麦克风声音传感器采集声音,然后通过Arduino采集麦克风信号,计算得到最终的噪音级别,最后在LCD中显示。

2、配件准备清单

序号 配件名称 数量
1 Arduino Nano开发板 1
2 LM393 声音传感器 1
3 16X2 I2C LCD 显示屏 1
4 RGB三色LED 3
5 连接线 10
6 面板板 1

3、硬件接线图

在这里插入图片描述

将 LCD 显示器的 I2C 引脚(SDA、SCL)连接到 Arduino 的 A5 和 A4 引脚。 通过 5V 引脚为 LCD 显示器提供 5V 电压。 同样,通过 3.3V 引脚为声音传感器提供 3.3V 电源。 将 3 个不同颜色的 LED 添加到 Arduino D3、D4 和 D5 引脚。 该 LED 根据不同的声音强度发光。 声音传感器与模拟引脚 A0 连接,声音传感器是模拟的。

关于LCD1602 I2C驱动,请参考:

关于声音传感器驱动,请参考:

4、驱动代码实现

声音传感器通常读取声音的模拟值,然后使用一些数学公式将其转换为分贝:

L


p

20

×

log

10

(

2

×

1

0

2

P

a

2

×

1

0

5

P

a

)

d

B

L_p = 20 \times \log_{10}\big( \frac{2 \times 10^{-2}P_a}{2 \times 10^{-5}P_a}\big)dB

Lp​=20×log10​(2×10−5Pa​2×10−2Pa​​)dB

L


p

20

×

log

10

(

1000

)

d

B

L_p = 20 \times \log_{10}(1000)dB

Lp​=20×log10​(1000)dB

L


p

20


×


3


d


B

60

d

B

L_p = 20 \times 3 dB = 60 dB

Lp​=20×3dB=60dB

本应用的驱动代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <Wire.h>
#include <LiquidCrystal\_I2C.h> // LCD1602 I2C驱动库

LiquidCrystal_I2C lcd = LiquidCrystal\_I2C(0x27, 16, 2);

const int sampleWindow = 50; // 采样窗口宽度,以毫秒为单位 (50mS = 20Hz)
unsigned int sample;

// 声音传感器引脚
#define SENSOR\_PIN A0

// LED引脚
#define PIN\_QUIET 3
#define PIN\_MODERATE 4
#define PIN\_LOUD 5

void setup ()
{
Serial.begin(115200);
// 初始化设备引脚
pinMode (SENSOR_PIN, INPUT);
pinMode(PIN_QUIET, OUTPUT);
pinMode(PIN_MODERATE, OUTPUT);
pinMode(PIN_LOUD, OUTPUT);

digitalWrite(PIN_QUIET, LOW);
digitalWrite(PIN_MODERATE, LOW);
digitalWrite(PIN_LOUD, LOW);



// 初始化LCD
lcd.begin();
// 打开LCD背光
lcd.backlight();
lcd.clear();
}


void loop ()
{
unsigned long startMillis= millis(); // 采样窗口时间开始
float peakToPeak = 0; // 峰值

unsigned int signalMax = 0; // 最小值
unsigned int signalMin = 1024; // 最大值

// 采样50 mS
while (millis() - startMillis < sampleWindow)
{
sample = analogRead(SENSOR_PIN); // 从声音传感器采样信号
if (sample < 1024) // 剔除虚假读数
{
if (sample > signalMax)
{
signalMax = sample; // 保留最大计数
}
else if (sample < signalMin)
{
signalMin = sample; // 保留最小计数
}
}
}

peakToPeak = signalMax - signalMin; // max - min = peak-peak amplitude
int db = map(peakToPeak,20,900,49.5,90); // 校准分贝

lcd.setCursor(0, 0);
lcd.print("Loudness: ");
lcd.print(db);
lcd.print("dB");

if (db <= 60)
{
lcd.setCursor(0, 1);
lcd.print("Level: Quite");
digitalWrite(PIN_QUIET, HIGH);
digitalWrite(PIN_MODERATE, LOW);
digitalWrite(PIN_LOUD, LOW);
}
else if (db > 60 && db<85)
{
lcd.setCursor(0, 1);
lcd.print("Level: Moderate");
digitalWrite(PIN_QUIET, LOW);
digitalWrite(PIN_MODERATE, HIGH);
digitalWrite(PIN_LOUD, LOW);
}
else if (db>=85)
{
lcd.setCursor(0, 1);
lcd.print("Level: High");
digitalWrite(PIN_QUIET, LOW);
digitalWrite(PIN_MODERATE, LOW);
digitalWrite(PIN_LOUD, HIGH);

}

delay(200);
lcd.clear();
}

注意:此次DIY仅作为原理性演示。

文章来源: https://iotsmart.blog.csdn.net/article/details/128062848