Forum: Mikrocontroller und Digitale Elektronik Arduino zu langsamer AD-Wandler


von Asdf A. (eizi)


Lesenswert?

Hallo,

ich habe einen Bluetooth Empfänger mit Aux Ausgang und einen Fernseher 
ebenfalls mit AUX Ausgang welche ich beide abwechselnd an die 
Stereoanlage hänge. Jetzt musste ich immer die Klinkenstecker wechseln 
zwischen TV & Bluetooth Empfänger da die Stereoanlage nur einen 
AUX-Eingang hat.

So dachte ich mir ich programmiere mir den Arduino einfach so dass er 
sobald an einem der beiden Kabel eine Spannung anliegt dieses einfach 
direkt zur Stereoanlage durchschaltet. Ein weitere Vorteil währe, dass 
die Stereoanlage dann via IR-Diode automatisch ein & aus geschaltet 
werden kann wenn (k)eine Spannung mehr ankommt.

Jetzt stehe ich jedoch vor dem Problem dass der Arduino für die 
Musikumwandlung von analog auf digital aufgrund der zu langsamen 
Abtastrate oft 0 Volt anzeigt, obwohl die Musik gespielt wird. Wie 
bringe ich den Arduino jetzt dazu nicht ständig hin und herzuschalten?


HIer mein bisheriger Code
1
int controlled=12;
2
  int audioeingang=0;
3
  int time=0;
4
  int pruefer1=0;
5
  int stereopruefer1=0;
6
  int stereopruefer2=0;
7
  int ledaus=9;
8
  int ledan=8;
9
10
11
void setup() {
12
      Serial.begin(9600);
13
      pinMode(controlled, OUTPUT);
14
      pinMode (ledaus,  OUTPUT);
15
      pinMode (ledan, OUTPUT);
16
17
  }
18
19
void loop() {
20
                 
21
 
22
    int audioeingang = analogRead(A0);
23
    // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
24
    float voltage = audioeingang * (5.0 / 1023.0);
25
               
26
                
27
    if(voltage > 0.0001 ) {
28
      
29
          //Serial.println("Spannung ist OK: ");
30
          //Serial.println(voltage);
31
    digitalWrite(controlled, HIGH);
32
    pruefer1++;
33
    Serial.println(pruefer1);
34
    delay(time); 
35
   }
36
  
37
   
38
    else {
39
          //Serial.println("Spannung ist zu niedrig");
40
          //Serial.println(voltage);
41
42
    digitalWrite(controlled,LOW);
43
    delay(time);              
44
  }
45
                  
46
 
47
   //Steroanlage Einschalten
48
  if(pruefer1 > 20 && stereopruefer1 ==0 ){
49
    digitalWrite(ledan, HIGH);
50
    delay(2000);
51
    //Hier Stereo IRsend Einschalten
52
      stereopruefer1=1;
53
      stereopruefer2=0;
54
    } 
55
      else { 
56
      digitalWrite(ledan, LOW); 
57
    }
58
    
59
60
61
  //Stereoanlage Ausschalten
62
  if (pruefer1 < 20 && stereopruefer2==0) {
63
   digitalWrite(ledaus, HIGH);
64
    delay(2000);
65
   //Hier Stereo IRsend Ausschalten
66
    stereopruefer1=0; 
67
    stereopruefer2==1;
68
  }
69
    else {
70
    digitalWrite(ledaus, LOW);
71
    }
72
  
73
  
74
  if (pruefer1 > 20) {
75
    pruefer1=0;
76
   }
77
78
}

von harun al raschid (Gast)


Lesenswert?

Max E. schrieb:
> Jetzt stehe ich jedoch vor dem Problem dass der Arduino für die
> Musikumwandlung von analog auf digital aufgrund der zu langsamen
> Abtastrate oft 0 Volt anzeigt, obwohl die Musik gespielt wird.
Äh, bitte was? Was willst Du machen?
> Wie
> bringe ich den Arduino jetzt dazu nicht ständig hin und herzuschalten?
Analog-Switch.

