Read 10 Hex Values from RFID tag to play audio file


To begin, I am a complete novice at using this Arduino but I understand the code enough to mess around in it. This is using an arduino UNO and a wave shield with a serial RFID reader from parallax. Originally, the code for this can be found here:

-It is using the first 8 values from the RFID tag to play the audio file.

Here is my edited code:

// An interactive bear for Charlie -- RFID triggered sound responses

#include <FatReader.h>
#include <SdReader.h>
#include "WaveHC.h"
#include "WaveUtil.h"
#include "LowPower.h"

SdReader memcard;
FatVolume vol;
FatReader root;
FatReader file;
WaveHC wave;

#define ENABLE 7      // Set the pin number for enabling the RFID reader. The Audio Shield uses pins 2-5.
#define NUMTAGS 22

int  val = 0; 
char code[10];
String id;
int bytesread = 0; 

char knowntags[NUMTAGS][11] = {"0300789D24", "2100E0B6ED", "2100DFF660", "2100DFD586", "2100DFB1E5", "2100E0CBAA", "2100E07B21", "2100E0B9D6", "2100D82331", "2100DFA060", "2100DFBC77", "2100DFA69A", "2100D7EFF7", "2100DFE251", "2100E02F09", "2100DFBF83", "2100DFD9EA", "2100E0ABA6", "2100DFDFC4", "2100DFF0DF", "36005B7B50", "36005B7C05"};
char soundfiles[NUMTAGS][9] = {"1000.WAV", "1001.WAV", "1002.WAV", "1003.WAV", "1004.WAV", "1005.WAV", "1006.WAV", "1007.WAV", "1008.WAV", "1009.WAV", "1010.WAV", "1011.WAV", "1012.WAV", "1013.WAV", "1014.WAV", "1015.WAV", "1016.WAV", "1017.WAV", "1018.WAV", "1019.WAV", "1020.WAV", "1021.WAV"};
char filename[1][14];

void setup() { 
  //////// Set up RFID reader to collect tag information /////////////////////
  Serial.begin(2400);         // RFID reader SOUT pin connected to Serial RX pin at 2400bps 
  pinMode(ENABLE,OUTPUT);     // Set digital pin 7 as OUTPUT to connect it to the RFID /ENABLE pin 
  digitalWrite(ENABLE, LOW);  // Activate the RFID reader
  //////// Set the pins to output for driving the Audio Shield
  pinMode(2, OUTPUT); 
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  ////////// Set up the Audio Shield by initializing the memory card for reading ////////
  if (!memcard.init()) {
    // If something went wrong sdErrorCheck prints out the error check
    putstring_nl("Card init. failed!"); 
  //This will optimize the reading of the memory card -- remove it if it times out
  // Find a FAT formatted partition by looking in teh first five slots. Remember your memory card should be FAT16 or FAT32 formatted
  uint8_t partition;
  for (partition = 0; partition < 5; partition++) {
    if (vol.init(memcard, partition))
  if (partition == 5)
    putstring_nl("No valid FAT partition");
    while(1); // This is a point of no return. Format your memory card properly and try again.

  // Open the root directory for reading the files
  if (!root.openRoot(vol))
    putstring_nl("Can't open root directory");
    while(1); // Something went wrong here so investigate the file system on your memory card.
  // If you got this far then the card is ready to read
  filename[0][10] = 'a';
  filename[0][11] = 'a';
  filename[0][12] = 'a';
  filename[0][13] = 'a';
  putstring_nl("Ready to go");
  wave.volume = 0;

// If we find an error, check what the error is and show it on the serial terminal
void cardErrorCheck(void)
  if(!memcard.errorCode()) return;
  putstring("nrSD I/O error:");
  putstring(", ");
  while(1); // Stick here if there is an error

void loop() { 

  if(Serial.available() > 0) {          // if data available from reader  
    if((val = == 10) {   // check for header 
      bytesread = 0; 
      while(bytesread<10) {              // read 10 digit code 
        if( Serial.available() > 0) { 
          val =; 
          if((val == 10)||(val == 13)) { // if header or stop bytes before the 10 digit reading 
            break;                       // stop reading 
          code[bytesread] = val;         // add the digit           
          bytesread++;                   // ready to read next digit  
      if(bytesread == 10) {              // if 10 digit read is complete 
        if (wave.isplaying)
          //Stop the audio if tag "030091FACB" is read
          if (strcmp(code,"030091FACB") == -10 )
          //char test = char(code) + '.wav';

          //Serial.print("TAG code is: ");   // possibly a good TAG 
          //Serial.println(code);            // print the TAG code 
          Serial.flush();                  // Flush the serial buffer before trying to read a new code
      bytesread = 0; 
    //low power library until woken up 
    //LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);   
    //digitalWrite(ENABLE,HIGH); //Disable the RFID Attena


void playsound(char codetoplay[]) {
  for(int i = 0; i<10; i++) {    // Make a filename from the first 8 characters of the RFID tag number
  int i = 10;
  while(filename[0][i] != '')
  silence(); //shut down anything that is currently playing and close that file

void playfile(char *name) {
  if (!, name)) {
      putstring_nl("Couldn't open file"); 
   if (!wave.create(file)) 
      putstring_nl("Not a valid WAV"); 

void silence() {
  if(wave.isplaying) {

Specifically, in the playsound() method is where my problem begins. After the 13th column it seems to append more char’s to the char array “filename” after the declared size of the column.


Ready to go
Couldn’t open file

But when I use the while loop in my edited code I get:

Ready to go
030091F9EA.wavCouldn’t open file

This gets me the desired name for the audio file, but it does not play the audio file on the SD card.
I will attach a picture for that.

My question is: Is it possible to have it read all 10 HEX values or do I have to stick to 8? with 8 it does not append after the declared column size.

EDIT: I moved this from the “project guidance” forum because I thought this was more technical.

There's a very similar problem here