Arduino audio/wave shield coding

Hi, I am working on a project where I just need to play a .wav audio file on an sd card using the arduino uno audio/wave shield. I am completely new to arduino coding and such and I am having trouble with all the steps. I discovered I needed to download some libraries onto the sketch and then use those in the code. Is there anyone who can run me through how to download those and where to place them/ upload them and then a basic code to run? Thanks

It would be neat isn't. If it's a paid project, I would say you will have a better luck posting your request to the Gigs and Colab forum. If it's a hobby project, I would agree that we don't do babysitting. Don't be afraid to try and fail, that's the most fun part.

So i uploaded the waveHC file into my libraries and tried running this code below. It compiled fine but them when i tried to upload it to my arduino it gives me this error message. Any idea what this means or how i can fix it?


#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
// Global variables
int num=0;
char toPlay[8]; // file to play 00.WAV to 99.WAV

// This handy macro lets us determine how big the array up above is, by checking the size

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

void setup() {
byte i;

// set up serial port
putstring_nl("WaveHC with ");

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);
// initilise file extension part of file to play
toPlay[2] = ‘.’;
toPlay[3] = ‘W’;
toPlay[4] = ‘A’;
toPlay[5] = ‘V’;
toPlay[6] = ‘\0’; // terminator

// 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
while(1); // then ‘halt’ - do nothing!

// enable optimize read - some cards may timeout. Disable if you’re having problems

// 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 :frowning:
putstring_nl(“No valid FAT partition!”);
sdErrorCheck(); // Something went wrong, lets print out why
while(1); // then ‘halt’ - do nothing!

// Try to open the root directory
if (!root.openRoot(vol)) {
putstring_nl(“Can’t open root dir!”); // Something went wrong,


void loop() {
if(Serial.available() > 0) {
num =;
num -= 0x30;
// Serial.println(num,HEX);
// wave.stop();

void makeName(int number){ // generates a file name 00.WAV to 99.WAV
int i=0;
if(num > 9) {
toPlay[0] = ((num/10) & 0xf) | 0x30;
toPlay[1] = ((num%10) & 0xf) | 0x30;
else {
toPlay[0] = 0x30;
toPlay[1] = (num & 0xf) | 0x30;

// Plays a full file from beginning to end with no pause.
void playcomplete(char *name) {
// call our helper to find and play this 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 (!, name)) {
putstring_nl("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;

Error Message when uploading:
Sketch uses 8218 bytes (25%) of program storage space. Maximum is 32256 bytes.
Global variables use 1355 bytes (66%) of dynamic memory, leaving 693 bytes for local variables. Maximum is 2048 bytes.
avrdude: ser_open(): can’t set com-state for “\.\COM3”
An error occurred while uploading the sketch

Have you tried searching Google for the error message?

This is a big project for someone who is completely new. Are you sure you are up to the task?

Yes. Many people have had this issue and some are still unable to figure it out. Any assistance or suggestions would be appreciated

Can we expect you to start using code tags any time soon?

Yes. Many people have had this issue and some are still unable to figure it out. Any assistance or suggestions would be appreciated

4th link down from the search.

Thank you! That fixed it. Got everything working now, just going to adjust for what I need.