Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Adafruit_NeoPixel.h>
- #define FASTLED_ALLOW_INTERRUPTS 0
- #include <FastLED.h>
- FASTLED_USING_NAMESPACE
- #define DATA_PIN 11
- #define NUM_LEDS 140
- #define MAX_POWER_MILLIAMPS 300
- #define LED_TYPE WS2812B
- #define COLOR_ORDER GRB
- CRGB leds[NUM_LEDS];
- #ifdef __AVR__
- #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
- #endif
- #define BUTTON_PIN 13
- #define PIXEL_PIN 11 // Digital IO pin connected to the NeoPixels.
- #define PIXEL_COUNT 20 // 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'
- FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS)
- .setCorrection( TypicalLEDStrip );
- FastLED.setMaxPowerInVoltsAndMilliamps( 5, MAX_POWER_MILLIAMPS);
- }
- 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(15);
- // Check if button is still low after debounce.
- newState = digitalRead(BUTTON_PIN);
- pacificaStart();
- if(newState == LOW) { // Yes, still low
- if(++mode > 8) 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( 3, 252, 236), 50); // Cyan
- 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;
- }
- }
- }
- // 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
- }
- }
- // 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
- 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
- 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
- delay(wait); // Pause for a moment
- firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
- }
- }
- }
- void pacificaStart()
- {
- EVERY_N_MILLISECONDS( 10) {
- pacifica_loop();
- FastLED.show();
- }
- }
- CRGBPalette16 pacifica_palette_1 =
- { 0x000507, 0x000409, 0x00030B, 0x00030D, 0x000210, 0x000212, 0x000114, 0x000117,
- 0x000019, 0x00001C, 0x000026, 0x000031, 0x00003B, 0x000046, 0x14554B, 0x28AA50 };
- CRGBPalette16 pacifica_palette_2 =
- { 0x000507, 0x000409, 0x00030B, 0x00030D, 0x000210, 0x000212, 0x000114, 0x000117,
- 0x000019, 0x00001C, 0x000026, 0x000031, 0x00003B, 0x000046, 0x0C5F52, 0x19BE5F };
- CRGBPalette16 pacifica_palette_3 =
- { 0x000208, 0x00030E, 0x000514, 0x00061A, 0x000820, 0x000927, 0x000B2D, 0x000C33,
- 0x000E39, 0x001040, 0x001450, 0x001860, 0x001C70, 0x002080, 0x1040BF, 0x2060FF };
- void pacifica_loop()
- {
- // Increment the four "color index start" counters, one for each wave layer.
- // Each is incremented at a different speed, and the speeds vary over time.
- static uint16_t sCIStart1, sCIStart2, sCIStart3, sCIStart4;
- static uint32_t sLastms = 0;
- uint32_t ms = GET_MILLIS();
- uint32_t deltams = ms - sLastms;
- sLastms = ms;
- uint16_t speedfactor1 = beatsin16(3, 179, 269);
- uint16_t speedfactor2 = beatsin16(4, 179, 269);
- uint32_t deltams1 = (deltams * speedfactor1) / 256;
- uint32_t deltams2 = (deltams * speedfactor2) / 256;
- uint32_t deltams21 = (deltams1 + deltams2) / 2;
- sCIStart1 += (deltams1 * beatsin88(1011,10,13));
- sCIStart2 -= (deltams21 * beatsin88(777,8,11));
- sCIStart3 -= (deltams1 * beatsin88(501,5,7));
- sCIStart4 -= (deltams2 * beatsin88(257,4,6));
- // Clear out the LED array to a dim background blue-green
- fill_solid( leds, NUM_LEDS, CRGB( 2, 6, 10));
- // Render each of four layers, with different scales and speeds, that vary over time
- pacifica_one_layer( pacifica_palette_1, sCIStart1, beatsin16( 3, 11 * 256, 14 * 256), beatsin8( 10, 70, 130), 0-beat16( 301) );
- pacifica_one_layer( pacifica_palette_2, sCIStart2, beatsin16( 4, 6 * 256, 9 * 256), beatsin8( 17, 40, 80), beat16( 401) );
- pacifica_one_layer( pacifica_palette_3, sCIStart3, 6 * 256, beatsin8( 9, 10,38), 0-beat16(503));
- pacifica_one_layer( pacifica_palette_3, sCIStart4, 5 * 256, beatsin8( 8, 10,28), beat16(601));
- // Add brighter 'whitecaps' where the waves lines up more
- //pacifica_add_whitecaps();
- // Deepen the blues and greens a bit
- pacifica_deepen_colors();
- }
- // Add one layer of waves into the led array
- void pacifica_one_layer( CRGBPalette16& p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff)
- {
- uint16_t ci = cistart;
- uint16_t waveangle = ioff;
- uint16_t wavescale_half = (wavescale / 2) + 20;
- for( uint16_t i = 0; i < NUM_LEDS; i++) {
- waveangle += 250;
- uint16_t s16 = sin16( waveangle ) + 32768;
- uint16_t cs = scale16( s16 , wavescale_half ) + wavescale_half;
- ci += cs;
- uint16_t sindex16 = sin16( ci) + 32768;
- uint8_t sindex8 = scale16( sindex16, 240);
- CRGB c = ColorFromPalette( p, sindex8, bri, LINEARBLEND);
- leds[i] += c;
- }
- }
- // Add extra 'white' to areas where the four layers of light have lined up brightly
- void pacifica_add_whitecaps()
- {
- uint8_t basethreshold = beatsin8( 9, 55, 65);
- uint8_t wave = beat8( 7 );
- for( uint16_t i = 0; i < NUM_LEDS; i++) {
- uint8_t threshold = scale8( sin8( wave), 20) + basethreshold;
- wave += 7;
- uint8_t l = leds[i].getAverageLight();
- if( l > threshold) {
- uint8_t overage = l - threshold;
- uint8_t overage2 = qadd8( overage, overage);
- leds[i] += CRGB( overage, overage2, qadd8( overage2, overage2));
- }
- }
- }
- // Deepen the blues and greens
- void pacifica_deepen_colors()
- {
- for( uint16_t i = 0; i < NUM_LEDS; i++) {
- leds[i].blue = scale8( leds[i].blue, 145);
- //leds[i].green= scale8( leds[i].green, 200);
- leds[i] |= CRGB( 2, 5, 7);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement