Go Down

Topic: WaveShield Next Song Probleme (Read 1 time) previous topic - next topic

Ruediger

Hey Leute, ich hab mir das WaveShield vor einiger Zeit zugelegt und nutze die AF_WAVE Libary. Ich hätte gern dass das WaveShield wenn ein Taster gedrückt wird zum nächsten Lied springt und habe das ganze so realisiert:

Code: [Select]

#include <AF_Wave.h>
#include <avr/pgmspace.h>
#include "util.h"
#include "wave.h"

AF_Wave card;
File f;
Wavefile wave;      

int tracknumm =1;
int taster = 7; // Pin fuer Taster
int tasterval = 0;
int tastervalprell=0;
int tasterstatus;


void setup() {
 Serial.begin(9600);          

 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 
 pinMode(taster,INPUT);
 tasterstatus=digitalRead(taster);
 
  if (!card.init_card()) {
   putstring_nl("Card init. failed!"); return;
 }
 if (!card.open_partition()) {
   putstring_nl("No partition!"); return;
 }
 if (!card.open_filesys()) {
   putstring_nl("Couldn't open filesys"); return;
 }

if (!card.open_rootdir()) {
   putstring_nl("Couldn't open dir"); return;
 }

 putstring_nl("Files found:");
 ls();
 playfile("1.WAV");

}
 

void loop()
{
 
  tasterval=digitalRead(taster);
  delay(50);
  tastervalprell=digitalRead(taster);
  if(tasterval==tastervalprell)
   {
     if(tasterval!=tasterstatus)
       {
         
             
                 tracknumm++;
                 if (tracknumm > 8) {tracknumm = 1;}
                 switch (tracknumm) {
                                       case 1:
                                       playfile("1.WAV");
                                       break;
                                       case 2:
                                       playfile("2.WAV");
                                       break;
                                       case 3:
                                       playfile("3.WAV");
                                       case 4:
                                       playfile("4.WAV");
                                       break;
                                       case 5:
                                       playfile("5.WAV");
                                       break;
                                       case 6:
                                       playfile("6.WAV");
                                       case 7:
                                       playfile("7.WAV");
                                       break;
                                       case 8:
                                       playfile("8.WAV");
                                       break;
                                       
                                     }
               

           }
       tasterstatus=tasterval;
       }
     }


void ls() {
 char name[13];
 card.reset_dir();
 putstring_nl("Files found:");
 while (1) {
   if (!card.get_next_name_in_dir(name))
       {
      card.reset_dir();
      return;
       }
   Serial.println(name);
           }
         }

void playfile(char *name) {
  f = card.open_file(name);
  if (!f) {
     putstring_nl("Couldn't open file"); return;
  }
  if (!wave.create(f)) {
    putstring_nl("Not a valid WAV"); return;
  }
  Serial.println(name);
  wave.play();
}


Leider funzt es nicht und ich seh mitlerweile den Wald vor lauter Bäumen nicht mehr. Vielleicht könnt ihr mir ja nen Tip geben, vielen Dank, Rüdiger

uwefed

#1
Oct 05, 2010, 12:15 am Last Edit: Oct 05, 2010, 12:18 am by uwefed Reason: 1
Ist sicher nicht die Lösung Deines Problems aber wieso hast Du bei einigen case-Bedingungen ein break drinnen und bei einigen nicht?

Code: [Select]
switch (tracknumm) {
  case 1:
  playfile("1.WAV");
  break;

   case 2:
   playfile("2.WAV");
   break;

   case 3:
   playfile("3.WAV");
   case 4:
   playfile("4.WAV");
   break;

   case 5:
   playfile("5.WAV");
   break;

   case 6:
   playfile("6.WAV");
   case 7:
   playfile("7.WAV");
   break;

   case 8:
   playfile("8.WAV");
   break;
}


Wenn Du kein break reingibst wird autometisch die nächste bedingung abgearbeitet also im Falle 3  wird das file 3.WAV und das file 4.WAV aufgerufen und nur eines der beiden gespielt.

Grüße Uwe

MaFu

#2
Oct 05, 2010, 01:08 am Last Edit: Oct 05, 2010, 01:17 am by MaFu Reason: 1
Und anstelle der ganzen cases würde ich es so schreiben:

Code: [Select]
   char s[6];
   ...
   tracknumm++;
   if (tracknumm > 8)
       tracknumm = 1;
   playfile(strcat(itoa(tracknumm, s, 10), ".WAV"));


oder

Code: [Select]
   char s[6];
   ...
   tracknumm = ++tracknumm % 8;
   playfile(strcat(itoa(tracknumm + 1, s, 10), ".WAV"));

dann muss tracknumm aber am Anfang mit 0 initialisiert werden.
Und wenn Du die WAVs umbenennst (0.WAV bis 7.WAV), dann sparst Du noch das +1.
_______
Manfred

Ruediger

Erstmal vielen Dank für die Antworten. Das mit dem Break war ein versehen! Die elegantere Lösung von MaFu werde ich nachher direkt mal testen. Vielleicht läufts ja dann... Auf jeden Fall schon vielen Dank! Rüdiger

Ruediger

Hab noch was rum probiert und es lag daran,das ich die Dateien nach dem abspielen nicht wieder geschlossen hab. Gab dann wohl sowas wie nen Buffer Overflow... Klappt jetzt aber! Obwohl ich den Taster ja über die Software extrem großzügig entprelle springt er immer zwei nummern weiter... hat da vielleicht jemand ne Idee wieso? Hier auf jeden Fall der code falls der weiterhilft,oder falls es irgendwem anders helfen sollte. Vielen Dank nochmal, Ruediger

Code: [Select]

#include <AF_Wave.h>
#include <avr/pgmspace.h>
#include "util.h"
#include "wave.h"

AF_Wave card;
File f;
Wavefile wave;      

char s[6];
int tracknumm =1;
int taster = 7; // Pin fuer Taster
int tasterval = 0;
int tastervalprell=0;
int tasterstatus;


void setup() {
 Serial.begin(9600);          

 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 
 pinMode(taster,INPUT);
 digitalWrite(taster,HIGH);
 
 tasterstatus=digitalRead(taster);
 
  if (!card.init_card()) {
   putstring_nl("Card init. failed!"); return;
 }
 if (!card.open_partition()) {
   putstring_nl("No partition!"); return;
 }
 if (!card.open_filesys()) {
   putstring_nl("Couldn't open filesys"); return;
 }

if (!card.open_rootdir()) {
   putstring_nl("Couldn't open dir"); return;
 }

 putstring_nl("Files found:");
 ls();
 playfile("1.WAV");

}
 

void loop()
{
 
  tasterval=digitalRead(taster);
  delay(100);
  tastervalprell=digitalRead(taster);
  if(tasterval==tastervalprell)
   {
     if(tasterval!=tasterstatus)
       {
         
             
                 tracknumm++;
                 if (tracknumm > 8)
                 tracknumm = 1;
                 wave.stop();
                 card.close_file(f);
                 playfile(strcat(itoa(tracknumm, s, 10), ".WAV"));
                 wave.play();                  
                                                                   
           }
       tasterstatus=tasterval;
       }
     }


void ls() {
 char name[13];
 card.reset_dir();
 putstring_nl("Files found:");
 while (1) {
   if (!card.get_next_name_in_dir(name))
       {
      card.reset_dir();
      return;
       }
   Serial.println(name);
           }
         }

void playfile(char *name) {
  f = card.open_file(name);
  if (!f) {
     putstring_nl("Couldn't open file"); return;
  }
  if (!wave.create(f)) {
    putstring_nl("Not a valid WAV"); return;
  }
  Serial.println(name);
  wave.play();
}

MaFu

 :D Dein Programm reagiert auf den Zustandswechsel des Tasters. Somit wird einmal beim drücken und nochmal beim loslassen hochgezählt.
_______
Manfred

uwefed

schreib statt "tasterval!=tasterstatus"
"tasterval-tasterstatus" so ist die IF Bedingung gegeben wenn tasterval 1 ist und tasterstatus 0 ist.
Gegebenenfalls mußt du die beiden Variablen umtauschen je nachedem ob Du mit dem Tasterdruck ein HIGH oder ein LOW produzierst.

Grüße Uwe

Ruediger

stimmt  :-[
Aber das tasterval-tasterstatus funktionierte nicht...
Ich hab jetzt einfach unter die Abfrage noch ein if (tasterstatus == LOW) gesetzt. Jetzt merkt mein Programm wenn der Taster gedrückt wird,reagiert aber nur wenn er LOW ist... Damit habt ihr mir die Woche gerettet  ;)
Dickes Lob und vielen Dank!! Rüdiger

uwefed

Entschuldige für den Nicht-funktionierenden Ratschlag. Laut meinen überlegungen mußte es funktionieren. Werde bei Gelegenheit praktisch ausprobieren.
Grüße Uwe

Ruediger

Hey Leute,hab den Code nochmal geändert und eigentlich sollte jetzt alles klappen. Tut es aber nicht... Ein paar Hintergründe zum WaveShield falls es jemand nicht kennt. Mit Playfile spielt man ein Lied ab,das ganze läuft aber als Interrupt. Ich kann also nicht einfach playfile in Loop setzten weil sonst ständig das lied neu anfängt. Ich wollte mir jetzt nen Wav-Player bauen,der alle lieder nacheinander abspielt,es sei denn ein Taster wird gedrückt,dann springt er zum nächsten Lied. Das klappt auch soweit,aber er spielt immer nur das erste Lied und hört dann auf. Nach einer weile bekomm ich die Fehlermeldung das zu viele Dateien geöffnet sind. Also glaube ich das die if schleife mit den zwei bedingungen (wave.isplaying && spielt) nicht richtig aufgerufen wird. Vielleicht hab ich ja nen Denkfehler. Ich könnt ja vielleicht mal drüber schauen und mir sagen was ihr denkt. Vielen Dank, Rüdiger

Code: [Select]


#include <AF_Wave.h>
#include <avr/pgmspace.h>
#include "util.h"
#include "wave.h"

AF_Wave card;
File f;
Wavefile wave;      

char s[6];
int taster = 7; // Pin fuer Taster
int tasterval = 0;
int tastervalprell=0;
int tasterstatus;
int speicher =1;
int spielt = 0;

void setup() {
 Serial.begin(9600);          

 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 
 pinMode(taster,INPUT);
 digitalWrite(taster,HIGH);
 
 tasterstatus=digitalRead(taster);
 
  if (!card.init_card()) {
   putstring_nl("Card init. failed!"); return;
 }
 if (!card.open_partition()) {
   putstring_nl("No partition!"); return;
 }
 if (!card.open_filesys()) {
   putstring_nl("Couldn't open filesys"); return;
 }

if (!card.open_rootdir()) {
   putstring_nl("Couldn't open dir"); return;
 }

 putstring_nl("Files found:");
 ls();
 
}
 

void loop()
{
  if (speicher > 8) speicher = 1;
 
  if (wave.isplaying == 0)
{  
  playfile(strcat(itoa(speicher, s, 10), ".WAV"));
  delay(100);
  spielt = 1;
}


  if ((wave.isplaying==0 && spielt==1))
  {
  wave.stop();
  card.close_file(f);
  speicher++;
  spielt = 0;
  }
 
 tasterval=digitalRead(taster);
  delay(50);
  tastervalprell=digitalRead(taster);
  if(tasterval==tastervalprell)
   {
     if(tasterval!=tasterstatus)
    if(tasterstatus==LOW)
    {                    
                wave.stop();
                card.close_file(f);
                speicher++;
                spielt = 0;
                 
                               
           }
       tasterstatus=tasterval;
       }
}


void ls() {
 char name[13];
 card.reset_dir();
 putstring_nl("Files found:");
 while (1) {
   if (!card.get_next_name_in_dir(name))
       {
      card.reset_dir();
      return;
       }
   Serial.println(name);
           }
         }


void playfile(char *name) {
  f = card.open_file(name);
  if (!f) {
     putstring_nl("Couldn't open file"); return;
  }
  if (!wave.create(f)) {
    putstring_nl("Not a valid WAV"); return;
  }
  Serial.println(name);
  wave.play();
}




Vlt. noch ne Erklärung wie ich´s mir vorgestellt hab... Wave.isplaying ist 0 wenn kein Lied läuft. Und immer wenn nix läuft möchte ich mit playfile das nächste abspielen. Um das lied anschließend aber zu schließen schau ich ob spielt 1 ist,d.h dann für mich,das vorher ein lied gespielt hat. Aber irgendwo da ist der Wurm drin...

Ruediger

Hey Leute,wollt euch nur sagen das es endlich läuft und den fertigen Code hier reinstellen,falls es irgendwann mal jemandem hilft... Das Problem war folgendes: Wenn das Lied grade vorbei war,aber meine Loop Schleife bei der Taster abfrage war, hat sie danach natürlich direkt wieder versucht das nächste Lied abzuspielen obwohl die vorherige Datei noch nicht geschlossen war... Naja,jetzt läufts aber und mit nem Taster an Pin7 bzw. 8 kann man ein Lied weiter oder zurück. Rüdiger

Code: [Select]

#include <AF_Wave.h>
#include <avr/pgmspace.h>
#include "util.h"
#include "wave.h"

AF_Wave card;
File f;
Wavefile wave;      

char s[6];
int zurueck = 7; // Pin fuer zurueck-Taster
int vor = 8;       // Pin fuer vor-Taster
int tasterval = 0;
int tastervalprell=0;
int tasterstatus;
int tasterval2 = 0;
int tastervalprell2=0;
int tasterstatus2;
int speicher =1;
int spielt = 0;
char *lied;

void setup() {
 Serial.begin(9600);          

 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 
 pinMode(vor,INPUT);
 digitalWrite(vor,HIGH);
pinMode(zurueck,INPUT);
 digitalWrite(zurueck,HIGH);
 
 tasterstatus=digitalRead(vor);
 tasterstatus2=digitalRead(zurueck);
 
 
 
  if (!card.init_card()) {                                          //SD Karte initialisieren
   putstring_nl("Card init. failed!"); return;
 }
 if (!card.open_partition()) {
   putstring_nl("No partition!"); return;
 }
 if (!card.open_filesys()) {
   putstring_nl("Couldn't open filesys"); return;
 }

if (!card.open_rootdir()) {
   putstring_nl("Couldn't open dir"); return;
 }

 putstring_nl("Files found:");
 ls();                              //dateien auflisten
 
}
 

void loop()
{
  if (speicher > 14) speicher = 1;
  if (speicher < 1) speicher = 14;
 
  lied = strcat(itoa(speicher, s, 10), ".WAV"); //lied ist der generierte liedname
 
 
  if (wave.isplaying == 0 && spielt == 0)  //doppelte Abfrag ob wirklich nix läuft
{  
 
  playfile(lied);
  delay(100);                //abspielen
  spielt = 1;
 
}


  if ((wave.isplaying==0 && spielt==1))
  {
  wave.stop();
  card.close_file(f);        //nach dem abspielen datei schließen und speicher um 1 erhöhen
  speicher++;
  spielt = 0;
  }
 
 tasterval=digitalRead(vor);   //ein Lied weiter
  delay(50);
  tastervalprell=digitalRead(vor);
  if(tasterval==tastervalprell)
   {
     if(tasterval!=tasterstatus)
    if(tasterstatus==LOW)
    {                    
                wave.stop();
                card.close_file(f);
                speicher++;
                spielt = 0;                                                
           }
       tasterstatus=tasterval;
       }
       
       
        tasterval2=digitalRead(zurueck);   //ein Lied zurück
  delay(50);
  tastervalprell2=digitalRead(zurueck);
  if(tasterval2==tastervalprell2)
   {
     if(tasterval2!=tasterstatus2)
    if(tasterstatus2==LOW)
    {                    
                wave.stop();
                card.close_file(f);
                speicher--;
                spielt = 0;                                                
           }
       tasterstatus2=tasterval2;
       }
       
       
       
       
}


void ls() {
 char name[13];
 card.reset_dir();
 putstring_nl("Files found:");
 while (1) {
   if (!card.get_next_name_in_dir(name))
       {
      card.reset_dir();
      return;
       }
   Serial.println(name);
           }
         }


void playfile(char *name) {
  f = card.open_file(name);
  if (!f) {
     putstring_nl("Couldn't open file"); return;
  }
  if (!wave.create(f)) {
    putstring_nl("Not a valid WAV"); return;
  }
  Serial.println(name);
  wave.play();
}





Go Up