I'm building a portal gun from the game Portal and I'm struggling with the wiring for the lights and sound. I've the lights working using the first image from Instructables and adding more LEDs shouldn't be a problem. I'm trying to add the SD card and speaker so when you flick the switch, as well as the lights changing, the firing sound is played. Image 2. everything is wired quite nicely the only change is I'm using pin 10 not 4 on the memory card.

2 leds 1 spdt

SD Card and speaker

This is my code and it all compiles fine and seems to make sense to me but I'm new to programming.

The lights work but none of the sounds play. I've formatted the SD card and also made sure the .wav files are the right format: mono 8 bit 16000 Hz. I can't work out what's wrong and why I can't get it to play the sounds.

I also have an Adafruit amp just in case it isn't loud enough but not a clue how to wire it in.

#include <pcmRF.h>
#include <TMRpcm.h>
#include <SD.h>                       // need to include the SD library
#define SD_ChipSelectPin 10            // using digital pin 10 on arduino uno 328, can use other pins
#include <SPI.h>

void setup()
  // put your setup code here, to run once:
  TMRpcm tmrpcm;
  tmrpcm.speakerPin = 9;          //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc

  if (!SD.begin(SD_ChipSelectPin))
    Serial.println("SD fail");

  //set the switch input, pin 8, as an
  pinMode(8, INPUT);

  //set both the LED pins, pin 5 and 6 as OUTPUTs
  pinMode (5, OUTPUT);
  pinMode (6, OUTPUT);

void loop()
  TMRpcm tmrpcm;
  int switchValue = digitalRead(8);
  if (switchValue == 1)
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(5, LOW);
  • Well, that first image really sums up Instructables nicely... shudder – Majenko Jan 14 '18 at 16:12

At a guess I would say your main problem is you are defining your TMRpcm objects within the setup and loop functions, which means that as soon as that function exits the TMRpcm objects will be disposed of. I.e., it won't work. It may start playing a sound in setup(), but it will stop (and maybe even crash completely) before you even have a chance to hear it.

Your TMRpcm object must be declared globally for you to have any hope of making it work.

TMRpcm tmrpcm;

void setup() {
    // ....


Another thing to note is that TMRpcm plays the sounds asynchronously. That is, it doesn't wait while it plays the sound, so if you play one sound and then another sound the second sound will start before the first one has even begun playing, so you'll never hear the first one. Instead, if you want to play sounds sequentially, you should for the first sample to finish using something like:

while (tmrpcm.isPlaying()) {

which will stop your sketch running until the last sound has finished. Including the delay(1) is a good idea since it allows yield() to execute allowing anything that needs it to run (not really a problem on an Uno, but on things like an ESP8266 it's absolutely critical or you get a watchdog timeout).

| improve this answer | |
  • Thank you :) it's working, although now it loops the wav over and over i only need it to do it once. Is there a quick way of fixing that? – Moby1 Jan 14 '18 at 17:17
  • You need to learn how to recognise when the switch changes position - that is, the moment in time when it changes from LOW to HIGH, and only play at that point. – Majenko Jan 14 '18 at 17:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.