von Asdf A. (eizi)


Lesenswert?

harun al raschid schrieb:

> Äh, bitte was? Was willst Du machen?

Ich habe mein Iphone mit dem Klinkenkabel mit dem Arduino verbunden, 
dieser soll die Analoge Spannung der Musikübertragung erkennen und die 
Stereoanlage einschalten und das Signal weiter zur Stereoanlage leiten. 
Weiteres möchte ich das selbe mit dem Fernseher machen um mir ständiges 
umstecken der Kabel zu ersparen.


>> bringe ich den Arduino jetzt dazu nicht ständig hin und herzuschalten?
> Analog-Switch.

Wurde das gerne mit den Arduino machen, da die Stereoanlage via IR 
eingeschaltet werden soll.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Max E. (eizi)

>Jetzt stehe ich jedoch vor dem Problem dass der Arduino für die
>Musikumwandlung von analog auf digital aufgrund der zu langsamen
>Abtastrate oft 0 Volt anzeigt, obwohl die Musik gespielt wird. Wie
>bringe ich den Arduino jetzt dazu nicht ständig hin und herzuschalten?

Was bringt dich auf die kühne Idee, dein Arduino könnte sinnvollerweise 
das Audiosignal abtasten und direkt auswerten? Das geht so nicht, aus 
vielen Gründen.

Du brauchst eine Pegelerkennung in Form eines Spitzenwertgleichrichters. 
Die kann man u.a. mit einem Präzisionsgleichrichter machen, das ist ein 
einfacher OPV + bissel Gemüse. Das Ausgangssignal dieses 
Spitzenwertgleichrichters kann man dann in aller ruhe messen und 
auswerten. Wobei ein Arduion da mordsmäßig überdimentsioniert ist, eine 
logische Verknüpfung über ein Gatter oder nur ein paar Dioden reicht 
hier locker.
Damit schaltet man dann ein Relais mit zwei Wechslerkontakten.

Hmm, genau genommen braucht es nur EINEN Spitzwertdetektor mit EINEM 
Ausgang. Den klemmt man an den Kanal, der Vorrang haben soll.

-> Pegel auf Kanal A erkannt, Relais zieht an, Musik von Kanal A wird 
weitergeleitet (Vorrang)

-> Pegel auf Kanal A nicht erkannt, Relais fällt ab, Musik von Kanal B 
wird weitergeleitet (kein Vorrang)

Einen Spitzenwertdetektor (peak detektor) mit OPV findet man hier.

http://sound.westhost.com/appnotes/an001.htm

Es reicht die einfachste Version im Halbwellenbetrieb mit einem OPV. 
Einen 2. OPV schaltet man dahinter als Komparator, fast fertig. Das 
Relais braucht meist einen kleinen Transistor zur Ansteuerung.

Relais mit Logik ansteuern

von Asdf A. (eizi)


Lesenswert?

Falk Brunner schrieb:
> Was bringt dich auf die kühne Idee, dein Arduino könnte sinnvollerweise
> das Audiosignal abtasten und direkt auswerten? Das geht so nicht, aus
> vielen Gründen.

Versteh ich jetzt nicht dass mi dem Signal funktioniert ja schon.
Er soll ja nur erkennen ob eine Spannung anliegt oder nicht und das 
klappt. Dabei fällt mir gerade auf das der Titel falsch gewählt ist, da 
er ja nichts digital umwandelt..

von Falk B. (falk)


Lesenswert?

@ Max E. (eizi)


>Versteh ich jetzt nicht dass mi dem Signal funktioniert ja schon.

Ach so? Wo ist dann das Problem?

>Er soll ja nur erkennen ob eine Spannung anliegt oder nicht

