GlowHood: Difference between revisions
Jump to navigation
Jump to search
(+hex t'waz h3r3) |
(→Code) |
||
Line 11: | Line 11: | ||
== Code == | == Code == | ||
=== Twinkle`Z w/Button Button Hack === | |||
<pre> | |||
#include "FastLED.h" | |||
// How many leds in your strip? | |||
#define NUM_LEDS 72 | |||
#define NUM_TWINK 8 | |||
// Delay between cycles | |||
#define LOOP_DELAY 50 | |||
// Strip Data In (DI) | |||
#define DATA_PIN 11 | |||
#define HOLD_THRESHOLD 200 | |||
#define STANDBY_TIME 5000 | |||
// Define the array of leds | |||
CRGB leds[NUM_LEDS]; | |||
int twinklePos[NUM_TWINK]; | |||
byte twinkleHue[NUM_TWINK]; | |||
byte twinkleVal[NUM_TWINK]; | |||
unsigned long lastTime = 0; | |||
unsigned long holdTime = 0; | |||
boolean standbyMode = false; | |||
void setup() { | |||
pinMode(13, OUTPUT); | |||
Serial.begin(9600); | |||
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); | |||
FastLED.setBrightness(96); | |||
for (int i = 0; i < NUM_TWINK; i++) | |||
{ | |||
twinklePos[i] = 0; | |||
twinkleHue[i] = 0; | |||
twinkleVal[i] = 0; | |||
} | |||
delay(200); | |||
} | |||
void loop() { | |||
// Twinkle`Z | |||
for (int j = 0; j < NUM_TWINK; j++) | |||
{ | |||
if (twinkleVal[j] == 0) | |||
{ | |||
int led = random(0, NUM_LEDS); | |||
twinklePos[j] = led; | |||
twinkleHue[j] = random(0, 255); | |||
twinkleVal[j] = random(32, 255); | |||
} else { | |||
twinkleHue[j] += random(-32, 32); | |||
twinkleVal[j] += random(-32, 8); | |||
if (twinkleVal[j] <= 32) | |||
{ | |||
// Done | |||
twinkleVal[j] = 0; | |||
} | |||
} | |||
} | |||
int button = analogRead(A0); | |||
unsigned long now = millis(); | |||
boolean onOff = button < 96 || button > 927; | |||
if (onOff) | |||
lastTime = now; | |||
if (now - holdTime > STANDBY_TIME) | |||
{ | |||
// Change mode | |||
if (!standbyMode) | |||
{ | |||
for (int l = 0; l < NUM_LEDS; l++) | |||
{ | |||
leds[l] = CHSV(0, 0, 0); | |||
FastLED.show(); | |||
} | |||
} | |||
standbyMode = !standbyMode; | |||
holdTime = now; | |||
} | |||
if (onOff != digitalRead(13) == HIGH) | |||
{ | |||
if (onOff) | |||
{ | |||
holdTime = now; | |||
digitalWrite(13, HIGH); | |||
} | |||
else if (now - lastTime > HOLD_THRESHOLD) | |||
{ | |||
digitalWrite(13, LOW); | |||
} | |||
} | |||
for (int i = 0; i < NUM_TWINK; i++) | |||
{ | |||
leds[twinklePos[i]] = CHSV(twinkleHue[i], onOff ? 0 : 255, twinkleVal[i]); | |||
} | |||
if (!standbyMode) | |||
FastLED.show(); | |||
Serial.println(String(button)); | |||
if (digitalRead(13) == HIGH) | |||
{ | |||
delay(LOOP_DELAY / 5); | |||
} else { | |||
holdTime = now; | |||
delay(LOOP_DELAY); | |||
} | |||
// Serial.println(String(standbyMode) + ", " + String(onOff) + ", " + String(now - holdTime)); | |||
} | |||
</pre> | |||
=== Multi-mode demo with Serial === | |||
<pre> | <pre> | ||
/* | /* |
Revision as of 23:35, 6 October 2014
Software
Blinkadelic fabrikz
Hardware
WS2812B's (144/m)
Code
Twinkle`Z w/Button Button Hack
#include "FastLED.h" // How many leds in your strip? #define NUM_LEDS 72 #define NUM_TWINK 8 // Delay between cycles #define LOOP_DELAY 50 // Strip Data In (DI) #define DATA_PIN 11 #define HOLD_THRESHOLD 200 #define STANDBY_TIME 5000 // Define the array of leds CRGB leds[NUM_LEDS]; int twinklePos[NUM_TWINK]; byte twinkleHue[NUM_TWINK]; byte twinkleVal[NUM_TWINK]; unsigned long lastTime = 0; unsigned long holdTime = 0; boolean standbyMode = false; void setup() { pinMode(13, OUTPUT); Serial.begin(9600); FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); FastLED.setBrightness(96); for (int i = 0; i < NUM_TWINK; i++) { twinklePos[i] = 0; twinkleHue[i] = 0; twinkleVal[i] = 0; } delay(200); } void loop() { // Twinkle`Z for (int j = 0; j < NUM_TWINK; j++) { if (twinkleVal[j] == 0) { int led = random(0, NUM_LEDS); twinklePos[j] = led; twinkleHue[j] = random(0, 255); twinkleVal[j] = random(32, 255); } else { twinkleHue[j] += random(-32, 32); twinkleVal[j] += random(-32, 8); if (twinkleVal[j] <= 32) { // Done twinkleVal[j] = 0; } } } int button = analogRead(A0); unsigned long now = millis(); boolean onOff = button < 96 || button > 927; if (onOff) lastTime = now; if (now - holdTime > STANDBY_TIME) { // Change mode if (!standbyMode) { for (int l = 0; l < NUM_LEDS; l++) { leds[l] = CHSV(0, 0, 0); FastLED.show(); } } standbyMode = !standbyMode; holdTime = now; } if (onOff != digitalRead(13) == HIGH) { if (onOff) { holdTime = now; digitalWrite(13, HIGH); } else if (now - lastTime > HOLD_THRESHOLD) { digitalWrite(13, LOW); } } for (int i = 0; i < NUM_TWINK; i++) { leds[twinklePos[i]] = CHSV(twinkleHue[i], onOff ? 0 : 255, twinkleVal[i]); } if (!standbyMode) FastLED.show(); Serial.println(String(button)); if (digitalRead(13) == HIGH) { delay(LOOP_DELAY / 5); } else { holdTime = now; delay(LOOP_DELAY); } // Serial.println(String(standbyMode) + ", " + String(onOff) + ", " + String(now - holdTime)); }
Multi-mode demo with Serial
/* * Serial control interface for LED Strip * * Updated: 20140921 * * Command Summary: * MODE0 == Auto (Rainbeau) * MODE1 == Off * MODE2 == Remote (PC Control) * HH..H == Sequence of Hue values to apply to LEDs * Note: Set "MODE2" before sending hues * S == Set saturation * MODE3 == Center Peak Rainbeau * MODE4 == Center Peak Pastel */ #include "FastLED.h" // How many leds in your strip? #define NUM_LEDS 72 // Spacing between pixel/color #define HSV_PAD 4 // Delay between cycles #define LOOP_DELAY 50 // Strip Data In (DI) #define DATA_PIN 11 // Define the array of leds CRGB leds[NUM_LEDS]; float counter = 0; byte count = 0; byte mode = 4; byte hues[NUM_LEDS]; byte sat = 255; // Saturation 0-255 String inputString = ""; void setup() { pinMode(13, OUTPUT); for (int i = 0; i < NUM_LEDS; i++) { hues[i] = 0; } FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS); // Max brightness 0-255 (64 ~< 100ma for 12 LEDs) FastLED.setBrightness(64); Serial.begin(9600); Serial.setTimeout(50); delay(200); } void loop() { int i; int v; float p; if (mode == 0) { // Rainbeau for (i = 0; i < NUM_LEDS; i++) { leds[i] = CHSV(count + (i * HSV_PAD), sat, 255); } FastLED.show(); count++; delay(LOOP_DELAY); } else if (mode == 1) { // Off for (i = 0; i < NUM_LEDS; i++) { leds[i] = CRGB(0, 0, 0); } FastLED.show(); delay(LOOP_DELAY); } else if (mode == 2) { // Remote +hex } else if (mode == 3) { // Rainbeau for (i = 0; i < NUM_LEDS; i++) { // variable position dimming // Set 'p' to 0.0 - 1.0 so the ends are 0.0 and the center is 1.0 p = (((NUM_LEDS / 2) - abs(i - (NUM_LEDS / 2.0)))) / (NUM_LEDS / 2.0); v = min(255, round(p * 255.0) + 64); // sin function added for oscillating color change counter += 0.000001337; count = sin(counter * 3.14 * 180) * 255 + (i * HSV_PAD); leds[i] = CHSV(count, sat, v);// - (v/1.5), v); } FastLED.show(); count++; delay(LOOP_DELAY); } else if (mode == 4) { // Rainbeau for (i = 0; i < NUM_LEDS; i++) { // variable position dimming // Set 'p' to 0.0 - 1.0 so the ends are 0.0 and the center is 1.0 p = (((NUM_LEDS / 2) - abs(i - (NUM_LEDS / 2.0)))) / (NUM_LEDS / 2.0); v = min(255, round(p * 255.0) + 64); // sin function added for oscillating color change counter += 0.000001337; count = sin(counter * 3.14 * 180) * 255 + (i * HSV_PAD); leds[i] = CHSV(count, sat - (v/1.5), v); } FastLED.show(); count++; delay(LOOP_DELAY); } } void updateHues() { for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CHSV(hues[i], 255, 255); } FastLED.show(); // Toggle onboard LED digitalWrite(13, !digitalRead(13)); } void serialEvent() { byte byteCount = 0; byte data; inputString = ""; while(Serial.available()) { data = Serial.read(); inputString += (char)data; if (byteCount < NUM_LEDS) { hues[byteCount++] = byte(data + 90); } // Catch pending bits if (!Serial.available()) delay(20); } if (inputString == "MODE0") { mode = 0; } else if (inputString == "MODE1") { mode = 1; } else if (inputString == "MODE2") { mode = 2; } else if (inputString == "MODE3") { mode = 3; } else if (inputString == "MODE4") { mode = 4; } else if (inputString.length() == NUM_LEDS) { updateHues(); } else if (inputString.length() == 1) { sat = data; } }