Description
Makes it so the LEDs get brighter on command, so you can enter in 'rrr' 'rrbb' etc to make each LED brighter.
Components Used
Arduino Diecimila
3 LEDS (1 red, 1 blue, 1 green)
3 resistors
Arduino Code
//*
* Serial RGB LED - extended
* ---------------
* 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
*
* OR
* Command structure is "<colorCode><colorCode>...<colorCode>", where "colorCode" is
* one of "r","g",or "b" and you can enter many at once to increase brightness
* E.g. "rr" turns the red LED up 20%.
* "rrgg" turns the red LED up 20% and the green LED up 20%
* "bggr" turns the blue LED to 1/4 brightness
*
* OR
* Command structure is "<colorName>", where "colorName" is "purple" or "pink"
* This sets the red LED, blue LED and green LED to the appropriate numbers.
*
*
* Created 13 September
*
* Shawna Hein
*
* extended version of Serial LED
* copyleft 2006 Tod E. Kurt <tod@todbot.com
* http://todbot.com/
*/
//include support for manipulating strings.
#include <stdio.h>
#include <string.h>
int MAXSIZE = 30;
char serInString[30]; // 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 redVal, greenVal, blueVal;
int redPin = 11; // Red LED, connected to digital pin 9
int greenPin = 10; // Green LED, connected to digital pin 10
int bluePin = 9; // 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);
redVal = 127;
greenVal = 127;
blueVal = 127;
analogWrite(redPin, redVal); // set them all to mid brightness
analogWrite(greenPin, greenVal); // set them all to mid brightness
analogWrite(bluePin, blueVal); // set them all to mid brightness
Serial.println("enter color command (e.g. 'r130','rrrbb', or 'purple') :");
}
void loop() {
readSerialString(serInString);
//processNumericalCommands(serInString);
processRepeats(serInString);
//processColorNames(serInString);
resetSerialString(serInString);
}
//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, rrr raises the red LED by 30%, bg raises the blue by 10 and the green by 10
void processRepeats(char *strArray){
int i = 0;
while (strArray[i] != '\0' && i<MAXSIZE) {
colorCode = strArray[i];
if(colorCode == 'r'){
redVal = (redVal+10) % 255;
if(redVal>255){
redVal=0;
}
Serial.print("Incrementing Red Value to ");
Serial.print(redVal);
analogWrite(redPin, redVal);
}
else if(colorCode == 'b'){
blueVal = (blueVal+10) % 255;
if(blueVal>255){
blueVal=0;
}
Serial.print("Incrementing Blue Value to ");
Serial.print(blueVal);
analogWrite(bluePin, blueVal);
}
else if(colorCode == 'g'){
greenVal = (greenVal+10) % 255;
if(greenVal>255){
greenVal=0;
}
Serial.print("Incrementing Green Value to ");
Serial.print(greenVal);
analogWrite(greenPin, greenVal);
}
else{
Serial.print("This is an invalid letter");
}
i++;
}
}
//change the value of the red, green, or blue LED according to the command received.
//for example, purple sets the LED to appropriate numbers
//
//**NOTE
this isnt working right now and i have spent hours trying to figure out
why... it reads in the color name fine but stringsEqual doesn't work
//.. maybe string.h isn't being included somehow?? some input would help**
//
void processColorNames(char *strArray){
int i=0;
while (strArray[i] != '\0' && i<MAXSIZE) {
Serial.print(strArray[i]);
i++;
}
if (stringsEqual(strArray,"purple", 6)) {
analogWrite(redPin, 160);
analogWrite(greenPin, 32);
analogWrite(bluePin, 240);
Serial.print("Switching to Purple");
}
else if (stringsEqual(strArray,"pink",4)) {
analogWrite(redPin, 255);
analogWrite(greenPin, 20);
analogWrite(bluePin, 157);
Serial.print("Switching to Pink");
}
}
//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;
}
}
void resetSerialString (char *strArray) {
for (int i = 0; i < MAXSIZE; 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 i = 0;
if(!Serial.available()) {
return;
}
while (Serial.available()) {
strArray[i] = Serial.read();
i++;
}
}
Item
Here is my circuit with an Eggshell (Note these are thumbnails, click on them to get a larger view).
LEDs with eggshell
Here is my circuit with a Beach Shell (Note these are thumbnails, click on them to get a larger view).
LEDS with Shell
Comments
GSI Comments
Nice work -- I like the idea of using shells to diffuse the light. If you have a picture of the diffuser working with the room lights turned off (so we can see it in all its glory), it would be cool!
Looking at your code, I'm not sure what the problem is; it seems fine to me. If you want to bring it into office hours, we'd be happy to take a look at it with you and help to figure it out. Or, if you have problems with any other code, definitely let us know. We want to avoid you having to spend a long time debugging things!