The problem is that the code seems to be requiring a certain timing to change the mode. The code is a one way scanner off/red/blue, and when the button is pressed, nothing happens. If the button is pressed before the scanner reaches the end of the strip and held down until it starts again from the beginning, it will change the color for the next round. This is a problem for me. I need it to change when the button is pressed. It can start the scanner from the top, that's not a problem.
#include <Adafruit_NeoPixel.h>
#define PIXEL_PIN 6 // Digital IO pin connected to the NeoPixels.
#define PIXEL_COUNT 144
int val; // variable for reading the pin status
int val2; // variable for reading the delayed status
int buttonState; // variable to hold the button state
int Mode = 0; // What mode is the light in?
int switchPin = 2; // switch is connected to pin 2
int wait_T=40; //This is the delay between moving back and forth and per pixel
int refresh=400;
int PixelCount=144; //Set this to the AMOUNT of Led's/Pixels you have or want to use on your strip And It can be used to tell where to Stop then return the eye at in the strip
int Pixel_Start_End=0; //Set this to where you want it to Start/End at
boolean UsingBar = false; //Set this to true If you are using the 8x1 Neopixel Bar Or you want to only use 3 leds for the scanner.
// Parameter 1 = number of pixels in strip, neopixel stick has 8
// 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, correct for neopixel stick
// NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels)
// NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pinMode(PIXEL_PIN, OUTPUT);
pinMode(switchPin, INPUT); // Set the switch pin as input
strip.begin();
strip.show(); // Initialize all pixels to 'off'
//Serial.begin(9600); //Used For pixel Count Debugging
buttonState = digitalRead(switchPin); // read the initial state
}
void loop(){
val = digitalRead(switchPin); // read input value and store it in val
delay(10); // 10 milliseconds is a good amount of time
val2 = digitalRead(switchPin); // read the input again to check for bounces
if (val == val2) { // make sure we got 2 consistant readings!
if (val != buttonState) { // the button state has changed!
if (val == LOW) { // check if the button is pressed
if (Mode == 0) {
Mode = 1;
} else {
if (Mode == 1) {
Mode = 2;
} else {
if (Mode == 2) {
Mode = 0;
}
}
}
}
}
buttonState = val; // save the new state in our variable
}
// Now do whatever the lightMode indicates
if (Mode == 0) {
//Example: CylonEyeUp(Center_Dot_Color, Second_Dot_color, Third_Dot_color, wait_T, PixelCount, Pixel_Start_End);
CylonEyeUp(strip.Color(0,0,0), strip.Color(0,0,0), strip.Color(0,0,0), wait_T, PixelCount, Pixel_Start_End);
delay(wait_T);
//Example: CylonEyeDown(Center_Dot_Color, Second_Dot_color, Third_Dot_color, wait_T, PixelCount, Pixel_Start_End);
//CylonEyeDown(strip.Color(175,0,0), strip.Color(25,0,0), strip.Color(10,0,0), wait_T, PixelCount, Pixel_Start_End);
//delay(wait_T);
//Example: CylonEyeClear(wait_T, PixelCount, Pixel_Start_End);
CylonEyeClear(wait_T, PixelCount, Pixel_Start_End);
delay(refresh);
}
if (Mode == 1) {
//Example: CylonEyeUp(Center_Dot_Color, Second_Dot_color, Third_Dot_color, wait_T, PixelCount, Pixel_Start_End);
CylonEyeUp(strip.Color(175,0,0), strip.Color(75,0,0), strip.Color(25,0,0), wait_T, PixelCount, Pixel_Start_End);
delay(wait_T);
//Example: CylonEyeDown(Center_Dot_Color, Second_Dot_color, Third_Dot_color, wait_T, PixelCount, Pixel_Start_End);
//CylonEyeDown(strip.Color(175,0,0), strip.Color(25,0,0), strip.Color(10,0,0), wait_T, PixelCount, Pixel_Start_End);
//delay(wait_T);
//Example: CylonEyeClear(wait_T, PixelCount, Pixel_Start_End);
CylonEyeClear(wait_T, PixelCount, Pixel_Start_End);
delay(refresh);
}
if (Mode == 2) {
//Example: CylonEyeUp(Center_Dot_Color, Second_Dot_color, Third_Dot_color, wait_T, PixelCount, Pixel_Start_End);
CylonEyeUp(strip.Color(0,0,175), strip.Color(0,0,75), strip.Color(0,0,25), wait_T, PixelCount, Pixel_Start_End);
delay(wait_T);
//Example: CylonEyeDown(Center_Dot_Color, Second_Dot_color, Third_Dot_color, wait_T, PixelCount, Pixel_Start_End);
//CylonEyeDown(strip.Color(175,0,0), strip.Color(25,0,0), strip.Color(10,0,0), wait_T, PixelCount, Pixel_Start_End);
//delay(wait_T);
//Example: CylonEyeClear(wait_T, PixelCount, Pixel_Start_End);
CylonEyeClear(wait_T, PixelCount, Pixel_Start_End);
delay(refresh);
}
}
void CylonEyeClear(uint8_t Delay, int TotalPixels, int pStart) {
for(int i=pStart; i<TotalPixels+2; i++) {
strip.setPixelColor(i, strip.Color(0,0,0)); //Clears the dots
strip.show();
//Serial.println(i); //Used For pixel Count Debugging
//delay(Delay);
}
}
void CylonEyeUp(uint32_t Co, uint32_t Ct, uint32_t Ctt, uint8_t Delay, int TotalPixels, int pStart) {
for(int i=pStart; i<TotalPixels; i++) {
if(!UsingBar) { strip.setPixelColor(i+7, Ctt); } //Third Dot Color
strip.setPixelColor(i+6, Ctt); //Second Dot Color
strip.setPixelColor(i+5, Ctt); //Second Dot Color
strip.setPixelColor(i+4, Ct); //Second Dot Color
strip.setPixelColor(i+3, Ct); //Second Dot Color
strip.setPixelColor(i+2, Ct); //Second Dot Color
strip.setPixelColor(i+1, Co); //Center Dot Color
strip.setPixelColor(i, Co); //Center Dot Color
strip.setPixelColor(i-1, Co); //Center Dot Color
strip.setPixelColor(i-2, Ct); //Second Dot Color
strip.setPixelColor(i-3, Ct); //Second Dot Color
strip.setPixelColor(i-4, Ct); //Second Dot Color
strip.setPixelColor(i-5, Ctt); //Second Dot Color
strip.setPixelColor(i-6, Ctt); //Second Dot Color
if(!UsingBar) { strip.setPixelColor(i-7, Ctt); } //Third Dot Color
if(!UsingBar) {
strip.setPixelColor(i-8, strip.Color(0,0,0)); //Clears the dots after the 3rd color
} else {
strip.setPixelColor(i-7, strip.Color(0,0,0)); //Clears the dots after the 2rd color
}
strip.show();
//Serial.println(i); //Used For pixel Count Debugging
delay(Delay);
}
}
void CylonEyeDown(uint32_t Co, uint32_t Ct, uint32_t Ctt, uint8_t Delay, int TotalPixels, int pEnd) {
for(int i=TotalPixels-1; i>pEnd; i--) {
if(!UsingBar) { strip.setPixelColor(i+7, Ctt); } //Third Dot Color
strip.setPixelColor(i+6, Ctt); //Second Dot Color
strip.setPixelColor(i+5, Ctt); //Second Dot Color
strip.setPixelColor(i+4, Ct); //Second Dot Color
strip.setPixelColor(i+3, Ct); //Second Dot Color
strip.setPixelColor(i+2, Ct); //Second Dot Color
strip.setPixelColor(i+1, Co); //Center Dot Color
strip.setPixelColor(i, Co); //Center Dot Color
strip.setPixelColor(i-1, Co); //Center Dot Color
strip.setPixelColor(i-2, Ct); //Second Dot Color
strip.setPixelColor(i-3, Ct); //Second Dot Color
strip.setPixelColor(i-4, Ct); //Second Dot Color
strip.setPixelColor(i-5, Ctt); //Second Dot Color
strip.setPixelColor(i-6, Ctt); //Second Dot Color
if(!UsingBar) { strip.setPixelColor(i-7, Ctt); } //Third Dot Color
if(!UsingBar) {
strip.setPixelColor(i-8, strip.Color(0,0,0)); //Clears the dots after the 3rd color
} else {
strip.setPixelColor(i-7, strip.Color(0,0,0)); //Clears the dots after the 2rd color
}
strip.show();
//Serial.println(i); //Used For pixel Count Debugging
delay(Delay);
}
}
ButtonOneWay.ino (7.67 KB)