Digital I/O with Arduino and Diffuser

kiera's picture

 

Homework 2

 

Description

Using three LED make all the colors of the rainbow by fading each of the Red Green and Blue lights at different rates.

I adjusted the rate of change to 10 so that I could achieve faster fades.

 

Code

/*

* Code for cross-fading 3 LEDs, red, green and blue, or one tri-color LED, using PWM

* The program cross-fades slowly from red to green, green to blue, and blue to red

* The debugging code assumes Arduino 0004, as it uses the new Serial.begin()-style functions

* Clay Shirky <clay.shirky@nyu.edu>

*/

 

// Output

int redPin   = 9;   // Red LED,   connected to digital pin 9

int greenPin = 10;  // Green LED, connected to digital pin 10

int bluePin  = 11;  // Blue LED,  connected to digital pin 11

 

// Program variables

int redVal   = 255; // Variables to store the values to send to the pins

int greenVal = 1;   // Initial values are Red full, Green and Blue off

int blueVal  = 1;

 

int i = 0;     // Loop counter   

int wait = 10; // 50ms (.05 second) delay; shorten for faster fades

int DEBUG = 0; // DEBUG counter; if set to 1, will write values back via serial

 

void setup()

{

  pinMode(redPin,   OUTPUT);   // sets the pins as output

  pinMode(greenPin, OUTPUT);  

  pinMode(bluePin,  OUTPUT);

  if (DEBUG) {           // If we want to see the pin values for debugging...

    Serial.begin(9600);  // ...set up the serial ouput on 0004 style

  }

}

 

// Main program

void loop()

{

  i += 1;      // Increment counter

  if (i < 255) // First phase of fades

  {

    redVal   -= 1; // Red down

    greenVal += 1; // Green up

    blueVal   = 1; // Blue low

  }

  else if (i < 509) // Second phase of fades

  {

    redVal    = 1; // Red low

    greenVal -= 1; // Green down

    blueVal  += 1; // Blue up

  }

  else if (i < 763) // Third phase of fades

  {

    redVal  += 1; // Red up

    greenVal = 1; // Green low

    blueVal -= 1; // Blue down

  }

  else // Re-set the counter, and start the fades again

  {

    i = 1;

  } 

 

  analogWrite(redPin,   redVal);   // Write current values to LED pins

  analogWrite(greenPin, greenVal);

  analogWrite(bluePin,  blueVal); 

 

  if (DEBUG) { // If we want to read the output

    DEBUG += 1;     // Increment the DEBUG counter

    if (DEBUG > 10) // Print every 10 loops

    {

      DEBUG = 1;     // Reset the counter

 

      Serial.print(i);       // Serial commands in 0004 style

      Serial.print("\t");    // Print a tab

      Serial.print("R:");    // Indicate that output is red value

      Serial.print(redVal);  // Print red value

      Serial.print("\t");    // Print a tab

      Serial.print("G:");    // Repeat for green and blue...

      Serial.print(greenVal);

      Serial.print("\t");   

      Serial.print("B:");   

      Serial.println(blueVal); // println, to end with a carriage return

    }

  }

  delay(wait); // Pause for 'wait' milliseconds before resuming the loop

}

 

 

 

Something else I played around with. Adjusting the on and off settings for each LED light.

 

 

int redPin   = 11;   // Red LED,   connected to digital pin 9

int greenPin = 9;  // Green LED, connected to digital pin 10

int bluePin  = 10;  // Blue LED,  connected to digital pin 11

 

void setup() {

  pinMode(redPin,   OUTPUT);   // sets the pins as output

  pinMode(greenPin, OUTPUT);  

  pinMode(bluePin,  OUTPUT);

  Serial.begin(9600);

  analogWrite(redPin,   254);   // set them all to high brightness

  analogWrite(greenPin, 254);   // set them all to high brightness

  analogWrite(bluePin,  254);   // set them all to high brightness

  Serial.println("enter color command (e.g. 'r43') :"); 

}

 

void loop() {

  digitalWrite(11, HIGH);   // set the LED on

  delay(1000);              // wait for a second

  digitalWrite(11, LOW);    // set the LED off

  delay(1000);              // wait for a second

  digitalWrite(9, HIGH); //set the LED on

  delay(1000); //wait for a second

  digitalWrite(9, LOW); //set the LED off

  digitalWrite(10, HIGH); //set the LED on

  delay (1000);

  digitalWrite(10, LOW); // set the LED off

photo-1.jpg
0
Your rating: None