Pages: [1]   Go Down
Author Topic: WaveShield Next Song Probleme  (Read 1183 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 269
Posts: 21840
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ist sicher nicht die Lösung Deines Problems aber wieso hast Du bei einigen case-Bedingungen ein break drinnen und bei einigen nicht?

Code:
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
« Last Edit: October 04, 2010, 05:18:50 pm by uwefed » Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Und anstelle der ganzen cases würde ich es so schreiben:

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

oder

Code:
   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.
« Last Edit: October 04, 2010, 06:17:44 pm by MaFu » Logged

_______
Manfred

0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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();
}
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

  smiley-grin Dein Programm reagiert auf den Zustandswechsel des Tasters. Somit wird einmal beim drücken und nochmal beim loslassen hochgezählt.
Logged

_______
Manfred

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 269
Posts: 21840
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink
Dickes Lob und vielen Dank!! Rüdiger
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 269
Posts: 21840
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

#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...
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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();
}




Logged

Pages: [1]   Go Up
Jump to: