Go Down

Topic: Programming a flex sensor to RGB LED's (Read 161 times) previous topic - next topic

kirkdraheim

I feel like I am almost there, there is just something wrong. The red LED turns off when it goes under 242, but I don't know why the LED won't change to yellow and green.

Code: [Select]
/*
  Analog input, analog output, serial output

Reads an analog input pin, maps the result to a range from 0 to 255
and uses the result to set the pulsewidth modulation (PWM) of an output pin.
Also prints the results to the serial monitor.

The circuit:
* potentiometer connected to analog pin 0.
   Center pin of the potentiometer goes to the analog pin.
   side pins of the potentiometer go to +5V and ground
* LED connected from digital pin 9 to ground

created 29 Dec. 2008
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.

*/

// These constants won't change.  They're used to give names
// to the pins used:
const int analogInPin = A0;  // Analog input pin that the flex sensor is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to

int sensorValue = 0;        // value read from the flexsensor
int outputValue = 0;        // value output to the PWM (analog out)
int redPin   = 7;   // Red LED,   connected to digital pin 5
int greenPin = 6;  // Green LED, connected to digital pin 6
int bluePin  = 5;  // Blue LED,  connected to digital pin 7

void setup() {
 
  // sets the pins as output
  pinMode(redPin,   OUTPUT); 
  pinMode(greenPin, OUTPUT);   
  pinMode(bluePin,  OUTPUT);
 
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
 
}
/*
void outputColor(int red, int green, int blue) {
 
  analogWrite(redPin, red);
  analogWrite(bluePin, blue);
  analogWrite(greenPin, green);   
 
}
*/

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);           
  // map it to the range of the analog out:
  outputValue = map(sensorValue, 0, 1023, 0, 255); 
  // change the analog out value:
  analogWrite(analogOutPin, outputValue);           

  // print the results to the serial monitor:
  Serial.print("sensor = " );                       
  Serial.print(sensorValue);     
  Serial.print("\t output = ");     
  Serial.println(outputValue);   

  // wait 2 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(2);

  flexvalue();

}

void flexvalue() {

  int sensorValue = analogRead(A0);

   if (sensorValue > 130 && sensorValue < 240 ){
     
      digitalWrite(bluePin, LOW);
      digitalWrite(redPin, LOW);
      digitalWrite(greenPin, HIGH);
     
    }
   
    else if (sensorValue > 159 && sensorValue < 241){
     
      digitalWrite(bluePin, LOW);
      digitalWrite(redPin, HIGH);
      digitalWrite(greenPin, HIGH);
     
    }
   
     else if (sensorValue > 242 && sensorValue < 400){
       
      digitalWrite(bluePin, LOW);
      digitalWrite(redPin, HIGH);
      digitalWrite(greenPin, LOW);
   
        }
 
}

robtillaart

The if ranges were overlapping and unnecessary "complex"

try this as a starter (use CTRL-T to auto align the code)
removed unneeded comments and added some (in capitals to see them easily)
Code: (not tested) [Select]


// These constants won't change.  They're used to give names
// to the pins used:
const int analogInPin = A0;  // Analog input pin that the flex sensor is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to
const int redPin   = 7;
const int greenPin = 6;
const int bluePin  = 5;

int sensorValue = 0;        // value read from the flexsensor
int outputValue = 0;        // value output to the PWM (analog out)


void setup()
{
  pinMode(redPin,   OUTPUT); 
  pinMode(greenPin, OUTPUT);   
  pinMode(bluePin,  OUTPUT);

  Serial.begin(9600);
}


void loop()
{
  sensorValue = analogRead(analogInPin);           
  outputValue = map(sensorValue, 0, 1023, 0, 255); 
  analogWrite(analogOutPin, outputValue);           

  Serial.print("sensor = " );                       
  Serial.print(sensorValue);     
  Serial.print("\t output = ");     
  Serial.println(outputValue);   

  // wait 2 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(2);

  flexvalue();

}

void flexvalue()
{
  // int sensorValue = analogRead(A0); // WAS ALREADY READ !

  if (sensorValue < 200 )
  {
    digitalWrite(bluePin, LOW);
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
  }
  else if (sensorValue < 300)
  {
    digitalWrite(bluePin, LOW);
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);
  }
  else if (sensorValue < 400)
  {
    digitalWrite(bluePin, LOW);
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, LOW);
  }
  else  // ADDED THIS CASE TO CATCH ALL NON COVERED VALUES IN YOUR CODE
  {
    digitalWrite(bluePin, HIGH);
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);
  }

}
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy