I'm trying to get my Arduino Uno to run Neo Pixel ring 16 count with certain effects while using a led button. I was able to download and upload the general test for the button and Neo Pixel and It works. Now I want to make changes but I just don't know how. So the question is is there someone willing help make these changes for me or know of any other ideas. Thanks for your time.
If you want to pay someone to do it for you then you should click the "Report to moderator" button and ask that your post be moved to the Gigs and Collaborations forum section.
If you want help learning how to use your Arduino then you need to ask more specific questions. I recommend you start by learning the basics. Go through the example sketches at File > Examples. Start with File > Examples > 01.Basics > BareMinimum, then move on to File > Examples > 01.Basics > Blink and so on. Make sure you understand what every line of code does in each example. Make some changes(e.g. change the blink speed), test your changes out and make sure they do what you expected them to do. Once you are familiar with the basics open up the examples that came with the NeoPixel library and go through the same process. Now you are ready to start writing your own code. Give it a good try, when you run into troubles spend some quality time with a search engine trying to find a solution. If you get stuck after all of that come back here with a specific question. First read the sticky post "How to use this forum - please read." Post some code that demonstrates what you're trying to do USING CODE TAGS(</> button on the toolbar). Provide the details of your circuit. Thoroughly explain the issue you're having, what behavior do you expect, what behavior are you experiencing instead.
ok thanks
Thread moved as requested.
thanks.
Hi shaol,
What are the 'certain effects' that you want it to do?
Also, as pert requested, post the code in a code block so we can help.
Pat
Lets hope I have done this correctly.
The code I'm using is the Adafruit Neopixel Buttoncycler. This can be change to something more appropriate if thats easier. For now I'm using Arduino Uno just for testing then will use Adafruit Pro Trinket - 5V 16MHz for final.
The other important item that I would like to have is being able to cycle though the effects with out having to wait for each effect to finish since the effects are never ending loops.
Effect wise.
- Off mode (All pixels are off including the button led).
- On mode (100% white brightness all Pixels, the led with the button is on).
- On mode (25% white brightness all Pixels, the led with the button is on).
- On mode (100% green brightness all Pixels, the led with the button is on).
- On mode (100% green brightness all Pixels slow on slow off, the led with the button is on).
- On mode (100% green brightness that goes around in a circles with a fade to off like the car in Knight Rider, speed of rotation once every 2 to 3 second, the led with the button is on).
- On mode (100% green brightness flickering stars,more random or the theater chase if to difficult, the led with the button is on).
- On mode (100% brightness Rainbow colors all Pixels Theater chase, the led with the button is on).
I'm using these items
16mm Illuminated Pushbutton - Green Momentary
NeoPixel Ring - 16 x 5050 RGB LED with Integrated Drivers
After everything works I'm tranfering the code to this board as a final.
Adafruit Pro Trinket - 5V 16MHz
There is a good chance that I might use this ring instead of the other ring. if its not difficult can you put // to hide the code for this ring if its a problem I can pick one.
NeoPixel Ring - 16 x 5050 RGBW LEDs w/ Integrated Drivers - Cool White - ~6000K
here is the code I'm using.
[code]
// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
// You should wire a momentary push button to connect from ground to a digital IO pin. When you
// press the button it will change to a new pixel animation. Note that you need to press the
// button once to start the first animation!
#include <Adafruit_NeoPixel.h>
#define BUTTON_PIN 2 // Digital IO pin connected to the button. This will be
// driven with a pull-up resistor so the switch should
// pull the pin to ground momentarily. On a high -> low
// transition the button press logic will execute.
#define PIXEL_PIN 6 // Digital IO pin connected to the NeoPixels.
#define PIXEL_COUNT 16
// 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);
bool oldState = HIGH;
int showType = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
// Get current button state.
bool 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) {
showType++;
if (showType > 9)
showType=0;
startShow(showType);
}
}
// Set the last button state to the old state.
oldState = newState;
}
void startShow(int i) {
switch(i){
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(20);
break;
case 8: rainbowCycle(20);
break;
case 9: theaterChaseRainbow(50);
break;
}
}
// 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) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
[/code]
Any Questions let me know and thanks
Are you wanting to transition between these effects by pressing the button? i.e., pressing the button will immediately transition from the current effect to the next effect (stop the current effect, start new effect) and cycle through them that way?
Yes that is correct.
The general pattern for code like this is to have a number of different "paint" functions, and for the main loop() to watch the button to keep count of which paint function needs to be called. You can use an if-else chain, a switch stament, an array of pointers to function, or an array of pointers to objects with a virtual paint() method.
Each paint functions looks at the current time and asks, "What do I need to pain right now? do I need to update the ring?" The main loop passes a boolean to the paint function to indicate "this is the first time I have called you, so you need to do an initial paint".
The trick, as always, is that each paint effect does not sit there waiting for the time to tick over. It either paints one frame of the animation or it exits and does nothing.
I'm certain I did something exactly like this for someone else ...