finetuning Waveshield, speaking skull

Hallo,

Dit is wat ik tot nu toe voor elkaar heb, tussen ( ) is waar ik problemen mee heb.
(Zodra de shield spanning heeft wil ik een geluid, Case 7, in een loop spelen), de lijkkist -deze wordt extern geactiveerd- gaat open, een skelet springt eruit, een schakelaar wordt geactiveerd en de waveshield stopt met de loop en speelt één willekeurige .wav file (een van de andere Cases). (Als deze file is afgelopen, moet de shield weer overgaan naar Case 7 in een loop totdat de schakelaar weer geactiveerd wordt).

Ik wil dus dat de waveshield, zodra hij aan staat constant 1 file speelt in een loop. als de schakelaar geactiveerd wordt stopt de loop en speelt hij 1 andere willekeurig gekozen file, 1 keer af, daarna gaat het skelet terug in de kist -dit is nog niet in de sketch geimplementeerd- en speelt weer het eerste file af in een loop totdat de schakelaar weer geactiveerd wordt.

Op dit moment, als de waveshield ‘aan’ staat, wacht hij totdat de schakelaar geactiveerde wordt, en speelt dan alles in willekeurige volgorde af en stopt niet.

Een paar .wav file heb ik inactief gemaakt, omdat dit geluiden zijn, en ik alleen gesproken zinnen gebruik.

Als het te lastig is kan ik ook de random functie weglaten en 1 file laten spelen, maar dan is de verrassing weg.

Ik heb al veel geprobeerd, alle voorbeelden van ladyada en afgeleide hiervan, maar kom er niet uit.

Happy Halloween

//combine waveshield and servo.h replaced by servoTimer2-master test with button
#include <ServoTimer2.h>
#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"

int songCount = 7;    // total af .WAV files

SdReader card;    // This object holds the information for the card
FatVolume vol;    // This holds the information for the partition on the card
FatReader root;   // This holds the information for the filesystem on the card
FatReader f;      // This holds the information for the file we're play

uint8_t dirLevel; // indent level for file/dir names    (for prettyprinting)
dir_t dirBuf;     // buffer for directory reads

WaveHC wave;      // This is the only wave (audio) object, since we will only play one at a time

//constant
          //Test servo
ServoTimer2 servo1;
const int soundPin = 4;     // analog pin used to connect the + form jack bus
const int ledPin = 11;      // output for the eyes

// for pushbutton
const int pushbuttonPin = 7;      // choose the input pin for pushbutton
//int pirState = LOW;             // we start, assuming no motion detected
//int val = 0;                    // variable for reading the pin statu
const int servoPin = 9;

//variables
int minPulse =   750; // minimum servo position
int maxPulse     = 2250; // maximum servo position
int pulse = 0;
int turnRate     =  1800;  // servo turn rate increment (larger value, faster rate)
int refreshTime  =  500;   // time (ms) between pulses (50Hz)
int mouthchange = 6;  //checks to see if mouth position needs to be changed

long lastPulse   = 0;   // recorded time (ms) of the last pulse
int analogValue = 0;
int analogPin = 1;

#define DEBOUNCE 100  // button debouncer

// this handy function will return the number of bytes currently free in RAM, great for debugging!
int freeRam(void)
{
  extern int  __bss_end;
  extern int  *__brkval;
  int free_memory;
  if ((int)__brkval == 0) {
    free_memory = ((int)&free_memory) - ((int)&__bss_end);
  }
  else {
    free_memory = ((int)&free_memory) - ((int)__brkval);
  }
  return free_memory;
}

void sdErrorCheck(void)
{
  if (!card.errorCode()) return;
  putstring("\n\rSD I/O error: ");
  Serial.print(card.errorCode(), HEX);
  putstring(", ");
  Serial.println(card.errorData(), HEX);
  while (1);
}

