Lärm erkennen

Gast #1044166
Lesenswert?

Hallo,

ich möchte mit Hilfe eines Mikrocontrollers "Lärm" erkennen:
Das ganze soll in einem Raum, wo viele Menschen reden, eingesetzt
werden; wenn zuviele Menschen gleichzeitig, durcheinandern reden und das
ganze laut wird, soll der Controller das erkennen.

Funktion:
Ein Mikrofon ist an einem OpAmp angeschlossen, das verstärkte Signal
geht an einen (analogen) Eingang eines Mikrocontrollers.

Nur, wie gehts dann weiter?
Wie kann der Controller also Lärm von normalen Sprechschall
unterscheiden?
Irgendwelche Ideen?


Danke,
Tom
(gerade schonmal geschickt, aber leider gelöscht)
Gast #1044196
Lesenswert?

Hoi Hoi!
Ganz einfach, anschließen wie im Anhang gezeigt.
Sowas bin ich gerade auch am entwerfen, nur für einen anderen Zweck ;-)
Den Code habe ich zum Großzeil gerade aus dem Tutorial geklaut, der war 
schon schön kommentiert.
Dann einen Timer-Interrupt aufsetzen der alle 1-10 Sekunden eine ADC 
Wandlung vornimmt, 10 Ergebnisse zusammenaddieren und Teilen für einen 
Mittelwert.
Dann Prüfen ob der Mittelwert über dem Grenzwert liegt.
Zumindest war das meine Idee auf die Schnelle, kann man vielleicht 
schöner lösen ;-)
1
volatile uint16_t adcval = 100;
2
volatile uint8_t adccounter = 0;
3
volatile uint16_t tmp = 0;
4

5
ISR(TIMER1_COMPA_vect) {
6

7
  ADMUX = 0;                      // Kanal waehlen
8
  ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
9
 
10
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
11
                               // setzen auf 8 (1) und ADC aktivieren (1)
12

13
  /* Eigentliche Messung - Mittelwert aus 10 Wandlungen je Timer Interrupt eine Wandlung*/
14

15
  if (adccounter < 9) {
16
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
17
    while ( ADCSRA & (1<<ADSC) ) {
18
      ;   // auf Abschluss der Konvertierung warten
19
    }
20
    tmp += ADCW;        // Wandlungsergebnisse aufaddieren
21
  adccounter++;
22
  }
23
  else {
24
   adcval = tmp / 10;
25
   adccounter = 0;
26
  }
27
  
28
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
29
}
30

31

32
int main() {
33
 if ( adcval > adcvalmax){ PORTC = 0xFF; } // wenn threshold überschritten wird PORTC auf high schalten
34
}

Mfg,
Peter
Gast #1044209
Lesenswert?

Details ;-)
Ich glaube ich hab auch vergessen "tmp" zurück zu setzen und der Port 
ist ja auch nicht Initialisiert. Davon das der Timer ja nicht läuft und 
die Interrupts nicht freigegeben sind mal abgesehen. ;-P
Aber ich wollte ihm ja nur zeigen wie es gehen könnte und nicht was 
fertiges geben, wo bleibt der Lerneffekt.

Aber ich sehe gerade, ich hab den Anhang vergessen.
Hiermit nachgeholt!
Das Poti muss da nicht rein, kannst auch eine feste Verstärkung 
vorsehen.

Mfg,
Peter
Angehängte Dateien:
#1044224
Lesenswert?

Tom wrote:

> Wie kann der Controller also Lärm von normalen Sprechschall
> unterscheiden?

Über den Unterschied zwischen Lärm und laut kann man streiten, da 
braucht man manchmal einen Controller als Schiedsrichter.

Vielleicht über das Spektrum? Ein Tonspektrum-Analyser lässt sich mit 
Mikrocontroller-Hilfe machen.

Grüße, Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren