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−5Pa2×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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!