Einfache Schaltung, Audio erkennen, brauche Hilfe

Hallo zusammen!

Ich brauche Hilfe bei einem kleinen Projekt:

Wenn A0 > 40wird soll ein Ausgang (13) HIGH geschalten werden für 15 Sekunden. Diese Zeit soll immer wieder auf 15sek zurückgesetzt werden auch wenn sie schon am Laufen ist wenn A0 > 40wird.

Ziel des ganzen: Ich detektiere am A0 ein Line Audio Signal und will darauf einen Verstärker einschalten, wenn dann 15sek kein Audiosignal anliegt soll dieser ausschalten. Mit delay (15) habe ich schon versucht geht nicht da das Audiosignal schwankt.

Kann mir jemand helfen?

http://arduino.cc/en/Reference/Millis http://arduino.cc/en/Tutorial/BlinkWithoutDelay

1.) millis() Wert in Variable abspeichern. 2.) Wenn Audio Signal detektiert Variable wieder auf aktuellen millis() Wert setzen 3.) Überprüfen ob aktueller millis() Wert minus altem Wert > 15000 ist 4.) Wenn ja, was machen und wieder bei 1. anfangen

Ich wollt nicht als erster mit dem Delay ankommen ... :D

Mit delay (15) habe ich schon versucht

Versuchs doch mal ohne

Ich wollt nicht als erster mit dem Delay ankommen ... smiley-grin

Wenn das der Lösungsweg ist warum Umwege gehen? Grüße Uwe

palemrx:
Wenn A0 > 40wird soll ein Ausgang (13) HIGH geschalten werden für 15 Sekunden. Diese Zeit soll immer wieder auf 15sek zurückgesetzt werden auch wenn sie schon am Laufen ist wenn A0 > 40wird.

Zeige bitte mal diese “einfache Schaltung”, wenn sie so einfach ist!

Es ist nämlich gar nicht so einfach, eine Audio-Wechselspannung so in ein mit Gleichspannung von 0V bis 5V arbeitendes Arduino-Board einzuspeisen, dass ein Nullsignal auch eine Nullspannung liefert.

Das würde ich gerne einmal sehen, was Du da als “einfache Schaltung” hast!

Die mir bekannten einfachen Schaltungen, um ein Audiosignal an den Arduino zu koppeln, liefern kein solches Null-Volt-Signal bei Nichtvorhandensein eines Audiosignals.

palemrx:
Wenn A0 > 40wird soll ein Ausgang (13) HIGH geschalten werden für 15 Sekunden. Diese Zeit soll immer wieder auf 15sek zurückgesetzt werden auch wenn sie schon am Laufen ist wenn A0 > 40wird.

Du mußt immer prüfen, ob A0 > 40 ist, wenn ja die Zeit merken und den Ausgang setzen.
wenn A0 < 40 ist, dann prüfst du nur, ob bereits 15sek um sind, und schaltest dann den Ausgang ab.

z.B. so:

int LineADPin = A0;    // select the input pin for the potentiometer
int OutPin = 13;      // select the pin for the LED
int LineValue = 0;  // variable to store the value coming from the sensor
unsigned long timer = 0; // Timeval

void setup() {
   pinMode(OutPin, OUTPUT);  
}

void loop() {  
  if (analogRead(LineADPin) > 40){   // Wenn AD > 40
    timer = millis();                    // timer mit akueller Zeit setzen
    digitalWrite(OutPin, HIGH);            
  } else {                           // wenn AD < 40
    if (millis()-timer > 15000){         // Prüfen, ob 15 sek seit letztem timersetzen vergangen
      digitalWrite(OutPin, LOW);            // Ausgang aus.
    }
  }
}

übrigens: delay(15) erzeugt nur ein delay von 15 millisekunden.

Vielen Dank für die Hilfe!

