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!

Revision of Lab2-Digital I/O from Thu, 09/13/2007 - 01:47

Project Members: 
Hsin-Hsien Chiu



Responding to the issue of sustainability, natural materials are chosen as the diffuser of RGB LEDs. Two diffusers are designed for discussion:

1)      Mood Egg: Two different colors of eggs are chosen: brown and white. After cleaning the egg shells, a electric drill with sandpaper is utilized to turn around the holes in the bottoms of the eggs.

2)      Alien Bean: A brown been shell is selected. To make the Alien Been float above the three LEDs at appropriate height, three metal legs are made with metal bars and screw nuts.


Arduino board, bread board, RGB LEDs, egg shells, bean shell, metal bars and screw nuts.


#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);
  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 () {
  //read the serial port and create a string out of what you read
  readSerialString(serInString, 100);
  processRepeatKeyCommands(serInString, 100);
  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()) {
  while (Serial.available() && i < maxLength) {
    strArray[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 ");
    //If the character is g (green)...
    } else if (colorCode == 'g') {
      greenValue = (greenValue + 10) % 255;
      analogWrite(greenPin, greenValue);
      Serial.print("setting color g to ");
    //If the character is b (blue)...
    } else if (colorCode == 'b') {
      blueValue = (blueValue + 10) % 255;
      analogWrite(bluePin, blueValue);
      Serial.print("setting color b to ");
    //Move on to the next character in the string
    //From here, the code continues executing from the "while" line above...

//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(" to ");

    if(colorCode == 'r')
      analogWrite(redPin, colorVal);
    else if(colorCode == 'g')
      analogWrite(greenPin, colorVal);
    else if(colorCode == 'b')
      analogWrite(bluePin, colorVal);

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

MOOD EGG-small.jpg93.23 KB

Powered by Drupal - Design by Artinet