First Arduino Project WIP II

My first Arduino project, coded “LW” (short for Last Words, before I come up with a proper name), will be an interactive installation allowing the participant to witness the last moment of a fictional character from a film. The experience will be highly symbolic. The character’s death will be represented by a light that turns on and off, and a robotic voice uttering the last words.

Last week I made some significant progress.

Here is a video that shows what I’ve got so far:

First Arduino Project WIP II from Carrie Sijia Wang on Vimeo.

Got a Light?

The most important visual element of this piece would be the light. I want something of simple, minimal design, but with a vintage touch.

I decided to go with a table lamp, which would be easy to install in any environment, and would look natural (it’s a common household item), and yet not natural (with its minimal design and deliberate placement).

I bought a vintage looking LED light bulb online, which is perfect because LED lights are more durable and better energy savers.  Then I combined the light bulb with a beautiful vintage light fixture I bought on Etsy.



Wiring it up!

Instead of making my own relay, I used a powerswitch tail I bought on Adafruit. Here is the link to the product:

I connected the powerswitch tail, one end to the lamp, the other end to Arduino, three separate wires run into Arduino’s power, ground and pin 19.

I soldered a speaker to my wave shield. Then I wired up the small circuit with the distance sensor (HC-SR04 range finder) occupying pin 14 (trig) and pin 16 (echo)

I also bought a battery for Arduino so I don’t have to have it connected to my laptop all the time.



I also got the code to work the way I wanted. The following sketch tells Arduino to run the subroutine “LW” when something is within 10cm of the distance sensor. In the subroutine, the lamp turns on, a random sound file is played, then the light turns off.

#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

uint8_t dirLevel; // indent level for file/dir names    (for prettyprinting)
dir_t dirBuf;     // buffer for directory reads

 * Define macro to put error messages in flash memory
#define error(msg) error_P(PSTR(msg))

#define trigPin 14
#define echoPin 16

long randNumber;

void setup() {

  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println(F("Wave test!"));

  pinMode(2, OUTPUT); 
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  putstring_nl("\nWave test!");  // say we woke up!
  putstring("Free RAM: ");       // This can help with debugging, running out of RAM is bad

  //  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  :(
    Serial.println(F("No valid FAT partition!"));  // Something went wrong, lets print out why
  // Lets tell the user about what we found
  putstring("Using partition ");
  Serial.print(part, DEC);
  Serial.print(F(", type is FAT"));
  Serial.println(vol.fatType(), DEC);     // FAT16 or FAT32?
  // Try to open the root directory
  if (!root.openRoot(vol)) {
    Serial.println(F("Can't open root dir!"));      // Something went wrong,
  // Whew! We got past the tough parts.
  Serial.println(F("Files found (* = fragmented):"));

  // Print out all of the files in all the directories. | LS_FLAG_FRAGMENTED);


void loop ()
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds (500);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;

  Serial.print (distance);
  if (distance < 10)
    LW ();

void LW()
  digitalWrite(CLOSECIRCUIT, LOW);

  randNumber = random(1,5);

  delay (2000);
  if (randNumber == 1)
  else if (randNumber == 2)
    playcomplete ("LW2.WAV");
  else if (randNumber == 3)
    playcomplete ("LW3.WAV");
  else if (randNumber == 4)
    playcomplete ("LW4.WAV");
  else if (randNumber == 5)
    playcomplete ("LW5.WAV");

   delay (1000);
  digitalWrite(CLOSECIRCUIT, HIGH);
  delay (10000);

// 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("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;


No Comments

Post A Comment