Forum: Projekte & Code Bestimmung der Lautstärke mit Arduino


von Christoph E. (stoppi)



Lesenswert?

Für ein kleines Zwischenprojekt benötigte ich ein Lautstärkemessgerät, 
mit dem ich die gewonnenen Daten dann später verarbeiten bzw. auswerten 
kann (z.B. Lautstärkeverteilung während einer Schulstunde, Mittelwert, 
Standardabweichung etc.).

Der Arduino eignet sich wie so oft sehr gut dafür. Zunächst wird das 
Audiosignal mit einem LM386 verstärkt. Dann lese ich mit dem Arduino 
innerhalb einer bestimmten Zeitspanne (z.B. 50 ms) die analogen 
Spannungswerte ein und bestimme das Spannungsmaximum und -minimum. Die 
Spannweite Max - Min ist dann ein Maß für die Lautstärke...

Das Programm soll nur eine Basis darstellen. Kalibrierung und 
Speicherung der Lautstärken in einem array müssen noch erfolgen.
1
#include <LiquidCrystal_I2C.h>
2
#include <Wire.h>
3
4
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 !!!
5
6
// Anschlüsse:
7
// GND - GND
8
// VCC - 5V
9
// SDA - ANALOG Pin 4
10
// SCL - ANALOG pin 5
11
12
int sensorPin = A0;
13
int sensorValue = 0;
14
long time_start, time_measure;
15
int sound, sound_min, sound_max, sound_amplitude;
16
int decibel;
17
18
19
// ===========================
20
// =======   SETUP   =========
21
// ===========================
22
23
void setup()
24
   {
25
    Serial.begin(9600);
26
    
27
    lcd.begin();        // initialize the lcd
28
    lcd.backlight();
29
    lcd.setCursor(0,0);
30
    lcd.print("Lautstaerken-");
31
    lcd.setCursor(0,1);
32
    lcd.print("messer");
33
    
34
    delay(3000);
35
    
36
    lcd.setCursor(0,0);
37
    lcd.print("             ");
38
    lcd.setCursor(0,1);
39
    lcd.print("            ");
40
41
    time_measure = 50;   // time in ms within the signal is being analyzed
42
   }
43
44
45
// ===========================
46
// =======    LOOP   =========
47
// ===========================
48
49
void loop()
50
   {
51
    sound = analogRead(sensorPin);
52
    //Serial.println(sound);
53
54
    sound_min = 1024;
55
    sound_max = 0;
56
57
    time_start = millis();
58
59
    while(millis() - time_start < time_measure)
60
       {
61
        sound = analogRead(sensorPin);
62
63
        if(sound > sound_max)
64
           {
65
            sound_max = sound;
66
           }
67
        else if(sound < sound_min)
68
           {
69
            sound_min = sound;
70
           }
71
       }
72
73
    sound_amplitude = sound_max - sound_min;
74
75
    Serial.println(sound_amplitude);
76
77
    /*
78
    lcd.setCursor(0,0);
79
    lcd.print("        ");
80
    lcd.setCursor(0,0);
81
    lcd.print(sound_amplitude);
82
    */
83
84
    decibel = map(sound_amplitude, 0, 700, 40, 110);   // conversion of the amplitude to decibel
85
86
    lcd.setCursor(0,0);
87
    lcd.print("        ");
88
    lcd.setCursor(0,0);
89
    lcd.print(decibel);
90
    lcd.print(" dB   ");
91
92
    delay(100);
93
   }

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Christoph E. schrieb:
> Der Arduino eignet sich wie so oft sehr gut dafür

Nein, natürlich nicht.

Christoph E. schrieb:
> Die Spannweite Max - Min ist dann ein Maß für die Lautstärke...

Nein, natürlich nicht.

Du hast bloss irgendeine Zahl auf dem Display.

Bevor man etwas messen möchte, sollte man sich über die Grundlagen 
informieren.
Lautstärke wird in dBa gemessen, also a bewertet, oder in Sone.
Dazu ist entweder ein a Filter nötig, oder eine Abtastung mit hoher 
samplerate und eine digitale Filterung.
Das machst du nicht, und kann der Arduino nicht, daher sind deine 
Zahlenwerte wertlos.

