Jacek Spiewla

24Mar/09

Arduino Hacking – RGB LED and Force Pressure Sensor

Here's a circuit for changing the color of an RGB LED based on the amount of pressure applied to a force pressure sensor.

Materials:

  1. Arduino Board (I used a Duemilanove)
  2. Force Sensor Kit
  3. RGB LED
  4. 100Ω Resistor

Arduino Code:

/*
 * This script does the following:
 * 1. Gets analog sensor input from a touch sensor
 * 2. Processes sensor data in a four state machine
 * 3. Adjusts an RGB LED color based on toouch sensor pressure using PWM
 *
 * Written by: Jacek Spiewla (jacekspi@umich.edu)
 * Date Created:   2/23/2009
 * Date Modified:  3/17/2009
 */

//Setup all pins
int sensPin = 2;    // set the touch sensor (analog) input pin on Arduino
int redPin = 11;    // set the PWM (analog) output pin on Arduino controlling the red anode
int grnPin = 9;        // set the PWM (analog) output pin on Arduino controlling the green anode
int bluPin = 10;    // set the PWM (analog) output pin on Arduino controlling the blue anode

//Setup all initial values
int val = 0;            // initial value for touch sensor input
int state = 1;        // initial machine state

//Initialize variables
int redVal;         // pulse width variable for red anode
int grnVal;         // pulse width variable for green anode
int bluVal;        // pulse width variable for blue anode

void setup() {
  pinMode(redPin, OUTPUT);   // set the LED pins as output
  pinMode(grnPin, OUTPUT);
  pinMode(bluPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  val = analogRead(sensPin);           // read touch sensor values
  Serial.println(val);

  if (state == 1) {sleep();}        // turn off LED
  else if (state == 2) {redIn();}    // fade in red color
  else if (state == 3) {grnIn();}    // fade in green color
  else if (state == 4) {bluIn();}    // fade in blue color
}

void sleep() {
  alloff();                                  // turn off LED

  if (val > 20 && val <= 500)  {state = 2;}   // test for low pressure
  if (val > 500 && val <= 850) {state = 3;}   // test for medium pressure
  if (val > 850) {state = 4;}              // test for high pressure
} 

void redIn() {                  // function to fade in red color and transition to other states
  grnVal = 0;
  analogWrite(grnPin, grnVal);  // turn off green in case the last state was green

  if (redVal == 255) {            // if red is at maximum, continue to light it up
    analogWrite(redPin, redVal);
  } else {                    // else fade in the red color
    redVal ++;
    analogWrite(redPin, redVal);
  }

  if (val < 20) {state = 1;}    // turn off the LED if no pressure detected
  if (val > 500) {state = 3;}   // fade in green if pressure has increased
}

void grnIn() {                  // function to fade in green color and transition to other states
  redVal = 0;
  bluVal = 0;
  analogWrite(redPin, redVal);    // turn off red in case the last state was blue
  analogWrite(bluPin, bluVal);  // turn off blue in case the last state was blue

  if (grnVal == 255) {            // if green is at maximum, continue to light it up
    analogWrite(grnPin, grnVal);
  } else {                    // else fade in the green color
    grnVal ++;
    analogWrite(grnPin, grnVal);
  }

  if (val <= 500) {state = 2;}    // fade in red if pressure has decrease
  if (val >= 850) {state = 4;}    // fade in blue if pressure has increased
}

void bluIn() {                  // function to fade in blue color and transition to other states
  grnVal = 0;
  analogWrite(grnPin, grnVal);    // turn off green in case the last state was green

  if (bluVal == 255) {            // if blue is at maximum, continue to light it up
    analogWrite(bluPin, bluVal);
  } else {                    // else fade in the blue color
    bluVal ++;
    analogWrite(bluPin, bluVal);
  }

  if (val <= 850) {state = 3;}    // fade in green if pressure has decreased
}

void alloff() { // function to turn off the LED
  redVal = 0;
  grnVal = 0;
  bluVal = 0;

  analogWrite(redPin,  redVal);
  analogWrite(grnPin,  grnVal);
  analogWrite(bluPin,  bluVal);
}