Prototyping
Use alligator clips to test the circuit before soldering the components. Lets start with getting the accelerometer to light up the neopixel ring. We can use USB to power the FLORA after we have our components clipped together.Accelerometer
-
GND to GND
- SCL to SCL
- 3V to 3.3V
- SDA to SDA
NeoPixel Ring
- IN to D10
- GND to GND
- Vcc to VBATT
Arduino Sketch
Copy the code below into your Adafruit Arduino IDE and click Upload. The colors can be specified in the myFavoriteColors array, and the sensitivity to motion can be defined with MOVE_THRESHOLD.#include <Wire.h> #include <Adafruit_LSM303.h> #include <Adafruit_NeoPixel.h> // Parameter 1 = number of pixels in strip // Parameter 2 = pin number (most are valid) // Parameter 3 = pixel type flags, add together as needed: // NEO_RGB Pixels are wired for RGB bitstream // NEO_GRB Pixels are wired for GRB bitstream // NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels) // NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip) Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, 10, NEO_GRB + NEO_KHZ800); Adafruit_LSM303 lsm; // Here is where you can put in your favorite colors that will appear! // just add new {nnn, nnn, nnn}, lines. They will be picked out randomly // R G B uint8_t myFavoriteColors[][3] = {{200, 0, 200}, // purple {0, 117, 255}, // blue {200, 200, 200}, // white }; // don't edit the line below #define FAVCOLORS sizeof(myFavoriteColors) / 3 // mess with this number to adjust TWINklitude :) // lower number = more sensitive #define MOVE_THRESHOLD 300 void setup() { Serial.begin(9600); // Try to initialise and warn if we couldn't detect the chip if (!lsm.begin()) { Serial.println("Oops ... unable to initialize the LSM303. Check your wiring!"); while (1); } strip.begin(); strip.show(); // Initialize all pixels to 'off' } void loop() { // Take a reading of accellerometer data lsm.read(); Serial.print("Accel X: "); Serial.print(lsm.accelData.x); Serial.print(" "); Serial.print("Y: "); Serial.print(lsm.accelData.y); Serial.print(" "); Serial.print("Z: "); Serial.print(lsm.accelData.z); Serial.print(" "); // Get the magnitude (length) of the 3 axis vector // http://en.wikipedia.org/wiki/Euclidean_vector#Length double storedVector = lsm.accelData.x*lsm.accelData.x; storedVector += lsm.accelData.y*lsm.accelData.y; storedVector += lsm.accelData.z*lsm.accelData.z; storedVector = sqrt(storedVector); Serial.print("Len: "); Serial.println(storedVector); // wait a bit delay(100); // get new data! lsm.read(); double newVector = lsm.accelData.x*lsm.accelData.x; newVector += lsm.accelData.y*lsm.accelData.y; newVector += lsm.accelData.z*lsm.accelData.z; newVector = sqrt(newVector); Serial.print("New Len: "); Serial.println(newVector); // are we moving if (abs(newVector - storedVector) > MOVE_THRESHOLD) { Serial.println("Twinkle!"); flashRandom(5, 1); // first number is 'wait' delay, shorter num == shorter twinkle flashRandom(5, 3); // second number is how many neopixels to simultaneously light up flashRandom(5, 2); } } void flashRandom(int wait, uint8_t howmany) { for(uint16_t i=0; i<howmany; i++) { // pick a random favorite color! int c = random(FAVCOLORS); int red = myFavoriteColors[c][0]; int green = myFavoriteColors[c][1]; int blue = myFavoriteColors[c][2]; // get a random pixel from the list int j = random(strip.numPixels()); //Serial.print("Lighting up "); Serial.println(j); // now we will 'fade' it in 5 steps for (int x=0; x < 5; x++) { int r = red * (x+1); r /= 5; int g = green * (x+1); g /= 5; int b = blue * (x+1); b /= 5; strip.setPixelColor(j, strip.Color(r, g, b)); strip.show(); delay(wait); } // & fade out in 5 steps for (int x=5; x >= 0; x--) { int r = red * x; r /= 5; int g = green * x; g /= 5; int b = blue * x; b /= 5; strip.setPixelColor(j, strip.Color(r, g, b)); strip.show(); delay(wait); } } // LEDs will be off when done (they are faded to 0) }
Page last edited January 06, 2014
Text editor powered by tinymce.