http://www.sengpielaudio.com/Rechner-dba-spl.htm
https://sound-au.com/articles/a-weighting.html

Und selbst wenn deine Elektronik alles richtig machen würde, sie ist 
nutzlos weil sie mit der unbekannten Übertragungskennlinie des 
Mikrophons ohne Datenblatt korrekturgerechnet werden müsste oder ein 
sehr teure Messmikrophon mit nahezu linearem Frequenzgang benötigt, und 
selbst dann kommen keine Messwerte raus:

du müsstest die Schaltung noch kalibrieren, durch den Vergleich mit 
einem anderen Messgerät (aber wozu sollte man eins bauen wenn man schon 
eines hat) oder durch Messen von Schallquellen definierter Lautstärke 
(gibt es, kosten mehr Geld als dein Messgeräteaufbau).

Also: pack deinen Bastelspass wieder ein, die angezeigte Zahl ist kein 
Messwert.

von wendelsberg (Gast)


Lesenswert?

MaWin schrieb:
> Lautstärke wird in dBa gemessen, also a bewertet,

Fast perfekt.
dB ist richtig, je nach Zweck werden verschiedene Filter zur 
Frequenzgangkorrektur verwendet, meist wird A angewendet, aber auch C 
ist nicht so selten.

Das Messergebnis wird dann in z.B. dBA oder auch dB(A) angegeben.

wendelsberg

von HildeK (Gast)


Lesenswert?

... abgesehen davon liefert
Christoph E. schrieb:
> decibel = map(sound_amplitude, 0, 700, 40, 110);   // conversion of the
> amplitude to decibel
keine Umrechnung in dB! Dazu muss man logarithmieren.

von Christoph E. (stoppi)


Lesenswert?

Genau aus dem Grund habe ich auch gleich zu Beginn geschrieben

>Das Programm soll nur eine Basis darstellen. Kalibrierung und
>Speicherung der Lautstärken in einem array müssen noch erfolgen.

von Antoni Stolenkov (Gast)


Lesenswert?

MaWin schrieb:
> Und selbst wenn deine Elektronik alles richtig machen würde, sie ist
> nutzlos weil sie mit der unbekannten Übertragungskennlinie des
> Mikrophons ohne Datenblatt korrekturgerechnet werden müsste oder ein
> sehr teure Messmikrophon mit nahezu linearem Frequenzgang benötigt, und
> selbst dann kommen keine Messwerte raus:

Ich finde, für vergleichende Messungen in einem Schulprojekt kann man 
das mal Schlabbern lassen. Viel bedenklicher finde ich die Ermittlung 
der Lautstärke über den Spitzenwert. Nicht nur deswegen sollte man den 
Rumpelfilter, ganz abgesehen von einer bewertenden Kurve, von Anfang an 
mit einplanen.

von Joachim B. (jar)


Lesenswert?

MaWin schrieb:
> du müsstest die Schaltung noch kalibrieren, durch den Vergleich mit
> einem anderen Messgerät (aber wozu sollte man eins bauen wenn man schon
> eines hat)

Messgeräte kann man leihen!
Es gibt auch Kalibrierdienste die sogar ESP32 mit DHT kalibrieren.

Es wird einfach ein Messprotokoll erstellt wie mir berichtet wurde.

von Antoni Stolenkov (Gast)


Lesenswert?

P.S.:
Mit dem Schlabbern lassen könnte man auch gleich den Unterschied 
zwischen Genauigkeit und Auflösung ins Bewußtsein der Probanten rücken. 
Eine Tätigkeit die man mal ganz dringend ins Bewußtsein des 
Bildungssystems rücken muß.

von Homer J. S. (Gast)


Lesenswert?

Nun ja, immerhin ist so ein Spitzenwertdetektor in soweit brauchbar,
als das man damit durchaus die mittlere Erhoehung des Audiopegels
von Fernsehwerbung detektieren kann.

Um die dann zu "muten".

Allerdings aufwandsarm direkt mit einem PIC 12F675 realisiert.

von Christian S. (roehrenvorheizer)


Lesenswert?

Im Eingangsverstärker mit dem LM386 wird nicht einmal das Signal 
gleichgerichtet oder einem Spitzenwertdetektor zugeführt. Wie sollen da 
plausible Werte heraus kommen, wenn man schon auf die Kalibrierung 
verzichtet?


mfg

von Christoph E. (stoppi)


Lesenswert?

Der Spitzenwert wird ja auch nicht mittels schaltung sondern im 
arduino-Programm ermittelt...

von Antoni Stolenkov (Gast)


Lesenswert?

P.P.S.:
Nach der selbstregulierenden Marktwirtschaft folgte das 
selbstregulierende Bildungssystem. Solche halbgaren Schulprojekte sind 
unter diesen Voraussetzungen nicht anders zu erwarten.

von Georg (Gast)


Lesenswert?

MaWin (Gast)

>Lautstärke wird in dBa gemessen, also a bewertet, oder in Sone.
>Dazu ist entweder ein a Filter nötig, oder eine Abtastung mit hoher
>samplerate und eine digitale Filterung.
>Das machst du nicht, und kann der Arduino nicht, daher sind deine
>Zahlenwerte wertlos.

"der Arduino" gibt es nicht.
Nimmst du "den Arduino"
https://store.arduino.cc/arduino-nano-33-ble-sense
Geht das ohne Probleme und ohne jegliche weitere Hardware.

von Antoni Stolenkov (Gast)


Lesenswert?

Dann haben die Verantwortlichen anscheinend in das falsche Gerät 
investiert.

Beitrag #6512577 wurde von einem Moderator gelöscht.
von Ralph S. (jjflash)


Lesenswert?

Mein Sohn ist Hörgeräteakkustiker (Filialleiter) und nach Feierabend 
hatte ich einmal ein Experiment gemacht um die "Qualität" einer 0815 
Mikrofonkapsel (wie man sie zu hunderten auf Ebay kaufen kann) zu 
testen.

Hierzu habe ich eine solchige Kapsel auf einen Styroporkopf montiert und 
mit einem Oszi (okay, das geht mit anderen Geräten besser, aber was 
geeigneteres habe ich nicht in meinem Portfolio) mal die Qualität des 
Mikros gemessen.

Ausgangspegel in Abhängigkeit des Schaldrucks und der Frequenz.

Das Ergebnis war niederschmetternd, höchst unlinear.

Pegel bei gleichem Schalldruck, aber einmal mit 1kHz und dann mit 2kHz 
und dann mit 3kHz sind massiv unterschiedlich.

Ein Polynommaker hat riesige Formeln ausgegeben und um etwas halbwegs 
taugliches hinzubekommen würde es lange Lookup-Tables benötigen. Wer 
weiß, ob eine andere Mikrofonkapsel dann die gleiche Charakteristik 
hätte.

Der Aufwand war zu groß.

Witzigerweise war eine Handyapp zur Messung da wesentlich genauer.

von D00fi (Gast)


Lesenswert?

> um die "Qualität" einer 0815 Mikrofonkapsel
> niederschmetternd

Es gibt z.B. von Panasonic auch "0815" Elektretkapseln.
Die sind durchaus brauchbar.
Man muss sie allerdings auch akustisch richtig verbauen.
Entweder nach Datenblatt oder als Kompromiss wenn kein
Datenblatt vorliegt:
Einfach plan mittig in eine zur Wellenlaenge bezogen
grossen Flaeche einpassen. Das koennen im Bassbereich
durchaus 50 x 50 cm werden.
Die Membran sollte mit der Flaeche buendig abschliessen.

> eine Handyapp zur Messung da wesentlich genauer

Nimm halt das naechstemal ein Mikrofon aus einem Handy.
Noch besser: Lass es im (Handy-)Gehaeuse.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.