NeoPixel Button

/*
Created by chris@drumminhands.com
Modified by combining these tutorials
Blink without Delay http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
State change detection (edge detection) http://arduino.cc/en/Tutorial/ButtonStateChange
Adafruit Strandtest https://github.com/adafruit/Adafruit_NeoPixel
Debounce http://www.arduino.cc/en/Tutorial/Debounce
Cyclon eyes https://github.com/EternalCore/NeoPixel_Cylon_Scrolling_Eye
*/
#include

// constants won’t change.
#define buttonPin 2 // the number of the pushbutton pin
#define neoPixelPin 0 //the number of the neopixel pin
#define numPixelsInStrip 12
Adafruit_NeoPixel strip = Adafruit_NeoPixel(numPixelsInStrip, neoPixelPin, NEO_GRB + NEO_KHZ800);

///////////////////////////////////////////////////////////////////////////
// Change the following variables to play with different outcomes //
//
int defaultBrightness = 64; // the max brightness, between 0 and 256 //
//
// Do not change anything outside of this comment box, //
// unless you know what it does. //
///////////////////////////////////////////////////////////////////////////

// Variables used in programs

int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers
int programState = 0; // current program seleted — buttonpresses rotate between programs
int numOfPrograms = 7; // how many programs are there total, not including the off state
int ledState = HIGH; // the current state of the output pin
long previousMillis = 0; // will store last time LED was updated
int neoPixelToChange = 0; //track which neoPixel to change
int neoPixel_j = 0; //stores values for program cycles
//cylon variables
int fadeDirection = -1;//change sign to fade up or down
boolean cylonDirection = true; //keeps track of the direction the pixels should swipe
boolean cylonPause = false; //keeps track of the pause inbetween swipes
long delayMillis = 0; // will store the last time the cylon swipe was paused

// Setup is a program run once at the beginning to get things in place
void setup() {
pinMode(buttonPin, INPUT);
strip.begin(); // prep the NeoPixels
strip.show(); // Initialize all pixels to ‘off’
strip.setBrightness(defaultBrightness); // initialize brightness
}

// Loop is the program that runs repeatedly after Setup. Look for the programs below to change.
void loop() {

// read the state of the switch into a local variable:
int reading = digitalRead(buttonPin);

// check to see if you just pressed the button

// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}

if ((millis() – lastDebounceTime) > debounceDelay) {

// if the button state has changed:
if (reading != buttonState) {
buttonState = reading;

// only toggle the LED if the new button state is HIGH
if (buttonState == HIGH) {
//change the program
programState = (programState + 1) % (numOfPrograms + 1); //include numOfPrograms + 1, since there is an off state
}
}
}

// save the reading. Next time through the loop
lastButtonState = reading;

//////////////////////////////////////////////////////////////////////////////
// Change the program states to cycle when the button is pressed. //
// Try changing the colors and duration. //
// NOTE if you change the number of programs in the switch statement above, //
// be sure to change the variable numOfPrograms at the top. //
//////////////////////////////////////////////////////////////////////////////
//run the chosen program
switch (programState) {
case 0:
allColor(strip.Color(0,0,0)); // turn all lights off
break;
case 1:
blinkColor(strip.Color(255,0,0),100); // blink red every 100
break;
case 2:
colorWipeCycle(strip.Color(0,255,0),500); // wipe green every 500
break;
case 3:
softBlink(strip.Color(0,0,255),defaultBrightness, 50); // soft blink blue every 50
break;
case 4:
strip.setBrightness(defaultBrightness); // initialize brightness
rainbow(20); //all rainbow with a 20 wait setting
break;
case 5:
rainbowCycle(20); //all rainbow, but slightly different–try it to see
break;
case 6:
cylonEye(40, 500); //cylon eye, but not sure if the pause is working
break;
default:
// if nothing else matches, do the default
allColor(strip.Color(0,0,0)); //turn all off
}
}
//////////////////////////////////////////////////////////////////////
// Stop changing program states. Below are the programs themselves. //
//////////////////////////////////////////////////////////////////////

// Fill all the dots with one color
void allColor(uint32_t c) {
for(uint16_t i=0; i wait) {
// save the last time you blinked the LED
previousMillis = currentMillis;

// if the LED is off turn it on and vice-versa:
if (ledState == LOW){
ledState = HIGH;
allColor(c);
} else {
ledState = LOW;
allColor(strip.Color(0,0,0)); // off
}
}
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {

unsigned long currentMillis = millis();

//only do this if some of the pixels still need to be lit
if (neoPixelToChange <= strip.numPixels()){ if(currentMillis - previousMillis > wait) {

// save the last time you changed a NeoPixel
previousMillis = currentMillis;

//change a pixel
strip.setPixelColor(neoPixelToChange, c);
strip.show();
neoPixelToChange++;
}
}
}

// Fill the dots one after the other with a color
void colorWipeCycle(uint32_t c, uint8_t wait) {

unsigned long currentMillis = millis();

//only do this if some of the pixels still need to be lit
if (neoPixelToChange <= strip.numPixels()){ if(currentMillis - previousMillis > wait) {

// save the last time you changed a NeoPixel
previousMillis = currentMillis;

//change a pixel
strip.setPixelColor(neoPixelToChange, c);
strip.show();
neoPixelToChange++;

}

} else {
// reset the cycle
previousMillis = 0;
neoPixelToChange = 0;
allColor(strip.Color(0,0,0));
}
}

void rainbow(uint8_t wait) {

unsigned long currentMillis = millis();

if(currentMillis – previousMillis > wait) {

// save the last time you changed a NeoPixel
previousMillis = currentMillis;

//change the colors of the pixels
uint16_t i;

for(i=0; i wait) {

// save the last time you changed a NeoPixel
previousMillis = currentMillis;

//change the colors of the pixels
uint16_t i;

for(i=0; i wait) {

//set the color of all pixels
allColor(c); // is there a way to set this only once per program ????????????????????

// save the last time you changed a NeoPixel
previousMillis = currentMillis;

uint16_t i;
int b = (neoPixel_j * brightness) / brightness;
strip.setBrightness(b);
strip.show();
// sometime figure out how to get this to fade down too instead of just restarting //////////////////////
neoPixel_j = (neoPixel_j + 1) % brightness;
}
}

// 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) {
if(WheelPos < 85) { return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } else if(WheelPos < 170) { WheelPos -= 85; return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } else { WheelPos -= 170; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } } void cylonEye(uint8_t swipeSpeed, uint8_t pauseTime) { if (cylonPause) { //we are on a pause break from swipes unsigned long currentPauseMillis = millis(); //check to see if we've waited long enough if ((currentPauseMillis - delayMillis) > pauseTime) { /////////////////////////////// this is not getting called. Why????????????????
// save the last time you checked the pause
delayMillis = currentPauseMillis;
cylonPause = false; //end the pause
}

} else {

//if needed, change directions
if (neoPixelToChange > numPixelsInStrip) {
cylonDirection = false;
}
if (neoPixelToChange < 0) { cylonDirection = true; cylonPause = true; //take a break from the swipe //turn all pixels off for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, strip.Color(0, 0, 0)); } strip.show(); delayMillis = millis(); } //run the swipe if (cylonDirection) { cylonUp(strip.Color(255, 0, 0), strip.Color(72, 0, 0), swipeSpeed); // red } else { cylonDown(strip.Color(255, 0, 0), strip.Color(72, 0, 0), swipeSpeed); // red } } } void cylonUp(uint32_t c0, uint32_t c1, uint8_t wait) { unsigned long currentMillis = millis(); //neoPixelToChange * wait if (currentMillis - previousMillis > wait) {

//turn all pixels off
for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, strip.Color(0, 0, 0)); } // save the last time you changed a NeoPixel previousMillis = currentMillis; //change a pixel strip.setPixelColor(neoPixelToChange, c0); //primary color strip.setPixelColor(neoPixelToChange - 1, c1); //secondary color strip.setPixelColor(neoPixelToChange + 1, c1); //secondary color strip.show(); neoPixelToChange++; } } void cylonDown(uint32_t c0, uint32_t c1, uint8_t wait) { unsigned long currentMillis = millis(); //neoPixelToChange * wait if (currentMillis - previousMillis > wait) {

//turn all pixels off
for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, strip.Color(0, 0, 0)); } // save the last time you changed a NeoPixel previousMillis = currentMillis; //change a pixel strip.setPixelColor(neoPixelToChange, c0); //primary color strip.setPixelColor(neoPixelToChange - 1, c1); //secondary color strip.setPixelColor(neoPixelToChange + 1, c1); //secondary color strip.show(); neoPixelToChange--; //is there any way to combine this with cylonUp, since this is the only line that is different? } }