Loading...
Pages: [1]   Go Down
Author Topic: Replace Buttons with LDR's  (Read 90 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

anybody can help me to convert this code Inputs from Buttons to LDR's Analog Inputs:

this code is related to the Wave shield:

Now i found this code ... and i think its great because it allows other buttons to interrupt the previous process so for now i will give you the code to help me with it .. because its made for buttons and not for analog input

Code:
Code:
#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"


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 5  // button debouncer

// here is where we define the buttons that we'll use. button "1" is the first, button "6" is the 6th, etc
byte buttons[] = {14, 15, 16, 17, 18, 19};
// This handy macro lets us determine how big the array up above is, by checking the size
#define NUMBUTTONS sizeof(buttons)
// we will track if a button is just pressed, just released, or 'pressed' (the current state
volatile byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS];

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

 // set up serial port
 Serial.begin(9600);
 putstring_nl("WaveHC with ");
 Serial.print(NUMBUTTONS, DEC);
 putstring_nl("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);

 // Make input & enable pull-up resistors on switch pins
 for (i=0; i< NUMBUTTONS; i++) {
   pinMode(buttons, INPUT);
   digitalWrite(buttons, 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  smiley-sad
   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!");

 TCCR2A = 0;
 TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20;

 //Timer2 Overflow Interrupt Enable
 TIMSK2 |= 1<<TOIE2;


}

SIGNAL(TIMER2_OVF_vect) {
 check_switches();
}

void check_switches()
{
 static byte previousstate[NUMBUTTONS];
 static byte currentstate[NUMBUTTONS];
 byte index;

 for (index = 0; index < NUMBUTTONS; index++) {
   currentstate[index] = digitalRead(buttons[index]);   // read the button

   /*     
   Serial.print(index, DEC);
   Serial.print(": cstate=");
   Serial.print(currentstate[index], DEC);
   Serial.print(", pstate=");
   Serial.print(previousstate[index], DEC);
   Serial.print(", press=");
   */

   if (currentstate[index] == previousstate[index]) {
     if ((pressed[index] == LOW) && (currentstate[index] == LOW)) {
         // just pressed
         justpressed[index] = 1;
     }
     else if ((pressed[index] == HIGH) && (currentstate[index] == HIGH)) {
         // just released
         justreleased[index] = 1;
     }
     pressed[index] = !currentstate[index];  // remember, digital HIGH means NOT pressed
   }
   //Serial.println(pressed[index], DEC);
   previousstate[index] = currentstate[index];   // keep a running tally of the buttons
 }
}


void loop() {
 byte i;
 static byte playing = -1;

 if (pressed[0]) {
   if (playing != 0) {
     playing = 0;
     playfile("DO.WAV");
   }
 }
 else if (pressed[1]) {
   if (playing != 1) {
     playing = 1;
     playfile("RE.WAV");
   }
 }
 else if (pressed[2]) {
   if (playing != 2) {
     playing = 2;
     playfile("MI.WAV");
   }
 }
 else if (pressed[3]) {
   if (playing != 3) {
     playing = 3;
     playfile("FA.WAV");
   }
 }
 else if (pressed[4]) {
   if (playing != 4) {
     playing = 4;
     playfile("SO.WAV");
   }
 }
 else if (pressed[5]) {
   if (playing != 5) {
     playing = 5;
     playfile("LA.WAV");
   }
 }

 if (! wave.isplaying) {
   playing = -1;
 }
}



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



THANKS
   
« Last Edit: December 20, 2012, 03:45:44 pm by samersh » Logged

Netherlands
Offline Offline
Tesla Member
***
Karma: 90
Posts: 9429
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

please use code tags, it is the # button above the smileys . modify your post, select the code and press # button. thank you.


buttons are 1 or zero, LDR's typically have a range between 0 .. max where max <= 1024.

you must map the analogReads to a 0 1 state to simulate the buttons. Therefor you need to define some threshold. Above = 1 beneath = 0.

Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Global Moderator
UK
Offline Offline
Brattain Member
*****
Karma: 138
Posts: 19067
I don't think you connected the grounds, Dave.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Identical post in Audio deleted.
OP, do NOT crosspost., it wastes time and makes me CROSS.
Logged

Pete, it's a fool looks for logic in the chambers of the human heart.

Sydney
Offline Offline
God Member
*****
Karma: 14
Posts: 716
Big things come in large packages
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Can't test this as I have not got your libraries, but this the changes are implemented:

Code:
#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"


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 5  // button debouncer

// here is where we define the buttons that we'll use. button "1" is the first, button "6" is the 6th, etc
/// --- byte buttons[] = {14, 15, 16, 17, 18, 19};
byte buttons[] = {A0, A1, A2, A3, A4, A5};

// This handy macro lets us determine how big the array up above is, by checking the size
#define NUMBUTTONS sizeof(buttons)/sizeof(buttons[0])
#define ON_THRESHOLD 512  // change to suit values retruned from LDR. Values greater will be ON

// we will track if a button is just pressed, just released, or 'pressed' (the current state
volatile byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS];

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

 // set up serial port
 Serial.begin(9600);
 putstring_nl("WaveHC with ");
 Serial.print(NUMBUTTONS, DEC);
 putstring_nl("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);

 // Make input & enable pull-up resistors on switch pins
 for (i=0; i< NUMBUTTONS; i++) {
   pinMode(buttons, INPUT);
   digitalWrite(buttons, 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  smiley-sad
   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!");

 TCCR2A = 0;
 TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20;

 //Timer2 Overflow Interrupt Enable
 TIMSK2 |= 1<<TOIE2;


}

SIGNAL(TIMER2_OVF_vect) {
 check_switches();
}

void check_switches()
{
 static byte previousstate[NUMBUTTONS];
 static byte currentstate[NUMBUTTONS];
 byte index;

 for (index = 0; index < NUMBUTTONS; index++) {
   currentstate[index] = analogRead(buttons[index]) >= ON_THRESHOLD;   // read the LDR 'button'

   /*     
   Serial.print(index, DEC);
   Serial.print(": cstate=");
   Serial.print(currentstate[index], DEC);
   Serial.print(", pstate=");
   Serial.print(previousstate[index], DEC);
   Serial.print(", press=");
   */

   if (currentstate[index] == previousstate[index]) {
     if ((pressed[index] == LOW) && (currentstate[index] == LOW)) {
         // just pressed
         justpressed[index] = 1;
     }
     else if ((pressed[index] == HIGH) && (currentstate[index] == HIGH)) {
         // just released
         justreleased[index] = 1;
     }
     pressed[index] = !currentstate[index];  // remember, digital HIGH means NOT pressed
   }
   //Serial.println(pressed[index], DEC);
   previousstate[index] = currentstate[index];   // keep a running tally of the buttons
 }
}


void loop() {
 byte i;
 static byte playing = -1;

 if (pressed[0]) {
   if (playing != 0) {
     playing = 0;
     playfile("DO.WAV");
   }
 }
 else if (pressed[1]) {
   if (playing != 1) {
     playing = 1;
     playfile("RE.WAV");
   }
 }
 else if (pressed[2]) {
   if (playing != 2) {
     playing = 2;
     playfile("MI.WAV");
   }
 }
 else if (pressed[3]) {
   if (playing != 3) {
     playing = 3;
     playfile("FA.WAV");
   }
 }
 else if (pressed[4]) {
   if (playing != 4) {
     playing = 4;
     playfile("SO.WAV");
   }
 }
 else if (pressed[5]) {
   if (playing != 5) {
     playing = 5;
     playfile("LA.WAV");
   }
 }

 if (! wave.isplaying) {
   playing = -1;
 }
}



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

Logged


Pages: [1]   Go Up
Print
 
Jump to: