
Solaris
Thrifted sculpture and LED tape: an upcycled, atmospheric light that rises and sets like the sun.
- Year
- 2020
- Materials
- Thrifted sculptural mirror, WS2812b LED tape (5V), Pixelblaze microcontroller
Repeating on the techniques used to create Nebula, this piece is a combination of thrifted sculpture and LED tape to create an eye-popping, upcycled, atmospheric lighting experience.
Materials:
- Thrifted sculptural mirror
- WS2812b LED tape (5V)
- Microcontroller (Pixelblaze)
- Battery pack, or wall power transformed to 5V
- USB cable
- JST 3-pin connector cables
The code
Below is a rough draft of the code driving Solaris through the Pixelblaze microcontroller. The effect is meant to mimic the rising and setting of the sun using time-based animation sequences.
//SOLARIS Scheduled Percent-On Demo by @CODYRYANDESIGN
//This example demonstrates one way to use the built-in functions for monitoring time
//to cause gradual time-based changes in your light show
export var _hour
export var _minute
export var _second
//a decimal representation of the current time
export var currentTime
//scheduled start time
export var bTime
//scheduled end time
export var eTime
//use this slider to set the start time for the program
export function sliderBeginTime(begin) {
bTime = floor(24*begin)
}
//use this slider to set the end time for the program
export function sliderEndTime(end) {
eTime = floor(24*end)
}
//how long the program will be on
export var numHoursOn
//how long the program will be off
export var numHoursOff
//the calculated 'on' percentage based off the current position in the schedule
export var percentOn
function calcPercentOn(hr, min, sec, beginTime, numHrsOn) {
//each minute contributes 1/60th of an hour
minFraction = min/60
//each second contributes 1/3600th of an hour
secFraction = sec/3600
//add additional time from current minute and second
currentTime = hr + minFraction + secFraction
//calculate the 'percentage on' based on the current time in the schedule
pOn = (currentTime - beginTime) / numHrsOn
return pOn
}
//rotational speed of the effect
export var speed
export var h
export var s
export var v
// export function sliderHue(hue) {
// h = hue
// }
export var test = .9
export function sliderTest(test) {
t = triangle(test*100)
}
function InputMap(input, in_min, in_max, out_min, out_max)
{
return (input - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
PI10 = PI2*5
PI6 = PI2*3
export function beforeRender(delta) {
//grab current hour
_hour = clockHour()
//grab current minute
_minute = clockMinute()
//grab current second
_second = clockSecond()
numHoursOn = eTime - bTime
if(numHoursOn < 0) {
numHoursOn = 24 + numHoursOn
}
numHoursOff = 24 - numHoursOn
//If within the scheduled on time
if(_hour >= bTime && _hour < eTime) {
//plug all time info into the function to calculate 'percentage on'
percentOn = calcPercentOn(_hour, _minute, _second, bTime, numHoursOn)
//if we are outside the scheduled time of operation, set percentOn to 0
} else {
percentOn = 0
}
t1 = time(.3)*PI10
t2 = time(.05)*PI2
t3 = time(.04)*PI2
}
export function render(index) {
//triangle-map percentOn to a new variable
trianglePercentOn = triangle(percentOn)
h = InputMap(trianglePercentOn, 0.0, 1.0, -0.001, 0.1)
triMap = InputMap(trianglePercentOn, 0.0, 1.0, 10, 12)
//manipulate speed based on a triangle-mapping from percentOn
speed = percentOn <= .5 ? triMap : -1 * triMap
s = 1.5 - trianglePercentOn - sin(index*PI10/pixelCount*speed + t1)
s = s*s*s
b = sin(index*PI6/pixelCount - t2)
c = triangle((index*3/pixelCount + 1 + sin(t3))/2 % 1)
v = (s+b+c)/6
v = v*v
hsv(h - random(.01), s, v*trianglePercentOn)
}










