Hi everyone,
I haven't coded in years but decided to take on a project for my own interest this weekend.
I have searched the forum but not found exactly my problem. I did use various codes from around the net and merge them to do what I wanted so there might be some unnecessary stuff that I haven't figured out I can remove yet.
The goal is to have an arduino make a 12 pixel neopixel change color every 10 minutes ending in all white pixels. I have been doing this on TinkerCAD. I have the following code (note that I reduced the times while working since I don't actually want to wait 10 minutes between each color change while writing the program) which does what I want, except for some reason the last direction to make the pixels white results in only the first 2 pixels turning white. My workaround has been to add the strip.clear() command to get rid of any other colors. But ideally I'd have 12 white pixels, not just 2.
I know that this is maybe just a TinkerCAD problem and it won't happen when I eventually get my hardware.
Would anyone mind giving a quick check and telling me if I've missed something?
Thanks
`// 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 2
#define PIXEL_PIN 6 // Digital IO pin connected to the NeoPixels.
#define PIXEL_COUNT 12 // 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)
boolean oldState = HIGH;
int mode = 0; // Currently-active animation mode, 0-9
void setup() {
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
if(++mode > 1) 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
delay(5000) ;
break;
case 1:
colorWipe(strip.Color(255, 0, 0), 0); // Red
delay(50) ;
colorWipe(strip.Color(255, 40, 0), 0); // Orange
delay(50) ;
colorWipe(strip.Color(255, 150, 0), 0); // Yellow
delay(50) ;
colorWipe(strip.Color(0, 255, 0), 0); // Green
delay(50) ;
colorWipe(strip.Color(0, 0, 255), 0); // Blue
delay(50) ;
colorWipe(strip.Color(180, 0, 255), 0); // Purple
delay(50) ;
strip.clear();
colorWipe(strip.Color(255, 255, 255), 0); // White
delay(0) ;
break;
}
}
}
// Set the last-read button state to the old state.
oldState = newState;
}
// 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
delay(wait); // Pause for a moment
}
}