Also das mit dem DC eingang ist mir schon bewusst, habe aber Tests gemach direkt mit Asymetischem Line Pegel an den A0 über 1M? gegen Masse oder noch mit 1n4148 in serie, geht prima! Will ja nur sehen ob was kommt oder nicht...

@ guntherb Super probiere ich gleich heute Abend aus!

Würde diese Lösungsansatz auch gehen:

/* Audio Read

*/

int audio01 = A0; int out01 = 13; void setup() {

Serial.begin(9600);

pinMode(out01, OUTPUT); }

void loop() {

Serial.println (analogRead (0)); delay(500);

unsigned long setMillis = 0; unsigned long currentMillis = millis();

if(analogRead (audio01) > 5) {

setMillis = millis();

}

if ( currentMillis-setMillis > 15000){

digitalWrite(out01, HIGH);

}

else {

digitalWrite(out01, LOW);

} }

Wenn du einen DC Offset hast, ist deine Null-Linie aber bei Ub/2. Also 2,5V. Oder 512 (in der Theorie. Praxis kann etwas abweichen). Also auch bei 0V Signalspannung hast du dann einen Wert größer als 5 oder 40.

Du musst Abfragen ob der gemessen Wert kleiner als die Null-Linie - x, oder größer als die Null-Linie + x ist. Dann hast du einen Ton.

setMillis muss static deklariert werden damit es seinen Wert behält! Sonst ist nur eine automatische Variable die am Ende von loop() aufhört zu existieren.

ok, dass muss ich genauer überdenken...

Em sorry wie stelle ich das an mit der statischen definierung von setMillis??

static unsigned long setMillis; // init mit "= 0" nicht nötig!

static ist ein ganz normales keyword:

http://arduino.cc/en/Reference/Static
http://www.c-howto.de/tutorial-variablen-konstanten-statische-variablen.html
http://openbook.galileocomputing.de/c_von_a_bis_z/009_c_funktionen_008.htm#mjfaa118de66f0515eb22dd115f803c18a

Wobei das im letzten Link nicht wirklich stimmt, dass man statische Variablen initialisieren muss. Da ist eher der Fall für lokale nicht-statische Variablen. Statische Variablen werden wie globale Variablen automatisch mit 0 initialisiert.

Ach ja, das mit dem Ub/2 oben ist wenn man den DC Offset über einen Spannungsteiler erzeugt, was die normale Schaltung in diesem Fall ist. Sowas:
http://cdn.instructables.com/FO7/166G/H7HY7X7T/FO7166GH7HY7X7T.MEDIUM.jpg

Wenn du da einen Gleichrichter hast und einfach die negative Halbwelle abschneidest, ist das was anderes. Dann hast du tatsächlich 0 als Null-Linie. Aber das ist suboptimal, da Informationen verloren gehen.

mit einer Diode bekommst Du nur die eine "Halbwelle"

Ja und ? Er will es ja nicht anhören, sondern nur messen. Pegel muss halt deutlich über 0.7V sein (bei einer normalen Diode), aber das ist bei einem Brückengleichrichter das gleiche Problem.

bei welcher Gleichrichtung erhalte ich eine höhere "Nutzspannung" ?

Das ist nicht die Frage. In Wirklichkeit beschönigt dein Bild sogar noch, da nicht bei 0V sondern bei ca. +0.7V abgeschnitten wird.

das ist suboptimal, da Informationen verloren gehen

Auch das ist unbestritten, dass Informationen verloren gehen.

Wenn A0 > 40 wird soll ein Ausgang (13) HIGH geschalten werden für 15 Sekunden

Mit normalem analogRead ( also 5V Referenzspannung ) brauchst du einen Signalpegel von 0,9V. Das liefern Line Audio Signale meist nur bei großer Lautstärke. http://en.wikipedia.org/wiki/Line_level

Serenifly's offset muss ja nicht genau bei 2,5V liegen, Hauptsache man kann Ruhe von Signal unterscheiden.