I've built an accelerometer based dice. It changes colour based on what side of the dice faces up. All is well and good, except I'd like the RGB to fade from one colour to the next instead of changes instantly.
Here's the code:
include <Wire.h>
include <Adafruit_Sensor.h>
include <Adafruit_LSM303_U.h>
include <Adafruit_9DOF.h>
include <Adafruit_L3GD20_U.h>
/* Assign a unique ID to the sensors */
Adafruit_9DOF dof = Adafruit_9DOF();
Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(30301);
Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(30302);
// OUTPUT: Use digital pins 9-11, the Pulse-width Modulation (PWM) pins
// LED's cathodes should be connected to digital GND
int redLEDPin = 11; // Red LED, connected to digital pin 9
int greenLEDPin = 10; // Green LED, connected to digital pin 10
int blueLEDPin = 9; // Blue LED, connected to digital pin 11
// Program variables
int red = 255; // Variables to store the values to send to the pins
int green = 255;
int blue = 255;
int lastOrientation = -1; // previous orientation
void initSensors()
{
if(!accel.begin())
{
Serial.println(F("No LSM303 detected"));
while(1);
}
if(!mag.begin())
{
Serial.println("No LSM303 detected");
while(1);
}
}
void setup() {
Serial.begin(115200);
Serial.println(F("RGB Dice... go!")); Serial.println("");
/* Initialise the sensors */
initSensors();
pinMode(redLEDPin, OUTPUT); // sets the pins as output
pinMode(greenLEDPin, OUTPUT);
pinMode(blueLEDPin, OUTPUT);
int lastOrientation = -1; // previous orientation
}
void loop() {
/* Get a new sensor event */
sensors_event_t event;
accel.getEvent(&event);
int orientation = - 1; // dice orientation
String orientationString; // string for printing orientation
/*
* orientation:
* 1: cyan
* 2: blue
* 3: green
* 4: magenta
* 5: yellow
* 6: red
*/
// read accelerometer
int x = event.acceleration.x;
int y = event.acceleration.y;
int z = event.acceleration.z;
// calculate absolute values, and determin largest
int absX = abs(x);
int absY = abs(y);
int absZ = abs(z);
if ( (absZ > absX) && (absZ > absY)) {
//base orientation Z
if (z > 0) {
orientationString = "1, cyan";
orientation = 1;
red = 255;
green = 0;
blue = 0;
} else {
orientationString = "6, red";
orientation = 6;
red = 0;
green = 255;
blue = 255;
}
} else if ( (absY > absX) && (absY > absZ)) {
//base orientation Y
if (y > 0) {
orientationString = "2, blue";
orientation = 2;
red = 255;
green = 255;
blue = 0;
} else {
orientationString = "5, yellow";
orientation = 5;
red = 0;
green = 0;
blue = 255;
}
} else {
//base orientation X
if (x > 0) {
orientationString = "4, magenta";
orientation = 4;
red = 0;
green = 255;
blue = 0;
} else {
orientationString = "3, green";
orientation = 3;
red = 255;
green = 0;
blue = 255;
}
}
// if orientation changes, print out a description
if (orientation != lastOrientation) {
Serial.println(orientationString);
lastOrientation = orientation;
}
analogWrite(redLEDPin, red); // Write values to LED pins
analogWrite(greenLEDPin, green);
analogWrite(blueLEDPin, blue);
delay(100);
}
Every fading example I have adopted has broken the code so far. I guess my initial code isn't set up for it. Any ideas for a workaround?