Programming Issue with Neopixels

EL Wire/Tape/Panels, LEDs, pixels and strips, LCDs and TFTs, etc products from Adafruit

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
squirrelman
 
Posts: 3
Joined: Tue Jul 15, 2014 8:12 pm

Programming Issue with Neopixels

Post by squirrelman »

I have set up a series of switches to operate my neo pixel strip with an Arduino Uno. Im confident my switches are set up correctly but I cant get my strip to respond correctly to what Im telling it to so with the switches Im still pretty new to this kind of thing so could someone take a look at the code and see of there's anything wrong with it?
Heres the code:

Code: Select all

#include <Adafruit_NeoPixel.h>

#define control 2
#define pos1 3
#define pos2 4
#define pos3 5
#define pos4 6
#define pos5 7
#define pos6 8
#define pos7 9
#define pos8 10
#define pos9 11
#define pos10 12

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 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)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, control, NEO_GRB + NEO_KHZ800);

void setup() {
  pinMode(pos1, INPUT);
  pinMode(pos2, INPUT);
  pinMode(pos3, INPUT);
  pinMode(pos4, INPUT);
  pinMode(pos5, INPUT);
  pinMode(pos6, INPUT);
  pinMode(pos7, INPUT);
  pinMode(pos8, INPUT);
  pinMode(pos9, INPUT);
  pinMode(pos10, INPUT);
  
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

int posstate1 =0;
int posstate2 =0;
int posstate3 =0;
int posstate4 =0;
int posstate5 =0;
int posstate6 =0;
int posstate7 =0;
int posstate8 =0;
int posstate9 =0;
int posstate10 =0;

int r=0;
int g=0;
int b=0;

void loop(){
  //read position info
 posstate1=digitalRead(pos1);
 posstate2=digitalRead(pos2);
 posstate3=digitalRead(pos3);
 posstate4=digitalRead(pos4);
 posstate5=digitalRead(pos5);
 posstate6=digitalRead(pos6);
 posstate7=digitalRead(pos7);
 posstate8=digitalRead(pos8);
 posstate9=digitalRead(pos9);
 posstate10=digitalRead(pos10);
 
 
 //determine color
 if (posstate1 == HIGH){
   r=200;
 }
 if (posstate2 == HIGH){
   g=200;
 }
 if (posstate3 == HIGH){
   b=200;
 }
 if (posstate3 == HIGH && posstate2 == HIGH && posstate1 == HIGH){
   r=127;
   g=127;
   b=127;
 } 
 
 //call function detrmined by switch
 
 if (posstate10 == HIGH){
   colorWipe(strip.Color(r, g, b), 50);
 }
 if (posstate8 == HIGH){
   theaterChase(strip.Color(r, g, b), 50);
 }
 if (posstate7 == HIGH){
   rainbow(20);
 }
 if (posstate6 == HIGH){
   rainbowCycle(20);
 }
 
}

// functions:

// 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 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);
  }
}

// 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);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();
     
      delay(wait);
     
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
        }
        strip.show();
       
        delay(wait);
       
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, 0);        //turn every third pixel off
        }
    }
  }
}

// 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);
  }
}

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

Re: Programming Issue with Neopixels

Post by adafruit_support_bill »

I cant get my strip to respond correctly to what Im telling it to so with the switches
What exactly is the code doing?
Do you have pulldown resistors on your switches?

squirrelman
 
Posts: 3
Joined: Tue Jul 15, 2014 8:12 pm

Re: Programming Issue with Neopixels

Post by squirrelman »

So I have A set of 3 SPST switches and a set of 4 SPDT switches(which are currently acting as SPST while I am still trying to get it to work). The set of 3 switches which are pins 3-5. These switches determine color, one switch for each of R G and B. The other set of 4 determines action. Color wipe, theater case, etc. I used the action functions from the example that comes with the library so I know those are solid. The idea is that I could select a color and an action and the lights would do that.
I have a 10 Ohm resister in between the switch and the signal pin on the Uno.
Once again still very new to working with LED's and Arduinos so please explain thoroughly!

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

Re: Programming Issue with Neopixels

Post by adafruit_support_bill »

So I have A set of 3 SPST switches and a set of 4 SPDT switches(which are currently acting as SPST while I am still trying to get it to work). The set of 3 switches which are pins 3-5. These switches determine color, one switch for each of R G and B. The other set of 4 determines action. Color wipe, theater case, etc. I used the action functions from the example that comes with the library so I know those are solid. The idea is that I could select a color and an action and the lights would do that.
That is what you want it to do. But what is it doing? You said it doesn't respond correctly. It is hard for us to diagnose a problem if we don't know what the symptoms are.
I have a 10 Ohm resister in between the switch and the signal pin on the Uno.
You need either a pull-up or a pull-down resistor to keep the line from floating. Floating inputs would lead to unpredictable behavior.

You can either use an external resistor to pull-down, or the pullup resistors built into the Arduino. See lesson 6 for details:
https://learn.adafruit.com/adafruit-ard ... s/overview

Also see lesson 5 in the old tutorial: http://www.ladyada.net/learn/arduino/lesson5.html

squirrelman
 
Posts: 3
Joined: Tue Jul 15, 2014 8:12 pm

Re: Programming Issue with Neopixels

Post by squirrelman »

Ya probably should have mentioned what it is doing. Right now it seems to be jumping around from a rainbow action to a white color wipe, and doesnt seem to respond when I try changing the switches. Im thinking that its both a programming issue and a design issue. Im going to work on redesigning the switch layout using the info from the lesson. Thanks!

User avatar
hiduino
 
Posts: 862
Joined: Sat Sep 01, 2012 7:05 pm

Re: Programming Issue with Neopixels

Post by hiduino »

You will probably need to de-bounce your switches. Without de-bouncing your switch readings will not be what you expect.
There are number of ways to do it in both software and hardware de-bouncing. Do some google searches for switch de-bouncing.

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

Return to “Glowy things (LCD, LED, TFT, EL) purchased at Adafruit”