Announcements

November 24, 2007
Reading for November 27th, are now posted. Enjoy!

October 2, 2007
To upload your thoughtless acts, create a new assignment page like any other lab. You'll see "Thoughtless Acts" listed as one of the assignment options.

May 24, 2008
This site has been archived and is no longer editable. Stay tuned for the next version, coming in the fall!


LEDs: Inputs and Outputs

Project Members: 
Kimberly_Lau

Description

Build a three-LED circuit using three Pulse Width Modulation (PWM) pins on
the Arduino board to control the brightness of several LEDs simultaneously.

The modified code uses Arduino’s Serial Communication feature, and allows
the user to increase the brightness of each LED by 10% each time he inputs the
key “r” for red, “g” for green, and “b” for blue. The code also prints the brightness of each LED as a percentage.

Components Used

Blue LED
Red LED
Green LED
Arduino board
Breadboard
Three 220-ohm Resistors (red, red, brown, gold)

Arduino Code

/*

* Serial RGB LED

* ---------------

* Serial commands
control the brightness of R,G,B LEDs

*

* Command structure
is "<colorCode>*", where "colorCode" is

* one of
"r","g", or "b".

* E.g.
"r" increases the red LED
brightness by 10

* "rrr" increases the red LED brightness by 30

* "ggb" increases the green LED brightness by 20 and
the blue by 10

*

* Created 18 October
2006

* copyleft 2006 Tod
E. Kurt <tod@todbot.com

* http://todbot.com/

*

* Adapted 13
September 2007

* modified by
Kimberly Lau

*/

//include support for manipulating strings.

//for a useful string comparison function, see the bottom of
this file... stringsEqual()

#include <stdio.h>

#include <string.h>

char serInString[100];
// array that will hold the different bytes of the string.
100=100characters;


// -> you must state how long the array will be else it won't work
properly

char colorCode;

int colorVal;

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

int redValue = 127;

int greenValue = 127;

int blueValue = 127;

void setup() {

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

pinMode(greenPin,
OUTPUT);


pinMode(bluePin, OUTPUT);

Serial.begin(9600);


analogWrite(redPin,
redValue); // set them all to
mid brightness


analogWrite(greenPin, greenValue);
// set them all to mid brightness


analogWrite(bluePin,
blueValue); // set them all to
mid brightness


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

}

void loop () {

//read the serial
port and create a string out of what you read


readSerialString(serInString, 100);

processRepeatKeyCommands(serInString, 100);

//Erase anything
left in the serial string, preparing it for the

//next loop


resetSerialString(serInString, 100);

delay(100); // wait a bit, for serial data

}

void resetSerialString (char *strArray, int length) {

for (int i = 0; i
< length; i++) {

strArray[i] =
'\0';

}

}

//read a string from the serial and store it in an array

//you must supply the array variable

void readSerialString (char *strArray, int maxLength) {

int i = 0;


if(!Serial.available()) {

return;

}

while
(Serial.available() && i < maxLength) {

strArray[i] =
Serial.read();

i++;

}

}

//go through the string, and increase the red value for each
'r',

//the green value for each 'g', and the blue value for each
'b'.

//For example "rrrg" increases red by 30 and green
by 10.

void processRepeatKeyCommands(char *strArray, int maxLength)
{

int i = 0;

//loop through the
string (strArray)

//i = the current
position in the string

//Stop when either
(a) i reaches the end of the string or

// (b) there is an empty
character '\0' in the string

while (i <
maxLength && strArray[i] != '\0') {

//Read in the
character at position i in the string

colorCode =
serInString[i];

//If the character
is r (red)...

if (colorCode ==
'r') {

//Increase the
current red value by 10, and if you reach 255 go back to 0

redValue = (redValue + 25) % 255;


analogWrite(redPin, redValue);

Serial.print("setting color r to
brightness percentage ");

//Show
brightness as a percentage

int redPercent =
0;

redPercent =
(((redValue * 100) / 255) + redPercent) % 255;


Serial.println(redPercent);

//If the character
is g (green)...

} else if
(colorCode == 'g') {

greenValue =
(greenValue + 25) % 255;


analogWrite(greenPin, greenValue);


Serial.print("setting color g to brightness percentage ");

//Show
brightness as a percentage

int greenPercent
= 0;

greenPercent =
(((greenValue * 100) / 255) + greenPercent) % 255;


Serial.println(greenPercent);

//If the character
is b (blue)...

} else if
(colorCode == 'b') {

blueValue =
(blueValue + 25) % 255;

analogWrite(bluePin,
blueValue);


Serial.print("setting color b to brightness percentage ");

//Show
brightness as a percentage

int bluePercent
= 0;

bluePercent =
(((blueValue * 100) / 255) + bluePercent) % 255;


Serial.println(bluePercent);

}

//Move on to the
next character in the string

//From here, the
code continues executing from the "while" line above...

i++;

}

}

//compare two strings to see if they are equal

//compares the first 'numCharacters' characters of string1
and string2 to

//see if they are the same

//

//E.g. stringsEqual("hello","hello",5)
=> true

//
stringsEqual("hello","helaabbnn",3) => true

//
stringsEqual("hello","helaa",5) => false

boolean stringsEqual(char *string1, char *string2, int
numCharacters) {

if (strncmp(string1,
string2, numCharacters) == 0) {

return true;

} else {

return false;

}

}

Diffuser

Homemade diffuser was made of a water bottle cap, a lotion
bottle cap, and a piece of napkin respectively taped onto a cylinder of paper
and placed on top of the lights.

Pictures

3 LEDs3 LEDs

Water Bottle Cap DiffuserWater Bottle Cap Diffuser

Napkin DiffuserNapkin Diffuser

Lotion Bottle Cap DiffuserLotion Bottle Cap Diffuser


Comments

GSI Comments

Cool diffusers. The lotion bottle cap diffuser doesn't mix all of the colors together, but as a result it looks very much like an irridescent pearl... I'm curious about how it looked from different angles. It would be very cool if you could create something like that which was spherical and really did look like a pearl.

It would also be interesting to try combining the different elements to make other types of diffusers. For example, could you line one of the bottle caps with the napkin?

 


Powered by Drupal - Design by Artinet