Saturday, November 6, 2010

Arduino Day 6: Analog Inputs

Tip! This post is part of a series on my adventures with Arduino

I used up the last of my components today: a light sensor (CdS/photoresistor) and a knob-driven variable resistor (potentiometer). This probably means my days of “the basics” are about over!

Let’s talk about “basics” for a second. I visited some awesome friends in the hospital recently and while trying to cheer them up, Sarah and I started chatting about some famous YouTube videos like the double rainbow guy. These poor, poor friends had no idea what we were talking about.

Fortunately, they had a laptop handy, and unlike the first couple of days they were there, the wifi worked. They were summarily introduced to the Internet with the following choice selections:

If you or someone you know hasn't yet experienced the hilarity of user submitted content, please, do not fear. You are welcome here. It's a safe-ish place.

Now where was I? Oh yes…

Today’s build is another extension on the sound thing I’ve been working on. I took the Mario playing board and added in a light-trigger so it only plays when it’s dark. I also used the potentiometer to control the tempo of the song. Let me show you:

Build

IMAG0705IMAG0707

Circuit

Since this build was a very minor addition to my previous circuits, I’m only showing the simple changes here:

Sketch_bb

Schematic

Sketch_schem

Code

The only changes today were in the Loop() routine:

void loop() {
  int CdsReading;  
  for(int i = 0; i<x; i++){

    // wait until dark
    while ((CdsReading = analogRead(0)) < 500){
      // check 10x/sec
       delay(100);       
    }

    // get the pot value
    NoteDuration = analogRead(1);
    Serial.print("Pot reading = ");
    Serial.println(NoteDuration);

    // map the analog value [0,1023] to a reasonable speed value [25,250]
    NoteDuration = map(NoteDuration, 0, 1023, 25, 250);

    // play each note for the corresponding duration
    Buzz(song[i], NoteDuration*length[i]);

    // tiny break between notes
    delay(50); 

    // rest the corresponding duration (often 0)
    delay(NoteDuration*rests[i]);
  }
  
  delay(2000); // pause a moment before starting over
}

Next Steps

This was a very fun project because it gave me another opportunity to engage Thing1. I inverted the light sensor logic for her so that it plays only when a bright light is shining on it. She had about eight seconds of fun shining a flashlight on/off/on/off/on/off and seeing the song and LEDs react. Considering her skill with the TV remote (a much more impressive device), I guess the eight seconds of interest I got from my three year old was pretty good.

I honestly have no idea what I’m going to do tomorrow. Suggestions?