Hey! I'm Jordan!

I made a thing at The Shops Buckhead

It's called 5391 (that's the number of LEDs)

Here's a little about how I made it happen and what I was doing to get here

I went to SCAD Savannah and majored in Motion Graphics but before I graduated I knew that I didn't want to work in the industry

After traveling non-stop for a year, my jewelry business became pretty stable, I had a lot of free time on my hands and my choice was either get another job or do what I've wanted to do for years, make art with code

 
 

 // Project Prep // Project Prep // Project Prep //

I designed the layout for the installation in Processing, and the same sketch is used to control the LEDs as well. The shapes were generated by embedded for loops of trigonometric functions.

5391process lasercutlayout1.jpeg
 

The 99 pieces were constructed of two nearly identical layers of black acrylic and plywood. If you need some CNC work in Atlanta, would highly recommend Collet & Bit!

 

It took about two work-week's worth of time to assemble all the pieces. Each LED has a specific address associated with it, so as I had to insert them in a specific order. Not all the holes were close enough to the next in the sequence, so I ended up having to remap the array to avoid more soldering.

// Installation // Installation // Installation //

 

Long process of projecting the layout on the wall, marking the holes for the bolts, drilling holes for the wires and securing the pieces on the back and connecting the power and data wires

 
IMG_3028.JPG

// Code // Code // Code

I installed a camera in the wall and used Frame Differencing to measure the amount of movement in the video feed. The Frame Differencing Example from the Video Library in Processing on the right was the foundation, then creating different visual results based on thresholds of change in each pixel, the number of pixels changed, and how long that amount of movement is sustained, and how these numbers change based on the amount of daylight.

The video below is an early example of me using this technique to create a mask of the glitch effect in parts of a video.

One thing that I needed to manage was globally changing the brightness of the display depending on the amount of daylight. During the day the LEDs needed to be brighter to be seen, but that same brightness at night would be too much. I wrote a function that smoothly transitioned the overall brightness of the display, taking into account that the time the sun rises and sets changes slightly every day, as well as daylight savings! Feel free to use this if you want.

void setup() {

}

void draw() {
  background(255);
  
  //everything in your sketch goes here!!
  
 fill(0,0,0,mask());
 rect(0,0,width,height);
}

float mask() {
 int darkest=200; //when sky is darkest mask entire display window with fill(0,0,0,200);
 int brightest=50; //when sky is darkest mask entire display window with fill(0,0,0,50); 
 int date=month()*30+day()-30; //approximates date to value 0-360
 
 boolean daylightSavings=false; 
 if (date>70&&date<305) { //daylight savings ends 11/5/17 and starts again 3/11/18
  daylightSavings=true; 
 }
 
 int ds;
 if (daylightSavings) {
   ds=0;
 }
 else {
   ds=-60; //shift back one hour
 }
 
  int time= hour()*60+minute(); //convert time to number 0-1439
 /*
 rough estimate of when sunrise/sunset starts and ends based on
 sunrise and sunset times on solstices and equinoxes
 */
 
 float sr1= 424+66*cos(radians(date+9))+ds; //approximate time sunrise start
 float sr2= 453+66*cos(radians(date+9))+ds; //approximate time sunrise ends

 float ss1= 1182+69*cos(radians(date+9))+ds; //approximate time sunset starts
 float ss2= 1210+70*cos(radians(date+9))+ds; //approximate time sunset ends


 
 if (hour()<12) {
   //map mask value between darkest at start of sunrise and brightest at end of sunrise
return map(max(min(time,sr2),sr1),sr1,sr2,darkest,brightest); 
 }
 else {
   //map mask value between brightest at start of sunset and darkest at end of sunset
return map(max(min(time,ss2),ss1),ss1,ss2,brightest,darkest);
 } 
}

I've used several different methods to control LEDs over the past two years, some have more benefits than others

Arduino Uno

  • https://learn.adafruit.com/adafruit-neopixel-uberguide/overview This webpage is so helpful and has a link to the Adafruit NeoPixel Library to use with Arduino Hardware/Software

  • What I first used, and probably the easiest, definitely the cheapest ($6-10 offbrand at Microcenter)

  • Has enough RAM for about 600 LEDs and they can be connected in one strand (at least 1800 on Arduino Mega)

  • Great for creating a loop of colors and patterns that doesn't need to be connected to another computer, and basic input from sensors (if you can successfully do more though, let me know)

Fadecandy

Teensy with OctoWS2811 Adapter

  • https://www.pjrc.com/teensy/td_libs_OctoWS2811.html

  • Works similar to Fadecandy, but better! What I prefer using if I want to control LEDs with Processing

  • $20 for Teensy 3.2 board (available at Microcenter) and the Adapter is $10 which I'd recommend if you're doing anything large to prevent flickering

  • Send data across 8 strips, but you can make each strip really long! Eight strips of 1108 LEDs (8864 total) refreshes at 30Hz. I used two boards with 400 on each strip

// Be Happy This Shit is Finally Done //