Was bei einen NF-WECHSELSPANNUNG nicht ganz so einfach ist, schon gar 
nicht, wenn die im Bereich 0-1V liegt.

Ja, man kann es auch mit dem Ardino direkt machen, muss dann aber etwas 
mehr Logik einbauen. Denn was soll deine Schaltung machen, wenn die 
Musik plötzlich leise wird? Umschalten? Oder doch erstmal ein paar 
Sekunden warten, bis sie vielleicht wieder lauter wird?

Ausserdem kann man ein Audiosignal nicht direkt an den Arduino anlegen, 
da braucht man mindestens eine Koppelkondensator und zwei Widerstände 
als Spannungsteile für den Offset.

von Asdf A. (eizi)


Lesenswert?

Naja, ist ja nicht zeitkritisch ist es nicht, der kann auch schon mal 
ein paar Minuten warten, und wenn nichts mehr kommt die Stereoanlage 
abschalten..


Warum kann man das nicht?^^ Funktioniert ja :p

von ASCII (Gast)


Lesenswert?

Max E. schrieb:
> Warum kann man das nicht?^^ Funktioniert ja :p

wo ist dann bitte dein problem?

von Ulrich H. (lurchi)


Lesenswert?

Das der µC nicht so schnell ist stört eigentlich nicht. Damit Musik oder 
ein ähnliches Signal erkannt wird, muss mehrmals gemessen werden - wenn 
dann über etwa 10-20 sekunden keine nennenswerte Spannung erkannt wurde 
(also immer ein sehr kleiner Wert) hat man wohl kein Signal. Dafür ist 
der AVR im Ardiuno allemal schnell genug.  Egal wie man es macht, kann 
man nicht erwarten, das die erkennung schnell geht, denn die Musik macht 
auch mal Pause.

von Gerald G. (gerald_g)


Lesenswert?

Du brauchst mehr Zeit Schalte erst aus sobald insgesamt 10 Sekunden lang 
der ADC 0 anzeigt.
Es dauert zwar eine Weile bis dann ausgeschalten wird, aber ich denke 
bei Pausen zwischen den Liedern muss das sein, und stören wird es nicht 
so sehr

von foo (Gast)


Lesenswert?

Das analog Signal wirst wohl eh mit einem Relais oder Analogschalter 
umschalten - direkt geht das mit dem Ardo nicht.

Erkennen ob ein Signal da ist geht schon, einfach richtig filtern...
Ein und Ausfilter.... mit Priorität für einen Kanal.

von Asdf A. (eizi)


Lesenswert?

ASCII schrieb:
> wo ist dann bitte dein problem?

Mein Problem ist dass die Spannung der Musikübertragung immer zwischen 0 
& einigen Millivolt schwankt.  Wenn der Arduino jetzt aber genau in dem 
Moment die Spannung abfragt wenn diese bei 0 ist schaltet der Arduino 
die Stereoanlage ab.

Ich würde gerne Wissen wie ich dem Arduino beibringe auf weitere + 
Spannungswerte zu warten..

von Gerald G. (gerald_g)


Lesenswert?

Schleife hoch zählen lassen, und bei einem ADC wert größer 0 rücksetzen. 
Wenn der Zähler einen wert erreicht, der mehr als 10 Sekunden 
entspricht, ausschalten.

von Torben H. (bauteiltoeter)


Lesenswert?

Ich will ja eigentlich nicht über Ardunio schimpfen und es hat auch 
nicht direkt was mit dem Problem zu tun aber:
1
int controlled=12;
2
  int audioeingang=0;
3
  int time=0;
4
  int pruefer1=0;
5
  int stereopruefer1=0;
6
  int stereopruefer2=0;
7
  int ledaus=9;
8
  int ledan=8;

Müssen das hier wirklich überall 16Bit signed Werte sein?
Tut da nicht uint8_t?
So wirst du wenn es mal wirklich auf Geschwindigkeit ankommt nie 
Glücklich werden...

