button cycler neopixel button check exit loop

This is a special forum devoted to educators using Adafruit and Arduino products for teaching.

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
User avatar
adafruit_support_bill
 
Posts: 88136
Joined: Sat Feb 07, 2009 10:11 am

Re: button cycler neopixel button check exit loop

Post by adafruit_support_bill »

Looks like you were missing the modulo operator "%" for calculating the index of the previous pixel

Code: Select all

void colorWipe9(uint32_t color, int wait) {
  strip.clear();
  for(int i=0; i<strip.numPixels(); i=i+1) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.setPixelColor((i + strip.numPixels() - 1) % strip.numPixels(), (strip.Color(0,   0,   0), 50));     
    strip.show();   
    if (digitalRead(BUTTON_PIN) == HIGH) //<< -- Add these two lines
        return; //  Exit on a button press // <<-------------     
    delay(wait);    //  Pause for a moment
  }
}

User avatar
middletonsa2014
 
Posts: 23
Joined: Thu Oct 16, 2014 12:57 pm

Re: button cycler neopixel button check exit loop

Post by middletonsa2014 »

hmmm...thanks again. I copied pasted your code exactly, and the previous LED still wont turn off right after the one in front. I was trying to have only one LED on at once, so it looks like one dot is moving around in a circle. I hope I am making sense. Thanks again.

User avatar
adafruit_support_bill
 
Posts: 88136
Joined: Sat Feb 07, 2009 10:11 am

Re: button cycler neopixel button check exit loop

Post by adafruit_support_bill »

So how exactly is it behaving now? A precise description of the problem typically will get you halfway to the solution.

User avatar
middletonsa2014
 
Posts: 23
Joined: Thu Oct 16, 2014 12:57 pm

Re: button cycler neopixel button check exit loop

Post by middletonsa2014 »

LED Prj 1.jpg
LED Prj 1.jpg (122.43 KiB) Viewed 994 times

Here is a picture of the overall. I will add better ones soon.

User avatar
middletonsa2014
 
Posts: 23
Joined: Thu Oct 16, 2014 12:57 pm

Re: button cycler neopixel button check exit loop

Post by middletonsa2014 »

Each LED lights up going in a clockwise motion. It lights only one LED at a time, and leaves the previous LED on, instead of turning it off. Does that help? It is hard to describe. In the picture above, you can see what it looks like when they are all on. I am trying to make just one go on at a time so it appears it is a moving dot.

User avatar
adafruit_support_bill
 
Posts: 88136
Joined: Sat Feb 07, 2009 10:11 am

Re: button cycler neopixel button check exit loop

Post by adafruit_support_bill »

Please post your complete code.

User avatar
middletonsa2014
 
Posts: 23
Joined: Thu Oct 16, 2014 12:57 pm

Re: button cycler neopixel button check exit loop

Post by middletonsa2014 »

Sure thing. Here is the complete code. Thanks.

Code: Select all

// Simple demonstration on using an input device to trigger changes on your
// NeoPixels. Wire a momentary push button to connect from ground to a
// digital IO pin. When the button is pressed it will change to a new pixel
// animation. Initial state has all pixels off -- press the button once to
// start the first animation. As written, the button does not interrupt an
// animation in-progress, it works only when idle.

#include <Adafruit_NeoPixel.h>
/*
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
*/

// Digital IO pin connected to the button. This will be driven with a
// pull-up resistor so the switch pulls the pin to ground momentarily.
// On a high -> low transition the button press logic will execute.
#define BUTTON_PIN   5

#define PIXEL_PIN    6  // Digital IO pin connected to the NeoPixels.
#define PIXEL_COUNT 33  // Number of NeoPixels


// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
#define DELAYVAL 500
boolean oldState = HIGH;
int mode     = 0;    // Currently-active animation mode, 0-9
int show_count = 9;

void setup() {
  Serial.begin(115200);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin(); // Initialize NeoPixel strip object (REQUIRED)
  strip.show();  // Initialize all pixels to 'off'
}

void loop() {
  // Get current button state.
  boolean newState = digitalRead(BUTTON_PIN);
  // Check if state changed from high to low (button press).
  if((newState == LOW) && (oldState == HIGH)) {  
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);    
    if(newState == LOW) {      // Yes, still low
      while (digitalRead(BUTTON_PIN) == HIGH); //wait button release <-add line 
      if(++mode > show_count) mode = 0; // Advance to next mode, wrap around after #8
      switch(mode) {           // Start the new animation...
        case 0:
          colorWipe(strip.Color(  0,   0,   0), 50);    // Black/off       
          break;
        case 1:
          colorWipe(strip.Color(255,   0,   0), 50);    // Red
          break;
        case 2:
          colorWipe(strip.Color(  0, 255,   0), 50);    // Green
          break;
        case 3:
          colorWipe(strip.Color(  0,   0, 255), 50);    // Blue
          break;
        case 4:
          theaterChase(strip.Color(127, 127, 127), 50); // White
          break;
        case 5:
          theaterChase(strip.Color(127,   0,   0), 50); // Red
          break;
        case 6:
          theaterChase(strip.Color(  0,   0, 127), 50); // Blue
          break;
        case 7:
          rainbow(10);
          break;
        case 8:
          theaterChaseRainbow(50);
          break;
        case 9:     
          colorWipe9(strip.Color(0,   100,   100), 50);       
          break;       
        case 10:
          show_10();
          break;             
      }
    }
  }

  // Set the last-read button state to the old state.
  oldState = newState;
}

