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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.