void setup() {
  // set up serial port
  Serial.begin(9600);
  putstring_nl("WaveHC with 1 button");
  putstring("Free RAM: ");       // This can help with debugging, running out of RAM is bad
  Serial.println(freeRam());      // if this is under 150 bytes it may spell trouble!

  // Set the output pins for the DAC control. This pins are defined in the library
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

   // set up servo pin
  servo1.attach(9);                       // attaches the servo on pin 9 to jaw servo
  pinMode (pushbuttonPin, INPUT_PULLUP);  // switch
  pinMode (ledPin, OUTPUT);               // eyeleds

  //  if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you
  if (!card.init()) {         //play with 8 MHz spi (default faster!)
    putstring_nl("Card init. failed!");  // Something went wrong, lets print out why
    sdErrorCheck();
    while (1);                           // then 'halt' - do nothing!
  }

  // enable optimize read - some cards may timeout. Disable if you're having problems
  card.partialBlockRead(true);

  // Now we will look for a FAT partition!
  uint8_t part;
  for (part = 0; part < 5; part++) {     // we have up to 5 slots to look in
    if (vol.init(card, part))
      break;                             // we found one, lets bail
  }
  if (part == 5) {                       // if we ended up not finding one  :(
    putstring_nl("No valid FAT partition!");
    sdErrorCheck();      // Something went wrong, lets print out why
    while (1);                           // then 'halt' - do nothing!
  }

  // Lets tell the user about what we found
  putstring("Using partition ");
  Serial.print(part, DEC);
  putstring(", type is FAT");
  Serial.println(vol.fatType(), DEC);    // FAT16 or FAT32?

  // Try to open the root directory
  if (!root.openRoot(vol)) {
    putstring_nl("Can't open root dir!"); // Something went wrong,
    while (1);                            // then 'halt' - do nothing!
  }

  // Whew! We got past the tough parts.
  putstring_nl("Ready!");
}

void loop() {
  if (digitalRead(pushbuttonPin) == HIGH)
  {
  int songNumber = random(songCount + 1);
  Serial.println(songNumber);
  switch (songNumber)

  {
    case 0:
      playcomplete("BLFMTJPX.WAV");
      break;
    case 1:
      playcomplete("BLFMTJPT.WAV");
      break;
    case 2:
      playcomplete("MTJNMDR.WAV");
      break;
    case 3:
      playcomplete("YCNNTLV.WAV");
      break;
   /* case 4:
      playcomplete("DRCLLGH.WAV");
      break;*/
    case 5:
      playcomplete("HWMTJHR.WAV");
      break;
   /* case 6:
      playcomplete("SCRCRW.WAV");
      break;
      case 7:
      playcomplete("KNCKKNCK.WAV");
      break;*/
  }

  }
}

// Plays a full file from beginning to end with no pause.
void playcomplete(char *name) {

  // call our helper to find and play this name
  playfile(name);
  while (wave.isplaying) {

    {
      int sound = (analogRead(soundPin) * 8);   //Original value is 8
      Serial. println(sound);
      int LEDValue = map (sound, 0, 1023, 0, 255);
      analogWrite (ledPin, LEDValue);

      if (LEDValue <= 1)
      {
        analogWrite (ledPin, LOW);
      }
      int pos = map (sound, 0, 512, 30, 200);   //scale it to use it with the jaw movement
      servo1.write(pos);                        //set the jaw position according to the scaled value
      delay(200);          //Wait for the servo to get there (delete it if troubles)

    }

    if (millis() - lastPulse >= refreshTime)

    digitalWrite(servoPin, HIGH);   // start the pulse
    delayMicroseconds(pulse);       // pulse width
    digitalWrite(servoPin, LOW);    // stop the pulse
    lastPulse = millis();
    // do nothing while its playing

    // now its done playing
  }
}
void playfile(char *name) {
  // see if the wave object is currently doing something
  if (wave.isplaying) {// already playing something, so stop it!
    wave.stop(); // stop it
  }
  // look in the root directory and open the file
  if (!f.open(root, name)) {
    putstring("Couldn't open file "); Serial.print(name); return;
  }
  // OK read the file and turn it into a wave object
  if (!wave.create(f)) {
    putstring_nl("Not a valid WAV"); return;
  }

  // ok time to play! start playback
  wave.play();
}