Created
October 19, 2016 19:37
-
-
Save alan707/2abd4d09d667e74d8370d3e2674b62ff to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* This is a RGB+W NeoPixel example, see extra-examples.cpp for a version | |
* with more explantory documentation, example routines, how to | |
* hook up your pixels and all of the pixel types that are supported. | |
* | |
*/ | |
/* ======================= includes ================================= */ | |
#include "application.h" | |
#include "neopixel/neopixel.h" // use for Build IDE | |
// #include "neopixel.h" // use for local build | |
/* ======================= variables =============================== */ | |
uint32_t Wheel(byte WheelPos); | |
uint8_t red(uint32_t c); | |
uint8_t green(uint32_t c); | |
uint8_t blue(uint32_t c); | |
void colorWipe(uint32_t c, uint8_t wait); | |
void pulseWhite(uint8_t wait); | |
void rainbowFade2White(uint8_t wait, int rainbowLoops, int whiteLoops); | |
void whiteOverRainbow(uint8_t wait, uint8_t whiteSpeed, uint8_t whiteLength); | |
void fullWhite(); | |
void rainbowCycle(uint8_t wait); | |
void rainbow(uint8_t wait); | |
// EXAMPLE USAGE | |
int button = D1; // button is connected to D1 | |
int button_LED = D0; // LED is connected to D0 | |
int state = LOW; // the current state of the output pin | |
int reading; // the current reading from the input pin | |
int previous = LOW; // the previous reading from the input pin | |
int neopixelState = LOW; | |
// the following variables are long's because the time, measured in miliseconds, | |
// will quickly become a bigger number than can be stored in an int. | |
long my_time = 0; // the last time the output pin was toggled | |
long debounce = 200; // the debounce time, increase if the output flickers | |
/* ======================= rgbw-strandtest.cpp ====================== */ | |
SYSTEM_MODE(AUTOMATIC); | |
// IMPORTANT: Set pixel COUNT, PIN and TYPE | |
#define PIXEL_PIN D2 | |
#define PIXEL_COUNT 16 | |
#define PIXEL_TYPE SK6812RGBW | |
#define BRIGHTNESS 255 // 0 - 255 | |
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE); | |
int gamma[] = { | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, | |
2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, | |
5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, | |
10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, | |
17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, | |
25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, | |
37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, | |
51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, | |
69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, | |
90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114, | |
115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142, | |
144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175, | |
177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213, | |
215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 }; | |
void setup() { | |
strip.setBrightness(BRIGHTNESS); | |
strip.begin(); | |
strip.show(); // Initialize all pixels to 'off' | |
} | |
void loop() { | |
// Some example procedures showing how to display to the pixels: | |
// Do not run more than 15 seconds of these, or the b/g tasks | |
// will be blocked. | |
// -------------------------------------------------------------- | |
// colorWipe(strip.Color(255, 0, 0), 50); // Red | |
// colorWipe(strip.Color(0, 255, 0), 50); // Green | |
// colorWipe(strip.Color(0, 0, 255), 50); // Blue | |
// colorWipe(strip.Color(0, 0, 0, 255), 50); // White | |
// whiteOverRainbow(20,75,5); | |
reading = digitalRead(button); | |
// if the input just went from LOW and HIGH and we've waited long enough | |
// to ignore any noise on the circuit, toggle the output pin and remember | |
// the time | |
if (reading == HIGH && previous == LOW && millis() - my_time > debounce) { | |
if (state == HIGH) | |
state = LOW; | |
fullWhite()++; | |
else | |
state = HIGH; | |
my_time = millis(); | |
} | |
digitalWrite(button_LED, state); | |
if (state == HIGH) { | |
neopixelState = LOW; | |
else | |
neopixelState = HIGH; | |
} | |
previous = reading; | |
} | |
// fullWhite(); | |
// rainbowFade2White(3,3,1); | |
// Input a value 0 to 255 to get a color value. | |
// The colours are a transition r - g - b - back to r. | |
uint32_t Wheel(byte WheelPos) { | |
WheelPos = 255 - WheelPos; | |
if(WheelPos < 85) { | |
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3,0); | |
} | |
if(WheelPos < 170) { | |
WheelPos -= 85; | |
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3,0); | |
} | |
WheelPos -= 170; | |
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0); | |
} | |
uint8_t red(uint32_t c) { | |
return (c >> 8); | |
} | |
uint8_t green(uint32_t c) { | |
return (c >> 16); | |
} | |
uint8_t blue(uint32_t c) { | |
return (c); | |
} | |
// Fill the dots one after the other with a color | |
void colorWipe(uint32_t c, uint8_t wait) { | |
for(uint16_t i=0; i<strip.numPixels(); i++) { | |
strip.setPixelColor(i, c); | |
strip.show(); | |
delay(wait); | |
} | |
} | |
void pulseWhite(uint8_t wait) { | |
for(int j = 0; j < 256 ; j++) { | |
for(uint16_t i=0; i<strip.numPixels(); i++) { | |
strip.setPixelColor(i, strip.Color(0,0,0, gamma[j] ) ); | |
} | |
delay(wait); | |
strip.show(); | |
} | |
for(int j = 255; j >= 0 ; j--){ | |
for(uint16_t i=0; i<strip.numPixels(); i++) { | |
strip.setPixelColor(i, strip.Color(0,0,0, gamma[j] ) ); | |
} | |
delay(wait); | |
strip.show(); | |
} | |
} | |
void rainbowFade2White(uint8_t wait, int rainbowLoops, int whiteLoops) { | |
float fadeMax = 100.0; | |
int fadeVal = 0; | |
uint32_t wheelVal; | |
int redVal, greenVal, blueVal; | |
for(int k = 0 ; k < rainbowLoops ; k ++) { | |
for(int j=0; j<256; j++) { // 5 cycles of all colors on wheel | |
for(int i=0; i< strip.numPixels(); i++) { | |
wheelVal = Wheel(((i * 256 / strip.numPixels()) + j) & 255); | |
redVal = red(wheelVal) * float(fadeVal/fadeMax); | |
greenVal = green(wheelVal) * float(fadeVal/fadeMax); | |
blueVal = blue(wheelVal) * float(fadeVal/fadeMax); | |
strip.setPixelColor( i, strip.Color( redVal, greenVal, blueVal ) ); | |
} | |
// First loop, fade in! | |
if(k == 0 && fadeVal < fadeMax-1) { | |
fadeVal++; | |
} | |
// Last loop, fade out! | |
else if(k == rainbowLoops - 1 && j > 255 - fadeMax ) { | |
fadeVal--; | |
} | |
strip.show(); | |
delay(wait); | |
} | |
} | |
delay(500); | |
for(int k = 0 ; k < whiteLoops ; k ++) { | |
for(int j = 0; j < 256 ; j++) { | |
for(uint16_t i=0; i < strip.numPixels(); i++) { | |
strip.setPixelColor(i, strip.Color(0,0,0, gamma[j] ) ); | |
} | |
strip.show(); | |
} | |
delay(2000); | |
for(int j = 255; j >= 0 ; j--) { | |
for(uint16_t i=0; i < strip.numPixels(); i++) { | |
strip.setPixelColor(i, strip.Color(0,0,0, gamma[j] ) ); | |
} | |
strip.show(); | |
} | |
} | |
delay(500); | |
} | |
void whiteOverRainbow(uint8_t wait, uint8_t whiteSpeed, uint8_t whiteLength ) { | |
if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1; | |
int head = whiteLength - 1; | |
int tail = 0; | |
int loops = 3; | |
int loopNum = 0; | |
static unsigned long lastTime = 0; | |
while(true) { | |
for(int j=0; j<256; j++) { | |
for(uint16_t i=0; i<strip.numPixels(); i++) { | |
if( (i >= tail && i <= head) | |
|| (tail > head && i >= tail) | |
|| (tail > head && i <= head) ) { | |
strip.setPixelColor(i, strip.Color(0,0,0, 255 ) ); | |
} else { | |
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); | |
} | |
} | |
if(millis() - lastTime > whiteSpeed) { | |
head++; | |
tail++; | |
if(head == strip.numPixels()) { | |
loopNum++; | |
} | |
lastTime = millis(); | |
} | |
if(loopNum == loops) return; | |
head %= strip.numPixels(); | |
tail %= strip.numPixels(); | |
strip.show(); | |
delay(wait); | |
} | |
} | |
} | |
void fullWhite() { | |
for(uint16_t i=0; i<strip.numPixels(); i++) { | |
strip.setPixelColor(i, strip.Color(0,0,0, 255 ) ); | |
} | |
strip.show(); | |
} | |
void fullOff() { | |
for(uint16_t i=0; i<strip.numPixels(); i++) { | |
strip.setPixelColor(i, strip.Color(0,0,0, 0) ); | |
} | |
strip.show(); | |
} | |
// Slightly different, this makes the rainbow equally distributed throughout | |
void rainbowCycle(uint8_t wait) { | |
uint16_t i, j; | |
for(j=0; j<256 * 5; j++) { // 5 cycles of all colors on wheel | |
for(i=0; i< strip.numPixels(); i++) { | |
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); | |
} | |
strip.show(); | |
delay(wait); | |
} | |
} | |
void rainbow(uint8_t wait) { | |
uint16_t i, j; | |
for(j=0; j<256; j++) { | |
for(i=0; i<strip.numPixels(); i++) { | |
strip.setPixelColor(i, Wheel((i+j) & 255)); | |
} | |
strip.show(); | |
delay(wait); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment