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)
Vielleicht über eine gewisse Zeit (halbe Minute oder so?) den Mittelwert bilden und wenn dieser Deinen Referenzwert überschreitet, dies signalisieren.
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
>int main() { > if ( adcval > adcvalmax){ PORTC = 0xFF; } // wenn threshold überschritten >wird PORTC auf high schalten >} Und immer wieder den Reset Knopf drücken ;)
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
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
Ein Tool für alle Lehrer?! Wenn das Lämpchen leuchtet, wissen die Schüler, dass sie zu laut sind. ?!
> Wie kann der Controller also Lärm von normalen Sprechschall > unterscheiden? Na, wie hört sich denn Sprache an? Und wie "Lärm", in diesem Fall vermutlich mehrere Stimmen durcheinander?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.