Arduino Project Help Please

Hello everyone. I'm looking for guidance. I am using an Arduino UNO, Adafruit wave shield, 3 switches and a 4 channel relay pcb. When completed, I hope to press a one out of the three switches in turn activating the relay to switch on a certain light. I have been able to connect everything up to the switches. When press a switch the audio will sound. It works perfectly. My problem is how to incorporate the code for the relays. I'm at a loss. If it was IF statements I might could get it. Could someone please look at my code and suggest how I can activate both a certain switch and certain relay at the same time? I'm using the standard Play6_HC code from: The Play6_HC Example | Wave Shield | Adafruit Learning System. Thank you very much and have a great day!

-Josh

Here is the code I'm using:

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

* if (justpressed[0]) {*
* justpressed[0] = 0;*
* playcomplete("DO.WAV");*
* }*
* if (justpressed[1]) {*
* justpressed[1] = 0;*
* playcomplete("RE.WAV");*
* }*
* if (justpressed[2]) {*
* justpressed[2] = 0;*
* playcomplete("MI.WAV");*
* }*
* if (justpressed[3]) {*
* justpressed[3] = 0;*
* playcomplete("FA.WAV");*
* }*
* if (justpressed[4]) {*
* justpressed[4] = 0;*
* playcomplete("SO.WAV");*
* }*
* if (justpressed[5]) {*
* justpressed[5] = 0;*
* playcomplete("LA.WAV");*
* }*
}
// 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();*
}

Please read "Read this before posting a programming question" at the top of the forum.

You may have a couple of problems here since this shield only works with the UNO, and it uses many of the I/O pins for itself: 2,3,4, 5 and 10, and of course Pin 13 (ledBuiltin). You can try using 6,7,8,9,11 and 12.

Make sure you define the relay pins as outputs:

pinMode(6, OUTPUT);

In your loop, add a digitalWrite statement after each justpressed[0] = 0;

  if (justpressed[0]) {
    justpressed[0] = 0;
    digitalWrite(6, HIGH);           // turn the relay on
    playcomplete("DO.WAV");
  }

You don't say how you want to turn off the relay. If you want it to turn off after the file is played, add a digitalWrite after the playcomplete(). (Playcomplete is a blocking function).

  if (justpressed[0]) {
    justpressed[0] = 0;
    digitalWrite(6, HIGH);           // turn the relay on
    playcomplete("DO.WAV");
    digitalWrite(6, LOW);            // turn the relay off
  }

Of course, use #defines to give your relay pins a name.

Thank you very much Steve. I will try your suggestions and reply back with my results. I truly appreciate your help!!!

Hi Steve. I did what you suggested. I have connected my 4 channel solid state relay pcb to my arduino and uploaded the below code. I can get my .wav to play and the relay to engage but the LED's stay on after I press my switch. I'm not sure what I'm doing wrong.

#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
#define SSR_Green 6 // green relay
#define SSR_Yellow 7 // red relay
#define SSR_Red 8 // red relay

// 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);
pinMode(SSR_Green, OUTPUT); // Digital Pin 6 ,Green relay
pinMode(SSR_Yellow, OUTPUT); // Digital Pin 7, Yellow relay
pinMode(SSR_Red, OUTPUT); // Digital Pin 8, Red relay

// 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 :(*
* 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;*

* if (justpressed[0]) {*
* justpressed[0] = 0;*
* digitalWrite(SSR_Green, HIGH); // turn the green relay on*
* playcomplete("GREEN.WAV");*
* digitalWrite(SSR_Green, LOW); // turn the green relay off*
* }*
* if (justpressed[1]) {*
* justpressed[1] = 0;*
* digitalWrite(SSR_Yellow, HIGH); // turn the yellow relay on*
* playcomplete("YELLOW.WAV");*
* digitalWrite(SSR_Yellow, LOW); // turn the yellow relay off*
* }*
* if (justpressed[2]) {*
* justpressed[2] = 0;*
* digitalWrite(SSR_Red, HIGH); // turn the red relay on*
* playcomplete("RED.WAV");*
* digitalWrite(SSR_Red, LOW); // turn the red relay off*
* }*
* if (justpressed[3]) {*
* justpressed[3] = 0;*
* playcomplete("FA.WAV");*
* }*
* if (justpressed[4]) {*
* justpressed[4] = 0;*
* playcomplete("SO.WAV");*
* }*
* if (justpressed[5]) {*
* justpressed[5] = 0;*
* playcomplete("LA.WAV");*
* }*
}
// 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();*
}

This is the 4 channel SSR pcb i'm using

My relay works as it should. It turns on then back off. But my LED stays on. It's strange lol.

Please read the post at the top of the forum on how to use the forum - particularly the part about posting code and using code tags

Ok sorry about that. I'm just going to delete my account in a few minutes.

Kaimod1982:
Ok sorry about that. I'm just going to delete my account in a few minutes.

I don't believe you are sorry. And I understand why you are deleting your account. Next time you have a question, you can make a new account and break the forum rules with your next post, claiming that you are new and didn't know about the rules. Every time this happens, you will still get help. And the cycle will continue.

Paul, have I been punked?

I suspect so, Steve. I think this happens a lot, but there's no way for us to tell for sure. The moderators can see the IP addresses of members, so might be able to know, but most ISPs use dynamic IP address allocation, which hides the evidence. Even when the same IP address gets used, I don't know if there are any tools available to the mods to keep track of possible abuse.

We could adopt a zero tolerance policy towards members who have not read the rules, but it might make the forum seem an unwelcoming place. It's a fine line to tread. And anyway, it would be hard to get all members to adopt the zero tolerance approach in the first place, because that's just another forum rule to be followed, and lots of people take pleasure in breaking rules for fun.