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
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.htmhttps://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.
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
... 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.
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.
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.
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.
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ß.
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.
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
P.P.S.:
Nach der selbstregulierenden Marktwirtschaft folgte das
selbstregulierende Bildungssystem. Solche halbgaren Schulprojekte sind
unter diesen Voraussetzungen nicht anders zu erwarten.
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.
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.
> 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.