Friday, December 12, 2014

Final Build

The project is finally done!
 Here are some screenshots of the arduino holder that was designed to be 3D printed, unfortunately due to a busy lab it was not able to be printed







 Final result:


A few pictures of the table build process:  
 Before the pane of glass became a one way mirror. The tin film added to the glass creates a half-silvered or one way mirror, which allows the light from the LEDs to bounce back and forth creating the illusion

 We ended up moving the legs from the inside of the table to the outside to aid with stability. 

Overall this project was definitely successful, at least in the sense that it does what we want it to do. Later additions might include the audition of music to play with the lights, or maybe even allow it to control them. 

Monday, December 8, 2014

Photodiode and Code working - Final build next

The LED Code is finally finished! The code is set to display five different patterns across the LED strip depending on the amount of light hitting the sensor.
A Video of it in action:
 In the first few frames of the video a finger is covering the sensor to give the darkest reading. As the lighter is lit and moved closer the arduino cycles through the five patterns. It runs a continuous loop, and prints to the serial monitor so that you may know excactly the light range you are recieving.
Here's the code, the patterns were taken from the FastLED library in the previous post.
 #include "Adafruit_WS2801.h"  
 #include "SPI.h" // Comment out this line if using Trinket or Gemma  
 #ifdef __AVR_ATtiny85__  
  #include <avr/power.h>  
 #endif  
 /*****************************************************************************  
 Example sketch for driving Adafruit WS2801 pixels!  
  Designed specifically to work with the Adafruit RGB Pixels!  
  12mm Bullet shape ----> https://www.adafruit.com/products/322  
  12mm Flat shape  ----> https://www.adafruit.com/products/738  
  36mm Square shape ----> https://www.adafruit.com/products/683  
  These pixels use SPI to transmit the color data, and have built in  
  high speed PWM drivers for 24 bit color per pixel  
  2 pins are required to interface  
  Adafruit invests time and resources providing this open source code,   
  please support Adafruit and open-source hardware by purchasing   
  products from Adafruit!  
  Written by Limor Fried/Ladyada for Adafruit Industries.   
  BSD license, all text above must be included in any redistribution  
 *****************************************************************************/  
 // Choose which 2 pins you will use for output.  
 // Can be any valid output pins.  
 // The colors of the wires may be totally different so  
 // BE SURE TO CHECK YOUR PIXELS TO SEE WHICH WIRES TO USE!  
 uint8_t dataPin = 3;  // Yellow wire on Adafruit Pixels  
 uint8_t clockPin = 13;  // Green wire on Adafruit Pixels  
 // Don't forget to connect the ground wire to Arduino ground,  
 // and the +5V wire to a +5V supply  
 // Set the first variable to the NUMBER of pixels. 25 = 25 pixels in a row  
 Adafruit_WS2801 strip = Adafruit_WS2801(32, dataPin, clockPin);  
 // Optional: leave off pin numbers to use hardware SPI  
 // (pinout is then specific to each board and can't be changed)  
 //Adafruit_WS2801 strip = Adafruit_WS2801(25);  
 // For 36mm LED pixels: these pixels internally represent color in a  
 // different format. Either of the above constructors can accept an  
 // optional extra parameter: WS2801_RGB is 'conventional' RGB order  
 // WS2801_GRB is the GRB order required by the 36mm pixels. Other  
 // than this parameter, your code does not need to do anything different;  
 // the library will handle the format change. Examples:  
 //Adafruit_WS2801 strip = Adafruit_WS2801(25, dataPin, clockPin, WS2801_GRB);  
 //Adafruit_WS2801 strip = Adafruit_WS2801(25, WS2801_GRB);  
 int LDR = 0;  
  int LDRValue = 0;  
 void setup() {  
  Serial.begin(9600);  
 #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000L)  
  clock_prescale_set(clock_div_1); // Enable 16 MHz on Trinket  
 #endif  
  strip.begin();  
  // Update LED contents, to start they are all 'off'  
  strip.show();  
 }  
 void loop() {  
  int LDRValue = analogRead(LDR);  
  int percentOfRange = map(LDRValue,0, 1023, 0, 100);  
  Serial.println(LDRValue);  
  delay(50);  
  // Some example procedures showing how to display to the pixels  
  if(percentOfRange >= 0 && percentOfRange < 20)  
  {  
  colorWipe(Color(2, 132, 130), 30);  
  }  
  if(percentOfRange >= 20 && percentOfRange < 40)  
  {    
  colorWipe(Color(56, 70, 122), 30);  
  }  
  if(percentOfRange >= 40 && percentOfRange < 60)  
 {   
  colorWipe(Color(255, 102, 0), 30);  
  }  
  if(percentOfRange >= 60 && percentOfRange < 80)  
  {  
     rainbow(3);  
  }  
  if(percentOfRange >= 80 && percentOfRange <= 100)  
  {  
  rainbowCycle(3);  
  }  
 }  
 void rainbow(uint8_t wait) {  
  int i, j;  
  for (j=0; j < 256; j++) {   // 3 cycles of all 256 colors in the wheel  
   for (i=0; i < strip.numPixels(); i++) {  
    strip.setPixelColor(i, Wheel( (i + j) % 255));  
   }   
   strip.show();  // write all the pixels out  
   delay(wait);  
  }  
 }  
 // Slightly different, this one makes the rainbow wheel equally distributed   
 // along the chain  
 void rainbowCycle(uint8_t wait) {  
  int i, j;  
  for (j=0; j < 256 * 5; j++) {   // 5 cycles of all 25 colors in the wheel  
   for (i=0; i < strip.numPixels(); i++) {  
    // tricky math! we use each pixel as a fraction of the full 96-color wheel  
    // (thats the i / strip.numPixels() part)  
    // Then add in j which makes the colors go around per pixel  
    // the % 96 is to make the wheel cycle around  
    strip.setPixelColor(i, Wheel( ((i * 256 / strip.numPixels()) + j) % 256) );  
   }   
   strip.show();  // write all the pixels out  
   delay(wait);  
  }  
 }  
 // fill the dots one after the other with said color  
 // good for testing purposes  
 void colorWipe(uint32_t c, uint8_t wait) {  
  int i;  
  for (i=0; i < strip.numPixels(); i++) {  
    strip.setPixelColor(i, c);  
    strip.show();  
    delay(wait);  
  }  
 }  
 /* Helper functions */  
 // Create a 24 bit color value from R,G,B  
 uint32_t Color(byte r, byte g, byte b)  
 {  
  uint32_t c;  
  c = r;  
  c <<= 8;  
  c |= g;  
  c <<= 8;  
  c |= b;  
  return c;  
 }  
 //Input a value 0 to 255 to get a color value.  
 //The colours are a transition r - g -b - back to r  
 uint32_t Wheel(byte WheelPos)  
 {  
  if (WheelPos < 85) {  
   return Color(WheelPos * 3, 255 - WheelPos * 3, 0);  
  } else if (WheelPos < 170) {  
   WheelPos -= 85;  
   return Color(255 - WheelPos * 3, 0, WheelPos * 3);  
  } else {  
   WheelPos -= 170;   
   return Color(0, WheelPos * 3, 255 - WheelPos * 3);  
  }  
 }