Halloween Lightbox

Using the Dimmer Plug and a Jeenode to create a box of LEDs that blinks when tilted, with a brightness control (and future wireless capability…)

Check the PCA9635 data sheet for programming details.

Took me a bit to figure out how to vary the brightness of each LED individually, and to turn them on in the first place (have to send the right message to each LED bus).

Yeah, it’s a bit dodgy looking. Just needed to whip up a quick box out of foam board, will do a nice laser-cut encased version at some point, time-permitting.

Code for Arduino:


// Dimmer with accelerometer attached to port 4 analog in and
// standard potentiometer attached to port 3.
// 2010-10-30 <evan@openlabworkshops.org> http://opensource.org/licenses/mit-license.php

#include <Ports.h>
#include <RF12.h> // needed to avoid a linker error :(

Port three (3);
Port four (4);
PortI2C myBus (1);

DimmerPlug dimmer (myBus, 0x40);

// variables:
int sensorMin = 1023;        // minimum sensor value
int sensorMax = 0;           // maximum sensor value
int level;
byte frame = 0;

// leds are connected to pins 2 (DIO) and 3 (GND) with a series resistor

void setup() {

 Serial.begin(57600);

 dimmer.setReg(DimmerPlug::MODE1, 0x00);     // normal
 dimmer.setReg(DimmerPlug::MODE2, 0x20);     // blink
 dimmer.setReg(DimmerPlug::GRPPWM, 0x40 );    // duty cycle 25%
 dimmer.setReg(DimmerPlug::GRPFREQ, 3);      // blink 4x per sec
 dimmer.setReg(DimmerPlug::LEDOUT0, 0xFF);   // LED 0 blinks (all 4 - 3 bits on for each)
 dimmer.setReg(DimmerPlug::LEDOUT1, 0x03);   // LED 1 blinks (only the 1st)
 dimmer.setReg(DimmerPlug::LEDOUT2, 0x00);   // LED 2 off
 dimmer.setReg(DimmerPlug::LEDOUT3, 0x00);   // LED 3 off

 dimmer.setReg(DimmerPlug::PWM0, 0xFF);  // initial brightness to full for each individual LED
 dimmer.setReg(DimmerPlug::PWM1, 0xFF);
 dimmer.setReg(DimmerPlug::PWM2, 0xFF);
 dimmer.setReg(DimmerPlug::PWM3, 0xFF);
 dimmer.setReg(DimmerPlug::PWM4, 0xFF);

 three.mode(INPUT);
 four.mode(INPUT);
}

void loop() {

 int val = four.anaRead();
 int val2 = three.anaRead();

 // calibrate during the first five seconds
 if (millis() < 6000) {

 // record the maximum sensor value
 if (val > sensorMax) {
 sensorMax = val;
 }

 // record the minimum sensor value
 if (val < sensorMin) {
 sensorMin = val;
 }
 }

 else
 {
 int sensorValue = map(val, sensorMin, sensorMax, 2, 18);

 //++level;
 ++frame;
 byte frameOdd = frame % 2;  // just add some "spice" to the blinking

 dimmer.setReg(DimmerPlug::PWM0, val2* frameOdd);
 dimmer.setReg(DimmerPlug::PWM1, val2);
 dimmer.setReg(DimmerPlug::PWM2, val2* frameOdd);
 dimmer.setReg(DimmerPlug::PWM3, val2);
 dimmer.setReg(DimmerPlug::PWM4, val2* frameOdd);

//     dimmer.setReg(DimmerPlug::GRPPWM, 0x30 );

 // vary the blink rate with the tilt sensor value (y direction, in this case)
 dimmer.setReg(DimmerPlug::GRPFREQ, sensorValue);

// delay - we don't need to do this all the time, the LED driver does most of the work
 delay(100);

 //Serial.print(sensorMin);
//    Serial.print(":");
//    Serial.print(sensorMax);
//    Serial.print(":");
//    Serial.println(sensorValue);
 }
}