Sorry about the late response, I was away in the trinity alps. It was a fantastic time.
The pixel.setPixelColor stores data for a specific LED and its color value. When pixel.show() is called it sends all of the data to the LEDs. These calls do not take up much time at all.
I was able to get the button to work at any point with all of your help. I am polling in the crossfade function which has a for loop. I also poll after any pixel.setPixelColor in the main loop but I think its not necessary.
#include <Adafruit_NeoPixel.h>
#define PIN 2
int buttonPin = 9;
volatile int state = HIGH;
int buttonChange = 1;
int prevButtonChange = 1;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(6, PIN, NEO_GRB + NEO_KHZ800);
int black[3] = { 0, 0, 0 };
int white[3] = { 0, 0, 0 };
int red[3] = { 100, 0, 0 };
int redGreen[3] = { 0, 0, 100 };
int redBlue[3] = { 0, 100, 0 };
int green[3] = { 100, 0, 100 };
int greenBlue[3] ={ 100, 0, 0};
int blue[3] = { 0, 0, 100 };
int yellow[3] = { 60, 5, 100 };
int dimWhite[3] = { 70, 70, 70 };
int redVal = black[0];
int grnVal = black[1];
int bluVal = black[2];
int redVal2 = black[0];
int grnVal2 = black[1];
int bluVal2 = black[2];
int wait = 2;
int hold = 0;
int DEBUG = 1;
int loopCount = 60;
int repeat = 0;
int j = 0;
int prevR = redVal;
int prevG = grnVal;
int prevB = bluVal;
int prevR2 = redVal2;
int prevG2 = grnVal2;
int prevB2 = bluVal2;
void setup()
{
pinMode(buttonPin,INPUT);
attachInterrupt(buttonPin, push1, CHANGE);
pixels.begin();
pixels.show();
if (DEBUG) {
Serial.begin(9600);
}
}
void loop()
{
prevButtonChange = buttonChange;
while (buttonChange == 1){
crossFade(0,2,4,4,4,4,red,1,3,5,5,5,5,blue);
crossFade(0,2,4,4,4,4,blue,1,3,5,5,5,5,red);
pixels.setPixelColor(0, pixels.Color(0,0,255));
if (buttonChange != prevButtonChange){
break;}
pixels.setPixelColor(2, pixels.Color(0,0,255));
if (buttonChange != prevButtonChange){
break;}
pixels.setPixelColor(4, pixels.Color(0,0,255));
if (buttonChange != prevButtonChange){
break;}
crossFade(0,2,4,4,4,4,blue,1,3,5,5,5,5,blue);
pixels.setPixelColor(1, pixels.Color(0,0,255));
if (buttonChange != prevButtonChange){
break;}
pixels.setPixelColor(3, pixels.Color(0,0,255));
if (buttonChange != prevButtonChange){
break;}
pixels.setPixelColor(5, pixels.Color(0,0,255));
if (buttonChange != prevButtonChange){
break;}
delay(1000);
crossFade(0,0,0,0,0,0,red,1,2,3,4,5,5,blue);
crossFade(0,0,0,0,0,0,blue,1,2,3,4,5,5,red);
crossFade(0,0,0,0,0,0,blue,1,2,3,4,5,5,blue);
}
while (buttonChange == 2){
crossFade(0,2,4,4,4,4,red,1,3,5,5,5,5,blue);
crossFade(0,2,4,4,4,4,blue,1,3,5,5,5,5,red);
pixels.setPixelColor(0, pixels.Color(255,0,0));
if (buttonChange != prevButtonChange){
break;}
pixels.setPixelColor(2, pixels.Color(255,0,0));
if (buttonChange != prevButtonChange){
break;}
pixels.setPixelColor(4, pixels.Color(255,0,0));
if (buttonChange != prevButtonChange){
break;}
crossFade(0,2,4,4,4,4,red,1,3,5,5,5,5,red);
if (buttonChange != prevButtonChange){
break;}
pixels.setPixelColor(1, pixels.Color(255,0,0));
if (buttonChange != prevButtonChange){
break;}
pixels.setPixelColor(3, pixels.Color(255,0,0));
if (buttonChange != prevButtonChange){
break;}
pixels.setPixelColor(5, pixels.Color(255,0,0));
if (buttonChange != prevButtonChange){
break;}
delay(1000);
crossFade(3,3,3,3,3,3,blue,1,2,0,4,5,5,red);
crossFade(3,3,3,3,3,3,red,1,2,0,4,5,5,blue);
crossFade(3,3,3,3,3,3,red,1,2,0,4,5,5,red);
}
}
void push1()
{
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 400){
buttonChange++;
Serial.print("PUSHED bll ");
Serial.println(buttonChange);
if (buttonChange==3){buttonChange = 1;}
}
last_interrupt_time = interrupt_time;
Serial.print("PUSHED bll ");
Serial.println(buttonChange);
}
int calculateStep(int prevValue, int endValue) {
int step = endValue - prevValue;
if (step) {
step = 1020/step;
}
return step;
}
int calculateVal(int step, int val, int i) {
if ((step) && i % step == 0) {
if (step > 0) {
val += 1;
}
else if (step < 0) {
val -= 1;
}
}
if (val > 255) {
val = 255;
}
else if (val < 0) {
val = 0;
}
return val;
}
void crossFade(int p0, int p1, int p2, int p3, int p4, int p5, int color[3],int p6, int p7, int p8, int p9, int p10, int p11, int color2[3]) {
int R = (color[0] * 255) / 100;
int G = (color[1] * 255) / 100;
int B = (color[2] * 255) / 100;
int stepR = calculateStep(prevR, R);
int stepG = calculateStep(prevG, G);
int stepB = calculateStep(prevB, B);
int R2 = (color2[0] * 255) / 100;
int G2 = (color2[1] * 255) / 100;
int B2 = (color2[2] * 255) / 100;
int stepR2 = calculateStep(prevR2, R2);
int stepG2 = calculateStep(prevG2, G2);
int stepB2 = calculateStep(prevB2, B2);
for (int i = 0; i <= 1020; i++) {
redVal = calculateVal(stepR, redVal, i);
grnVal = calculateVal(stepG, grnVal, i);
bluVal = calculateVal(stepB, bluVal, i);
redVal2 = calculateVal(stepR2, redVal2, i);
grnVal2 = calculateVal(stepG2, grnVal2, i);
bluVal2 = calculateVal(stepB2, bluVal2, i);
pixels.setPixelColor(p0, pixels.Color(redVal,grnVal,bluVal));
pixels.setPixelColor(p1, pixels.Color(redVal,grnVal,bluVal));
pixels.setPixelColor(p2, pixels.Color(redVal,grnVal,bluVal));
pixels.setPixelColor(p3, pixels.Color(redVal,grnVal,bluVal));
pixels.setPixelColor(p4, pixels.Color(redVal,grnVal,bluVal));
pixels.setPixelColor(p5, pixels.Color(redVal,grnVal,bluVal));
pixels.setPixelColor(p6, pixels.Color(redVal2,grnVal2,bluVal2));
pixels.setPixelColor(p7, pixels.Color(redVal2,grnVal2,bluVal2));
pixels.setPixelColor(p8, pixels.Color(redVal2,grnVal2,bluVal2));
pixels.setPixelColor(p9, pixels.Color(redVal2,grnVal2,bluVal2));
pixels.setPixelColor(p10, pixels.Color(redVal2,grnVal2,bluVal2));
pixels.setPixelColor(p11, pixels.Color(redVal2,grnVal2,bluVal2));
pixels.show();
if (buttonChange != prevButtonChange){
break;}
delay(wait);
if (DEBUG) {
if (i == 0 or i % loopCount == 0) {
Serial.print("Loop/RGB: #");
Serial.print(i);
Serial.print(" | ");
Serial.print(redVal);
Serial.print(" / ");
Serial.print(grnVal);
Serial.print(" / ");
Serial.println(bluVal);
}
DEBUG += 1;
}
}
prevR = redVal;
prevG = grnVal;
prevB = bluVal;
prevR2 = redVal2;
prevG2 = grnVal2;
prevB2 = bluVal2;
delay(hold);
}
void setSolidColor(int p0, int p1, int p2, int p3, int p4, int p5, int color[3],int p6, int p7, int p8, int p9, int p10, int p11, int color2[3]) {
int R = (color[0] * 255) / 100;
int G = (color[1] * 255) / 100;
int B = (color[2] * 255) / 100;
pixels.setPixelColor(p0, pixels.Color(R,grnVal,bluVal));
pixels.setPixelColor(p1, pixels.Color(R,grnVal,bluVal));
pixels.setPixelColor(p2, pixels.Color(R,grnVal,bluVal));
pixels.setPixelColor(p3, pixels.Color(R,grnVal,bluVal));
pixels.setPixelColor(p4, pixels.Color(R,grnVal,bluVal));
pixels.setPixelColor(p5, pixels.Color(R,grnVal,bluVal));
pixels.setPixelColor(p6, pixels.Color(R,grnVal2,bluVal2));
pixels.setPixelColor(p7, pixels.Color(R,grnVal2,bluVal2));
pixels.setPixelColor(p8, pixels.Color(R,grnVal2,bluVal2));
pixels.setPixelColor(p9, pixels.Color(R,grnVal2,bluVal2));
pixels.setPixelColor(p10, pixels.Color(R,grnVal2,bluVal2));
pixels.setPixelColor(p11, pixels.Color(R,grnVal2,bluVal2));
}