Lab 2: Fading RGB LEDs and Diffusers (Digital I/O with Arduino Board)

Posted by raghavchandra

raghavchandra's picture

 

Description:
To learn about the digital features of the Arduino Board. Our lab would include learning about Pulse Width Modulation(for faking Analog behavior using Digital signals) and Serial communication with the laptop.
 
Components Used:
  • 3 LEDs(Red, Blue, Green)
  • Arduino Micro-controller
  • 3 Resistors (220 Ohms)
  • Wires/Bread Board
  • Diffuser(part of HW)
Diffuser:
In Lab, different materials were used as diffusers to give a refined color mix of the RGB LEDs. Particularly Styrofoam did a good job of diffusing the colors. A half cut ping pong ball was also used to produce a mix of the colors.
Any material not too opaque but thick works well to diffuse the light. Use of multiple layers also helps to reduce the 'spot' of each light. If the diffuser is not that close, then it would diffuse better as the intensity of light would decrease. Mirrors/reflectors could be used as a base for diverting more light.
 
Arduino Code: (Part of HW)
 
/** 
 * Serial RGB LED
 * ---------------
 * Serial commands control the brightness of R,G,B LEDs 
 *
 * Command structure:
 * one of "r","g", or "b" with/without "+" or "-".
 * 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
 *      "bbbrr-ggg"    increases the blue LED brightness by 30, the red by 20, and
 *                            decreases the green LED brightness by 30.
 *      "bb-gg+rr"      increases blue and red LED brightness by 20 each, and
 *                            decreases the green LED brightness by 20.
 *
 */
 
/* Taken from Assignment Page */
 
//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. 'rrrrrrrrr-bbbb+gg') :");
 
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; 
  char sign = '+'; 
  
  //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 (colorCode == '+' || colorCode == '-') { 
      sign = colorCode; 
      
      //If the character is r (red)... 
    } else if (colorCode == 'r') { 
    //Increase the current red value by 10, and if you reach 255 go back to 0 
      if (sign == '-') 
        redValue = (redValue - 10) % 255; 
      else if (sign == '+') 
        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') { 
      if (sign == '-') 
        greenValue = (greenValue - 10) % 255; 
      else if (sign == '+') 
      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') { 
      if (sign == '-') 
        blueValue = (blueValue - 10) % 255; 
      else if (sign == '+') 
        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++; 
  } 
 
//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; 
  } 
}

 

 

 

LED_WithDiffuser-SkyBlueColor
LED_WithDiffuser-BlueColor
InitialCircuit
FadingLED_WithoutDiffuser
0
Your rating: None