von Mike (Gast)


Lesenswert?

Auch solche Aktionen werden nicht wirklich zur Geschwindigkeit beitragen
1
    float voltage = audioeingang * (5.0 / 1023.0);

von Peter D. (peda)


Lesenswert?

Dein Problem ist nicht, daß der ADC zu langsam ist, sondern Deine 
Programmlogik.

Wie schon gesagt wurde, Du mußt ständig ADC wandeln und erst abschalten, 
wenn eine Zeit lang eine Signalschwelle unterschritten wurde.

Am besten benutzt man den ADC-Interrupt. Der setzt einen Variable z.B. 
auf 10 und ein Timerinterrupt alle 1s zählt diese runter.

Man muß auch nicht mit Gewalt seine Programme in den Schneckenmodus 
setzen:
1
delay(time);
Da würde nichtmal ein 4GHz PC diese Aufgabe schaffen.

von Mike (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Man muß auch nicht mit Gewalt seine Programme in den Schneckenmodus
> setzen:
1
delay(time);

... wobei mir die Sinnhaftigkeit dieses Codefragmentes sowieso eher 
schleierhaft erscheint, wenn man den Initialisierungswert von "time" 
betrachtet.

von Kaj (Gast)


Lesenswert?

Mike schrieb:
> wobei mir die Sinnhaftigkeit dieses Codefragmentes sowieso eher
> schleierhaft erscheint, wenn man den Initialisierungswert von "time"
> betrachtet.
Es sollen halt 0 sek, gewartet werden, ist doch total logisch :P
duck und weg

von Jürgen S. (jurs)


Lesenswert?

Max E. schrieb:
> Mein Problem ist dass die Spannung der Musikübertragung immer zwischen 0
> & einigen Millivolt schwankt.  Wenn der Arduino jetzt aber genau in dem
> Moment die Spannung abfragt wenn diese bei 0 ist schaltet der Arduino
> die Stereoanlage ab.
>
> Ich würde gerne Wissen wie ich dem Arduino beibringe auf weitere +
> Spannungswerte zu warten..

Also zunächst mal koppelst Du den Arduino offenbar falsch an Dein 
Audiosignal an.

Ich bin zwar nicht der Audio-Freak, aber wenn ich mich nicht täusche, 
müßtest Du am Arduino aus zwei hochohmige Widerständen erstmal einen 
Spannungsteiler aufbauen und das Audiosignal mit einem Kondensator am 
Mittelabgriff einspeisen.

Also 2 Widerstände 100K in Reihe geschaltet,
ein Ende an Arduino 5V, ein Ende an Arduino GND, den Mittelabgriff an 
den Analog-Pin.

GND Lautsprecherausgang an GND Arduino.

Und das Lautsprechersignal über einen Kondensator 1µF an den 
Mittelabgriff des Spannungsteilers. Dann mißt der Arduino ohne Signal 
512.

Und das Signal ändert sich nicht von 0 auf ein paar Millivolt.
Sondern es ändert sich von 512 minus ein paar Millivolt auf 512 plus ein 
paar Millivolt.

Und dann brauchst Du nur noch den Effektivwert des Signals im 
Zeitverlauf ausrechnen. Der Effektivwert einer Wechselspannung ist die 
Wurzel aus der Summe der Quadrate. Also ungefähr sowas
1
int analogWert=analogRead(A0);
2
float signal = sqrt((512-analogWert)*(512-analogWert));

Und da sich das "signal" von Messung zu Messung schnell ändert und oft 
auch nahe null ist, machst Du für das Signal eine "Exponentielle 
Glättung". Je nach Glättungsfaktor steigt der geglättete Wert dann 
schneller oder langsamer an, wenn ein Signal anliegt. Oder der 
geglättete Wert fällt schneller oder langsamer ab, wenn kein Signal 
anliegt.

Schaltlogik:
Bei Überschreiten eines Grenzwerts+Delta schaltest Du an.
Bei Unterschreiten eines Grenzwertes-Delta schaltest Du ab.

Der gesamte funktionierende Code dafür ist nicht länger als der von Dir 
eingangs gepostete nicht funktionierende Code.

Sag Bescheid, wenn Du mehr Hinweise oder fertigen Code brauchst!

von Asdf A. (eizi)


Lesenswert?

Kaj schrieb:
> Es sollen halt 0 sek, gewartet werden, ist doch total logisch :P
> duck und weg

Das war ja nur zu Testzwecken um die Serielle Ausgabe in Ruhe lesen zu 
können.


@Jürgen S

Danke für die Ausführliche Anleitung, hab nun alles so aufgebaut und 
gemacht wie du gesagt hast bis auf eine Ausnahme denn ich hatte nur 
einen 10 Microfarad Elko,

NUn  habe ich trotz googelei keinen Plan wie ich eine Exponentielle 
Glättung mache, wäre toll wenn du mir da helfen könntest..?

mfg
Max

von Jürgen S. (jurs)


Lesenswert?

Max E. schrieb:
> NUn  habe ich trotz googelei keinen Plan wie ich eine Exponentielle
> Glättung mache, wäre toll wenn du mir da helfen könntest..?

Die exponentielle Glättung ist quasi ein im Zeitverlauf gleitender 
Mittelwert, bei dem "neuere Werte" stärker gewichtet sind und "ältere 
Werte" immer weiter an Gewichtung verlieren, je älter sie sind.

Tiefpassfilter könnte man auch sagen. Code für "filteredValue" und 
"signal" als Gleitkommazahlen:
1
#define N 36
2
filteredValue = (filteredValue * (N-1) + signal) / N;

Je größer N ist, desto langsamer folgt der gefilterte Wert den aktuellen 
Schwankungen, und je kleiner N gewählt wird, desto schneller folgt der 
gefilterte Wert den laufenden Schwankungen.

N müßtest Du dann danach wählen, wie schnell die Schaltung auf ein 
vorhandenes oder nicht vorhandenes Audiosignal reagieren soll. Wenn Du N 
zu klein wählst, könnte in Audiopausen ohne Ton "kein Signal" erkannt 
und abgeschaltet werden. Und wenn Du N zu groß wählst, dann mußt Du zu 
lange warten, bis ein Signal erkannt wird.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Falk Brunner schrieb:

> Was bringt dich auf die kühne Idee, dein Arduino könnte sinnvollerweise
> das Audiosignal abtasten und direkt auswerten? Das geht so nicht, aus
> vielen Gründen.

Wieso sollte das nicht gehen? Keine Ahnung, ob es Gründe bezüglich der 
Arduino-Softwareumgebung gibt, die das verhindern, aber die Hardware 
kann das sicher und man kann auf Arduino-Hardware ja auch komplett 
eigene Software laufen lassen.

> Du brauchst eine Pegelerkennung in Form eines Spitzenwertgleichrichters.

Welchen man natürlich genausogut auch in Software bauen kann.

> Hmm, genau genommen braucht es nur EINEN Spitzwertdetektor mit EINEM
> Ausgang.

Nicht, wenn auch die beschriebene Zusatzfunktion der 
Verstärkerabschaltung bei Inaktivität auf beiden Kanälen realisiert 
werden soll...

von Jürgen S. (jurs)


Lesenswert?

c-hater schrieb:
> Wieso sollte das nicht gehen? Keine Ahnung, ob es Gründe bezüglich der
> Arduino-Softwareumgebung gibt, die das verhindern, aber die Hardware
> kann das sicher und man kann auf Arduino-Hardware ja auch komplett
> eigene Software laufen lassen.
>
>> Du brauchst eine Pegelerkennung in Form eines Spitzenwertgleichrichters.
>
> Welchen man natürlich genausogut auch in Software bauen kann.

Ah, Spitzenwerterkennung in Software - Danke für den Denkanstoß!
Das mit der Spitzenwerterkennung habe ich irgendwie überlesen.
Oder bin nicht selbst auf die Idee gekommen, das in Software zu machen.

Der TO und ich sind auf dem Trip "Effektivwertermittlung".

Ich baue es mir mal kurz auf dem Breadboard auf und mache dann einen 
Arduino-Sketch mit Spitzenwerterkennung statt Effektivwertermittlung.

Mit Effektivwertermittlung funktioniert die Pegelerkennung auf dem 
Arduino jedenfalls problemlos, wenn auch nicht bei sehr niedrigen 
Pegeln, das hatte ich letztes Jahr selbst mal ausprobiert.

Mal schauen, ob man mit Spitzenwerterkennung auch niedrigere Audiopegel 
gut erkennen kann. Ich teste mal und poste dann einen Sketch.

von Patrick C. (pcrom)


Lesenswert?

Zurueck zum originalfrage :
> Jetzt musste ich immer die Klinkenstecker wechseln
> zwischen TV & Bluetooth Empfänger da die Stereoanlage nur einen
> AUX-Eingang hat.

Ist es keine Loesung um ein extra AUX Eingang zu machen ? 2 
Serienwiederstaende dazwischen und dann einfach beide Signalen am 
gleichen AUX anschliessen

Vielleicht zu einfach gedacht...

von Peter D. (peda)


Lesenswert?

Jürgen S. schrieb:
> Der TO und ich sind auf dem Trip "Effektivwertermittlung".


Warum so umständlich?

Einfach den ADC-Wert mit einem Schwellwert vergleichen und gut is.
Um Störungen (Einschaltknacksen) zu unterdrücken, kann man z.B. erst 
nach 3 Überschreitungen einschalten.
Und wenn der Schwellwert xx Sekunden unterschritten wird, abschalten.
Wichtig:
xx Sekunden lang, nicht nach xx Sekunden.

Liegt auf beiden Eingängen ein Signal, gewinnt der wichtigere oder der 
erste, ganz wie man will.

Den ADC über eine CR-Kopplung anschließen, falls auf den Signalen 
Gleichstrom ist. Es wird nur die positive Halbwelle gemessen, das macht 
nix.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Peter Dannegger schrieb:
> Jürgen S. schrieb:
>> Der TO und ich sind auf dem Trip "Effektivwertermittlung".
>
>
> Warum so umständlich?

Weil der Typ, wie in der wunderbaren Welt des Arduino so üblich, 
ungefähr die Programmierkenntnisse einer halbverdorrten Amöbe hat. Nur 
noch unterboten von seinen Elektronikkenntnissen. Darum wird ein an sich 
triviales Problem, hier zu einer Mischung aus Marsmission und Heiligem 
Grahl stilisiert. Warum das überhaupt toleriert wird, ist mir 
schleierhaft. Einem Fachforum einfach unwürdig.
Und dabei hat er das wichtigste, die Spannungsteiler am Eingang und evt. 
die Anpassung/Einstellung der Referenzspannung (evt. auf die interne) 
noch gar nicht bedacht. Einige AVRs haben auch ne schöne 
GAIN-Einstellung für die ADCs.

gruß cyblord

von Schorsch Dabbelju (Gast)


Lesenswert?

@Cyblord

....und Du meinst wirklich, daß sich alle nach Deinen Anweisungen
richten müssen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

cyblord ---- schrieb:
> Einem Fachforum einfach unwürdig.
Warum schaust du denn in diesen Thread hier rein? Der TO hat doch das 
Keyword "Arduino" im Titel eingefügt.

Natürlich ist es so, dass ich bei einem Problem, das offenbar schon 
marktreif gelöst wurde, einfach mal bei anderen spicke, wie die das 
gelöst haben. Man muss ja nicht jedes Rad neu erfinden.

Und dann muss man nur überlegen, wie man eine Hardwarelösung in Software 
abbilden kann. Und am Besten denkt man da selber mal ein paar TAGE 
drüber nach. Es bringt nichts, wenn man nach dem zweiten Versuch und 
einer viertel Stunde gleich mal die Publikumsfrage lostritt...

Fazit: das Konzept "Arduino" ist nicht so schlecht, Nachdenken muss man 
trotzdem selber.

: Bearbeitet durch Moderator
von Jürgen S. (jurs)


Lesenswert?

cyblord ---- schrieb:
> Und dabei hat er das wichtigste, die Spannungsteiler am Eingang und evt.
> die Anpassung/Einstellung der Referenzspannung (evt. auf die interne)
> noch gar nicht bedacht. Einige AVRs haben auch ne schöne
> GAIN-Einstellung für die ADCs.

Spannungsteilerschaltung für den Eingang habe ich dem TO mit Posting vom 
Datum: 14.06.2014 23:43 Uhr gepostet.

Und mit Spitzenwerterkennung funktioniert die Detektierung des 
Audiosignals tatsächlich auch bei kleineren Pegeln als mit 
Effektivwertermittlung.

Arduino-Sketch für die Spitzenwerterkennung in 
Viertelsekundenintervallen und exponentieller Glättung, einschließlich 
Schaltfunktion am Arduino-Pin 13 (Board-LED) und Debugausgabe auf Serial 
anbei:
1
void setup() {
2
  Serial.begin(9600); // Für serielle Debug-Ausgaben
3
}
4
5
#define LEDPIN 13       // zu schaltender Pin "Board LED"
6
#define INTERVALL 250   // Millisekunden-Intervall für Spitzenpegelmessung
7
#define N 10            // Faktor für exponentielle Glättung
8
float spitzenPegel=0;
9
int spitzenPegelHigh=0;
10
int spitzenPegelLow=1023;
11
#define EINSCHALTPEGEL 4.0  // Einschaltpegel größer als Ausschaltpegel definieren
12
#define AUSSCHALTPEGEL 3.5  // Ausschaltpegel größer als Rauschen des Pegels
13
14
unsigned long lastIntervallStart;
15
16
void loop() {
17
  int analogWert=analogRead(A0);
18
  if (analogWert>spitzenPegelHigh) spitzenPegelHigh=analogWert;
19
  if (analogWert<spitzenPegelLow) spitzenPegelLow=analogWert;
20
  unsigned long now=millis();
21
  if (now-lastIntervallStart>INTERVALL)
22
  {
23
    lastIntervallStart=now;
24
    spitzenPegel = (spitzenPegel * (N-1) + (spitzenPegelHigh-spitzenPegelLow)) / N; // Glätten
25
    spitzenPegelHigh=0;
26
    spitzenPegelLow=1023;
27
    Serial.println(spitzenPegel);
28
    if (spitzenPegel>EINSCHALTPEGEL) digitalWrite(LEDPIN,HIGH);
29
    else if (spitzenPegel<AUSSCHALTPEGEL) digitalWrite(LEDPIN,LOW);
30
  }
31
}

Für eine noch bessere Eingangsempfindlichkeit wäre die Umstellung der 
ADC-Spannungsreferenz tatsächlich noch eine Option, die man auch noch 
einbauen könnte - Danke für den Hinweis!

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jürgen S. schrieb:
> Arduino-Sketch für die Spitzenwerterkennung in
> Viertelsekundenintervallen und exponentieller Glättung
Es geht ja nur um das Einschalten eines Verstärkers bei vorliegendem 
Audiosignal. Ich würde wie Peter einfach laufend Wandeln und jedesmal 
wenn der Wert groß genug ist, den Verstärker einschalten und einen 
Timeout hochsetzen. Wenn der Timout dann mal abläuft, wird der 
Verstärker ausgeschaltet.

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.