Tuesday, November 2, 2010

Arduino Day 2: Digital Inputs (More Fun With LEDs)

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

I’m still familiarizing myself with everything Arduino so this next project is a simple modification to my day-1 LED project. I’ve added some dip switches to control which pattern will appear on the LEDs. Here’s the result:

It’s really pretty simple. For switches 0 and 1, I have the hot line coming through an LED, through the switch, and then split between a resistor to ground and a digital input on the board. I’m not certain I have this right, but it works and my board hasn’t melted so it’s good enough for me.

In code I watch the two switch inputs and do a basic binary check to turn these two bits into four options (off/off, off/on, on/off, on/on). On…off…that reminds me of the Karate Kid.

imageIn the Karate Kid, this old guy befriends a teenager after beating a bunch of bullies senseless. Through couldn’t-work-in-a-million-years training, Mr. Miyagi (the old guy) eventually leads the annoying kid (Daniel-san) to victory at the local Karate championship, and thereby winning the heart of Captain-Bully-Bag-Of-Many-Douches’s ex-girlfriend.

A few things: first of all, this story is complete crap. You can’t defeat a bunch of black belts using your wax-on/wax-off skills (on/off—that’s what got me onto this rant). Second of all, Miyagi should be arrested for his shenanigans. Third, I loved this movie more than life itself when I was two years old; give me a break, family. Actually, you should be ashamed of yourselves, family—I was two—what’s your excuse? I watched this movie again a few weeks ago and it was awful.

Ah memories! Back to the project:

Build:

IMAG0665

IMAG0668

Circuit (built with the amazing Fritzing):

day two - bb

Schematic (automatically built from the above image with the amazing Fritzing):

day two - schema

Code:

int SwitchPin0 = 2;
int SwitchPin1 = 4;
int Leds[] = {3, 5, 6, 9, 10, 11};
#define LedCount (sizeof(Leds)/sizeof(int)) //array size  

void setup()  { 
  for(int i=0; i<LedCount; i++){
    pinMode(Leds[i], OUTPUT);
  }
  
  pinMode(SwitchPin0, INPUT);
  pinMode(SwitchPin1, INPUT);
} 

void loop()  { 
  
  int SwitchValue0 = digitalRead(SwitchPin0);
  int SwitchValue1 = digitalRead(SwitchPin1);
  
  if(SwitchValue0 == LOW && SwitchValue1 == LOW){
    DoFlash();
  }
  else if(SwitchValue0 == LOW && SwitchValue1 == HIGH){
    DoRunway();
  }
  else if(SwitchValue0 == HIGH && SwitchValue1 == LOW){
    DoFlickerDigital();
  }
  else {
    DoFlickerAnalog();
  }
}

void SetAll(int value){
  for(int i=0; i<LedCount; i++){
    analogWrite(Leds[i], value);
  }  
}

void DoRunway(){
  for(int i=0; i<LedCount; i++){
    analogWrite(Leds[i], 255);    
    analogWrite(Leds[(i + 1) % LedCount], 0);
    delay(100);
  }   
}

void DoFlickerDigital(){
  for(int i=0; i<LedCount; i++){
    analogWrite(Leds[i], random(1+1)*255);    
    delay(100);
  } 
}

void DoFlickerAnalog(){
  for(int i=0; i<LedCount; i++){
    analogWrite(Leds[i], random(255+1));    
    delay(100);
  } 
}

void DoFlash(){
  int State = 0;
  for(int i=0; i<LedCount; i++){
    SetAll(State * 255);
    State = (State + 1) % 2;  
    delay(100);
  } 
}

Next plans

I went out to Radio Shack to pick up a few things and apparently they only sell phones and batteries now? Even though the salesman assured me they don’t have anything like an “LED” or a “resistor”, I found a dusty cabinet in the back with some nice stuff. I picked up a 5kΩ potentiometer, a bunch of random LEDs, a couple push buttons, some 220Ω resistors, and a piezo buzzer.

I was hoping to get a smaller breadboard and a pack of ready-to-use wires since what I have are a bit brittle, but no dice. I was actually a little surprised that they didn’t have a whole Arduino/microcontroller section. This stuff is really, really popular among geeks and it seems to me that “The Shack” (as I’m supposed to call it now) is missing out on an opportunity to become relevant again.

Oh well. I got enough to keep me going a few more days so see you tomorrow!