Zwischen der Lautstärke mit der Einheit Decibel und der Intensität (= Energie pro Sekunde und m²) I besteht der Zusammenhang
L = 10 · lg(I /I0) mit I0 …… Hörschwelle
Eine Verzehnfachung der Intensität liefert einen Lautstärkenzugewinn von 10 dB, was von unserem Ohr ca. als Verdopplung der Lautstärke wahrgenommen wird. Daran erkennt man, dass für eine stetige Zunahme der Lautstärke ein immer größer werdender Intensitätszuwachs vonnöten ist.
Dazu ein Beispiel: Angenommen eine summende Biene hat die Lautstärke 30 dB. Kommt eine weitere Biene hinzu, so steigert sich die Lautstärke auf 33 dB. Also wird eine Bienenlaustärke für einen Zugewinn von 3 dB benötigt.
Ein Flugzeug besitze die Lautstärke 110 dB. Zwei Flugzeuge besitzen dann die Lautstärke 113 dB. Man sieht also, dass hier bei hohen Lautstärken für den selben Zugewinn (+ 3 dB) eine viel lautere Schallquelle als zuvor bei den Bienen, nämlich nun ein zweites Flugzeug, notwendig ist.
Dieses logarithmische Hören ist notwendig, um bei geringen Lautstärken sehr sensibel zu hören aber dann bei deutlich lauteren Schallquellen nicht körperliche Schäden davontragen zu müssen. Immerhin wird der gewaltige Hörbereich von I = I0 (L = 0 dB) bis ca. I = 10^13 · I0 (L = 130 dB) durch unser Ohr abgedeckt.
Wie kann man nun mittels Arduino die Lautstärke eines Tons/Geräusches bestimmen? Zunächst wird der Ton mit einem sog. Elektretmikrofon erfasst. Das durch den Schall erzeugte, kleine Spannungssignal wird sodann mit dem Verstärker-IC LM386 verstärkt. Dessen Ausgangssignal ist nun nicht nur verstärkt, sondern besitzt bei einer Betriebsspannung von +5V eine Ruhelage bei genau 2.5V. Dies ermöglicht es uns, mit dem Arduino das in beide Richtungen (bezogen auf 2.5V) gehende Spannungssignal zu erfassen. Hierzu wird ein analoger Eingang des Arduino genutzt.
Der Abstand des Spannungsmaximums zum Spannungsminimum (= 2-fache Amplitude) ist ein Maß für die Lautstärke. Mit dem Arduino wird nun innerhalb einer festgelegten Zeitspanne (z.B. 50 ms), dieses Maximum bzw. Minimum ermittelt. Der Wert Maximum minus Minimum ist dann ein Maß für die angegebene Lautstärke L. Die Lautstärke L wird auf einem 16 x 2 display angezeigt und eine neue Messung für die nächste Zeitspanne startet.
Arduino-Code:
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 |
#include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!! // Anschlüsse: // GND - GND // VCC - 5V // SDA - ANALOG Pin 4 // SCL - ANALOG pin 5 int sensorPin = A0; int sensorValue = 0; long time_start, time_measure; int sound, sound_min, sound_max, sound_amplitude; int decibel; // =========================== // ======= SETUP ========= // =========================== void setup() { Serial.begin(9600); lcd.begin(); // initialize the lcd lcd.backlight(); lcd.setCursor(0,0); lcd.print("Lautstaerken-"); lcd.setCursor(0,1); lcd.print("messer"); delay(3000); lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" "); time_measure = 50; // time in ms within the signal is being analyzed } // =========================== // ======= LOOP ========= // =========================== void loop() { sound = analogRead(sensorPin); //Serial.println(sound); sound_min = 1024; sound_max = 0; time_start = millis(); while(millis() - time_start < time_measure) { sound = analogRead(sensorPin); if(sound > sound_max) { sound_max = sound; } else if(sound < sound_min) { sound_min = sound; } } sound_amplitude = sound_max - sound_min; Serial.println(sound_amplitude); /* lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); lcd.print(sound_amplitude); */ decibel = map(sound_amplitude, 0, 700, 40, 110); // conversion of the amplitude to decibel lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); lcd.print(decibel); lcd.print(" dB "); delay(100); } |