Go Down

Topic: Waveshield random songs (Read 551 times) previous topic - next topic

WOKKY

Jan 11, 2013, 02:01 pm Last Edit: Jan 11, 2013, 04:35 pm by WOKKY Reason: 1
Hi, I'm relatively new to Arduino and I've run into a problem.
I'm using capacitive sensing to interact with a wave shield. So if I touch a "button", a song will play.
To do this I'm using this code:
Code: [Select]
#include "pins_arduino.h" // Arduino pre-1.0 needs this
#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"

int capSensePinw1 = 6;
int capSensePinw2 = 7;
int capSensePinw3 = 8;
int capSensePinw4 = 9;


int w = 0;
int w2 = 0;
int w3 = 0;
int w4 = 0;



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

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

#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(){
 Serial.begin(9600);
putstring_nl("WaveHC with 6 buttons");
 
  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);

 // pin13 LED
 pinMode(13, OUTPUT);

 // enable pull-up resistors on switch pins (analog inputs)
 digitalWrite(6, HIGH);
 digitalWrite(7, HIGH);
 digitalWrite(8, HIGH);
 digitalWrite(9, HIGH);


 //  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(){
 int w = readCapacitivePin(capSensePinw1);
 int w2 = readCapacitivePin(capSensePinw2);
 int w3 = readCapacitivePin(capSensePinw3);
 int w4 = readCapacitivePin(capSensePinw4);


 
   if (w > 3){

   Serial.print("w1 ");
   Serial.print(w);
   Serial.println();
   playcomplete("w1.WAV");
 }

if (w2 > 3){

 
 
   Serial.print("w2 ");
   Serial.print(w2);
   Serial.println();
   playcomplete("2.WAV");

 }
 
if (w3 > 3){

   Serial.print("w3 ");
   Serial.print(w3);
   Serial.println();
   playcomplete("3.WAV");

 }
 
if (w4 > 3){

   Serial.print("w4 ");
   Serial.print(w4);
   Serial.println();
   playcomplete("4.WAV");
 }
 
}


uint8_t readCapacitivePin(int pinToMeasure) {
 // Variables used to translate from Arduino to AVR pin naming
 volatile uint8_t* port;
 volatile uint8_t* ddr;
 volatile uint8_t* pin;
 // Here we translate the input pin number from
 //  Arduino pin number to the AVR PORT, PIN, DDR,
 //  and which bit of those registers we care about.
 byte bitmask;
 port = portOutputRegister(digitalPinToPort(pinToMeasure));
 ddr = portModeRegister(digitalPinToPort(pinToMeasure));
 bitmask = digitalPinToBitMask(pinToMeasure);
 pin = portInputRegister(digitalPinToPort(pinToMeasure));
 // Discharge the pin first by setting it low and output
 *port &= ~(bitmask);
 *ddr  |= bitmask;
 delay(1);
 // Make the pin an input with the internal pull-up on
 *ddr &= ~(bitmask);
 *port |= bitmask;
 // Now see how long the pin to get pulled up
 int cycles = 17;
 for(int i = 0; i < 16; i++){
   if (*pin & bitmask){
     cycles = i;
     break;
   }
 }
 // Discharge the pin again by setting it low and output
 //  It's important to leave the pins low if you want to
 //  be able to touch more than 1 sensor at a time - if
 //  the sensor is left pulled high, when you touch
 //  two sensors, your body will transfer the charge between
 //  sensors.
 *port &= ~(bitmask);
 *ddr  |= bitmask;

 return cycles;

}

byte check_switches()
{
 static byte previous[6];
 static long time[6];
 byte reading;
 byte pressed;
 byte index;
 pressed = 0;

 for (byte index = 0; index < 6; ++index) {
   reading = digitalRead(14 + index);
   if (reading == LOW && previous[index] == HIGH && millis() - time[index] > DEBOUNCE)
   {
     // switch pressed
     time[index] = millis();
     pressed = index + 1;
     break;
   }
   previous[index] = reading;
 }
 // return switch number (1 - 6)
 return (pressed);
}


// 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) {
 // 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();
}


The thing is, I actually don't want 4 buttons.
I want only one to randomize my 4 songs but I can't figure out how to do that.

robtillaart


you need just one button and - http://arduino.cc/en/Reference/random -
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Go Up