void colorWipe9(uint32_t color, int wait) {
  strip.clear();
  for(int i=0; i<strip.numPixels(); i=i+1) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.setPixelColor((i+strip.numPixels()-1)%strip.numPixels(),(strip.Color(0,0,0),50));
    strip.show();   
    if (digitalRead(BUTTON_PIN) == HIGH) //<< -- Add these two lines
        return; //  Exit on a button press // <<-------------     
    delay(wait);    //  Pause for a moment
  }
}

void show_10(){
  /*
   * what do I want the show to do?
   */  
  strip.clear(); // Set all pixel colors to 'off'

  // The first NeoPixel in a strand is #0, second is 1, all the way up
  // to the count of pixels minus one.
  for(int i=0; i<PIXEL_COUNT; i++) { // For each pixel...
    // strip.Color() takes RGB values, from 0,0,0 up to 255,255,255
    // Here we're using a moderately bright green color:
    strip.setPixelColor(i, strip.Color(0, 150, 0));
    strip.show();   // Send the updated pixel colors to the hardware.
    delay(DELAYVAL); // Pause before next pass through loop
  }   
}
// Fill strip pixels one after another with a color. Strip is NOT cleared
// first; anything there will be covered pixel by pixel. Pass in color
// (as a single 'packed' 32-bit value, which you can get by calling
// strip.Color(red, green, blue) as shown in the loop() function above),
// and a delay time (in milliseconds) between pixels.
void colorWipe(uint32_t color, int wait) {
  for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
    if (digitalRead(BUTTON_PIN) == HIGH) //<< -- Add these two lines
        return; //  Exit on a button press // <<-------------     
    delay(wait);    //  Pause for a moment
  }
}

// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
// between frames.
void theaterChase(uint32_t color, int wait) {
  for(int a=0; a<10; a++) {  // Repeat 10 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in steps of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show(); // Update strip with new contents
      if (digitalRead(BUTTON_PIN) == HIGH) //<< -- Add these two lines
          return; //  Exit on a button press // <<-------------          
      delay(wait);  // Pause for a moment
    }
  }
}

// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(int wait) {
  // Hue of first pixel runs 3 complete loops through the color wheel.
  // Color wheel has a range of 65536 but it's OK if we roll over, so
  // just count from 0 to 3*65536. Adding 256 to firstPixelHue each time
  // means we'll make 3*65536/256 = 768 passes through this outer loop:
  for(long firstPixelHue = 0; firstPixelHue < 3*65536; firstPixelHue += 256) {
    for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
      // Offset pixel hue by an amount to make one full revolution of the
      // color wheel (range of 65536) along the length of the strip
      // (strip.numPixels() steps):
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
      // optionally add saturation and value (brightness) (each 0 to 255).
      // Here we're using just the single-argument hue variant. The result
      // is passed through strip.gamma32() to provide 'truer' colors
      // before assigning to each pixel:
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show(); // Update strip with new contents
    if (digitalRead(BUTTON_PIN) == HIGH) //<< -- Add these two lines
        return; //  Exit on a button press // <<-------------        
    delay(wait);  // Pause for a moment
  }
}

// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
void theaterChaseRainbow(int wait) {
  int firstPixelHue = 0;     // First pixel starts at red (hue 0)
  for(int a=0; a<30; a++) {  // Repeat 30 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in increments of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        // hue of pixel 'c' is offset by an amount to make one full
        // revolution of the color wheel (range 65536) along the length
        // of the strip (strip.numPixels() steps):
        int      hue   = firstPixelHue + c * 65536L / strip.numPixels();
        uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show();                // Update strip with new contents
      if (digitalRead(BUTTON_PIN) == HIGH) //<< -- Add these two lines
          return; //  Exit on a button press // <<-------------          
        delay(wait);                 // Pause for a moment
      firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
    }
  }
}

User avatar
adafruit_support_bill
 
Posts: 88136
Joined: Sat Feb 07, 2009 10:11 am

Re: button cycler neopixel button check exit loop

Post by adafruit_support_bill »

Try this for your colorWipe9:

Code: Select all

void colorWipe9(uint32_t color, int wait) {
  strip.clear();
  for(int i=0; i<strip.numPixels(); i=i+1) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.setPixelColor((i+strip.numPixels()-1)%strip.numPixels(),strip.Color(0,0,0));
    strip.show();   
    if (digitalRead(BUTTON_PIN) == HIGH) //<< -- Add these two lines
        return; //  Exit on a button press // <<-------------     
    delay(wait);    //  Pause for a moment
  }
}

User avatar
middletonsa2014
 
Posts: 23
Joined: Thu Oct 16, 2014 12:57 pm

Re: button cycler neopixel button check exit loop

Post by middletonsa2014 »

Thank you for all your help! Everything works perfectly! You guys are awesome at what you do!

User avatar
adafruit_support_bill
 
Posts: 88136
Joined: Sat Feb 07, 2009 10:11 am

Re: button cycler neopixel button check exit loop

Post by adafruit_support_bill »

Good to hear that works for you. Thanks for the follow-up.

User avatar
middletonsa2014
 
Posts: 23
Joined: Thu Oct 16, 2014 12:57 pm

Re: button cycler neopixel button check exit loop

Post by middletonsa2014 »

I am working on another project using 12 servos, it's another class project, would you guys mind taking a look at that code too? Or should I post that as a new subject?

User avatar
adafruit_support_bill
 
Posts: 88136
Joined: Sat Feb 07, 2009 10:11 am

Re: button cycler neopixel button check exit loop

Post by adafruit_support_bill »

Best to start a new thread for that topic.

Locked
Please be positive and constructive with your questions and comments.

Return to “For Educators”