Lab 2 - Delicious diffusing LEDs

Assignment: Digital I/O with Arduino Boards + Diffuser

Collaborators:

 

The diffuser is a sheet of translucent rice paper used in Vietnamese spring rolls. It has been wet to form edges of the triangular pyramid. The three LEDs change color when you enter the rgb values as percentages in the following format space-denoted format:

 

"  r-value g-value b-value"

(two spaces, red value, space, green value, space, blue value)

 

For example, to turn the red LED to maximum brightness, the green to half maximum, and the blue completely off, you would enter this:

 

"  100 50 0"

(space, space, 1,0,0, space, 5, 0, space, 0)

 

Attached are photos of the circuit without the diffuser with rgb set at 100 50 0 (IMG_5397.JPG), the circuit with the diffuser  with rgb set at 50 100 50(IMG_5401.JPG), and the splashes of color on the rice paper with rgb set at 100 50 0 (IMG_5398.JPG) and 50 100 50 (IMG_5399.JPG, also shown below).

 

Lit diffuser

 

Below is the modified code based from that used in Lab 2. I added a third function which changes the LEDs by rgb percentage values.

 

CODE

/*

* Serial RGB LED

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

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

*

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

* one of "r","g",or "b" and "colorVal" is a number 0 to 255.

* E.g. "r0"   turns the red LED off.

*      "g127" turns the green LED to half brightness

*      "b64"  turns the blue LED to 1/4 brightness

*

* Alternate 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/

*

* The third function added Sept. 14-16 2009

* by Chung-Hay

*

* Adapted 5 September 2007

* copylefter 2007 Ryan Aipperspach <ryanaip@alumni.rice.edu>

*

*/

 

//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. 'r43 or rrrrrrrrbbbb') :");

}

 

void loop () {

// clear the string

memset(serInString, 0, 100);

 

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

readSerialString(serInString, 100);

 

 

 

//UNCOMMENT ONE OF THE FOLLOWING COMMANDS, OR NOTHING WILL HAPPEN WHEN YOU

//RUN THE PROGRAM...

 

//Uncomment the following line to read commands of the form 'r245' or 'b3'

//processNumericalCommands(serInString);

 

//Uncomment the following line to read commands of the form 'rrrb'

//processRepeatKeyCommands(serInString, 100);

 

//Or write your own function...

rgbCommands(serInString, 20);

 

 

 

//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 + 10) % 255;

analogWrite(redPin, redValue);

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

Serial.println(redValue);

 

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

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

greenValue = (greenValue + 10) % 255;

analogWrite(greenPin, greenValue);

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

Serial.println(greenValue);

 

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

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

blueValue = (blueValue + 10) % 255;

analogWrite(bluePin, blueValue);

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

Serial.println(blueValue);

}

 

//Move on to the next character in the string

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

i++;

}

}

 

//change the value of the red, green, or blue LED according to the command received.

//for example, r240 sets the red LED to the value 240 (out of 255)

void processNumericalCommands(char *strArray) {

//read in the first character in the string

colorCode = serInString[0];

 

//if the first character is r (red), g (green) or b (blue), do the following...

if( colorCode == 'r' || colorCode == 'g' || colorCode == 'b' ) {

//convert the string to an integer

//(start at the second character, or the beginning of the string '+1')

colorVal = atoi(serInString+1);

Serial.print("setting color ");

Serial.print(colorCode);

Serial.print(" to ");

Serial.print(colorVal);

Serial.println();

 

if(colorCode == 'r')

analogWrite(redPin, colorVal);

else if(colorCode == 'g')

analogWrite(greenPin, colorVal);

else if(colorCode == 'b')

analogWrite(bluePin, colorVal);

}

}

 

//change the value of the red, green, or blue LED according to the command received.

//for example, r240 sets the red LED to the value 240 (out of 255)

void rgbCommands(char *strArray, int maxLength)

{

 

// Describe purpose of function

//  Serial.print("Use percentage notation of the rgb triplet color you wish to see (e.g."  100 50 10" - need two spaces).");

 

int i = 0;

int number = 0;

int ctr = 1;

char* colorCode = "0";

int digit = 1;

 

//Determine length of string

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

{

i++;

Serial.print("String length: ");

Serial.println(i);

}

// i is now the last position in the string

 

//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

i--;

while (i > 0 )//&& strArray[i] != '\0')

{

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

colorCode[0] = serInString[i];

 

if(serInString[i] != ' '){

//If the character is not a comma, update the number that is the current value of the rgb

// Convert character to integer

colorVal = atoi(colorCode);

number = colorVal * pow(10,(digit-1)) + number;

if (digit == 3) number++;

Serial.print("colorVal: ");

Serial.println(colorVal);

Serial.print("number: ");

Serial.println(number);

Serial.print("digit: ");

Serial.println(digit);

Serial.println();

digit++;

}

 

else{

// Comma is reached, then store value for current parameter and proceed to next parameter (r,g,b)

 

switch (ctr){

case 1: // blue

blueValue = number;

Serial.print("Blue value: ");

Serial.println(blueValue);

digit = 1;

break;

case 2: // green

greenValue = number;

Serial.print("Green value: ");

Serial.println(greenValue);

digit = 1;

break;

case 3: // red

redValue = number;

Serial.print("Red value: ");

Serial.println(redValue);

digit = 1;

break;

}

ctr++;

number = 0;

}

 

//Move on to the next character in the string

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

i--;

}

 

if(ctr >= 4)

{

// Change LEDs - multiple by 0.01*255 to get percentages in arithmetic notation [0,1]

// -> digital 8-bit notation [0 255] with truncated values

analogWrite(redPin, floor((float)redValue * 2.55));

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

Serial.println(redValue);

 

analogWrite(greenPin, floor((float)greenValue * 2.55));

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

Serial.println(greenValue);

 

analogWrite(bluePin, floor((float)blueValue * 2.55));

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

Serial.println(blueValue);

 

ctr = 1; //Reintialize 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;

}

}