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);
}
}