Tuesday, June 15, 2010

Distance Sensing Lamp

I built is quick demonstration piece for class today. I wanted to show how you can use a RGB led along with a proximity sensor to create a dynamic experience. I built a lamp that changes colors the closer someone stands to it.

 
High Power LED and Proximity Sensor in the Box

Light is blue, something is close to the sensor

Light is pink, something is nearby, but not as close

The arduino wired up

Close up of the sensor

Here is the code being used
int proxypin1 = 4;

int common_anode = 8;
int red_pin = 9;
int blue_pin = 11;
int green_pin = 10;

int red_min = 0;
int red_max = 255;

int blue_min = 0;
int blue_max = 180;

int green_min = 0;
int green_max = 180;

void hsv_to_rgb(float h, float s, float v, unsigned char *rc, unsigned char *gc, unsigned char *bc) {
int h_i = ((int)(h/60)) % 6;

float f = (h/60) - (int)(h/60);

float r,g,b;

float p = v * (1.0 - s);
float q = v * (1.0 - f*s);
float t = (1.0 - (1.0 - f)*s);

switch(h_i) {
case 0:  r = v; g = t; b = p; break;
case 1:  r = q; g = v; b = p; break;
case 2:  r = p; g = v; b = t; break;
case 3:  r = p; g = q; b = v; break;
case 4:  r = t; g = p; b = v; break;
case 5:  r = v; g = p; b = q; break;
}

*rc = red_max - (char)((red_max - red_min)*r);
*gc = green_max - (char)((green_max - green_min)*g);
*bc = blue_max - (char)((blue_max - blue_min)*b);
}

void setup() {
pinMode(common_anode, OUTPUT);
digitalWrite(common_anode, HIGH);

pinMode(red_pin, OUTPUT);
digitalWrite(red_pin, HIGH);

pinMode(green_pin, OUTPUT);
digitalWrite(green_pin, HIGH);

pinMode(blue_pin, OUTPUT);
digitalWrite(blue_pin, HIGH);

pinMode(proxypin1, INPUT);

Serial.begin(9600);
}

float h = 0.0;
float s = 1.0;
float v = 0.8;

int pulse;
int distance1;
byte maxdistance = 250;
void loop() {

  unsigned char r,g,b;
  
  for(int i=0;i<2;i++){
    pulse = pulseIn(proxypin1, HIGH);
    distance1 += pulse/147;
  }
  distance1 /= 2;
  Serial.print(distance1,DEC);
  Serial.print(10,BYTE);

hsv_to_rgb(map(constrain(distance1,6,maxdistance),6,maxdistance,0,359),s,v, &r,&g,&b);
distance1 = 0;
//analogWrite(red_pin, 0);


analogWrite(red_pin, r);
analogWrite(green_pin, g);
//analogWrite(green_pin, 0);
analogWrite(blue_pin, b);
//analogWrite(blue_pin, 255);

delay(100);
}


No comments:

Post a Comment