Difference between revisions of "NeoPixel Workshop Instructions"
(→Code) |
|||
Line 29: | Line 29: | ||
= Code = | = Code = | ||
+ | |||
+ | '''Color Pallet''' | ||
+ | |||
+ | #include <FastLED.h> | ||
+ | |||
+ | #define LED_PIN 6 | ||
+ | #define NUM_LEDS 60 | ||
+ | #define BRIGHTNESS 96 | ||
+ | #define LED_TYPE WS2811 | ||
+ | #define COLOR_ORDER GRB | ||
+ | CRGB leds[NUM_LEDS]; | ||
+ | |||
+ | #define UPDATES_PER_SECOND 100 | ||
+ | |||
+ | |||
+ | // FastLED provides a few pre-configured color palettes, and makes it | ||
+ | // extremely easy to make up your own color schemes with palettes. | ||
+ | // | ||
+ | // Some notes on the more abstract 'theory and practice' of | ||
+ | // FastLED compact palettes are at the bottom of this file. | ||
+ | |||
+ | |||
+ | |||
+ | CRGBPalette16 currentPalette; | ||
+ | TBlendType currentBlending; | ||
+ | |||
+ | extern CRGBPalette16 myRedWhiteBluePalette; | ||
+ | extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM; | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | delay( 3000 ); // power-up safety delay | ||
+ | FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); | ||
+ | FastLED.setBrightness( BRIGHTNESS ); | ||
+ | |||
+ | currentPalette = RainbowColors_p; | ||
+ | currentBlending = LINEARBLEND; | ||
+ | } | ||
+ | |||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | ChangePalettePeriodically(); | ||
+ | |||
+ | static uint8_t startIndex = 0; | ||
+ | startIndex = startIndex + 1; /* motion speed */ | ||
+ | |||
+ | FillLEDsFromPaletteColors( startIndex); | ||
+ | |||
+ | FastLED.show(); | ||
+ | FastLED.delay(1000 / UPDATES_PER_SECOND); | ||
+ | } | ||
+ | |||
+ | void FillLEDsFromPaletteColors( uint8_t colorIndex) | ||
+ | { | ||
+ | uint8_t brightness = 255; | ||
+ | |||
+ | for( int i = 0; i < NUM_LEDS; i++) { | ||
+ | leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending); | ||
+ | colorIndex += 3; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | void ChangePalettePeriodically() | ||
+ | { | ||
+ | uint8_t secondHand = (millis() / 1000) % 60; | ||
+ | static uint8_t lastSecond = 99; | ||
+ | |||
+ | if( lastSecond != secondHand) { | ||
+ | lastSecond = secondHand; | ||
+ | if( secondHand == 0) { currentPalette = RainbowColors_p; currentBlending = LINEARBLEND; } | ||
+ | if( secondHand == 10) { currentPalette = RainbowStripeColors_p; currentBlending = NOBLEND; } | ||
+ | if( secondHand == 15) { currentPalette = RainbowStripeColors_p; currentBlending = LINEARBLEND; } | ||
+ | if( secondHand == 20) { SetupPurpleAndGreenPalette(); currentBlending = LINEARBLEND; } | ||
+ | if( secondHand == 25) { SetupTotallyRandomPalette(); currentBlending = LINEARBLEND; } | ||
+ | if( secondHand == 30) { SetupBlackAndWhiteStripedPalette(); currentBlending = NOBLEND; } | ||
+ | if( secondHand == 35) { SetupBlackAndWhiteStripedPalette(); currentBlending = LINEARBLEND; } | ||
+ | if( secondHand == 40) { currentPalette = CloudColors_p; currentBlending = LINEARBLEND; } | ||
+ | if( secondHand == 45) { currentPalette = PartyColors_p; currentBlending = LINEARBLEND; } | ||
+ | if( secondHand == 50) { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND; } | ||
+ | if( secondHand == 55) { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // This function fills the palette with totally random colors. | ||
+ | void SetupTotallyRandomPalette() | ||
+ | { | ||
+ | for( int i = 0; i < 16; i++) { | ||
+ | currentPalette[i] = CHSV( random8(), 255, random8()); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // This function sets up a palette of black and white stripes, | ||
+ | // using code. Since the palette is effectively an array of | ||
+ | // sixteen CRGB colors, the various fill_* functions can be used | ||
+ | // to set them up. | ||
+ | void SetupBlackAndWhiteStripedPalette() | ||
+ | { | ||
+ | // 'black out' all 16 palette entries... | ||
+ | fill_solid( currentPalette, 16, CRGB::Black); | ||
+ | // and set every fourth one to white. | ||
+ | currentPalette[0] = CRGB::White; | ||
+ | currentPalette[4] = CRGB::White; | ||
+ | currentPalette[8] = CRGB::White; | ||
+ | currentPalette[12] = CRGB::White; | ||
+ | |||
+ | } | ||
+ | |||
+ | // This function sets up a palette of purple and green stripes. | ||
+ | void SetupPurpleAndGreenPalette() | ||
+ | { | ||
+ | CRGB purple = CHSV( HUE_PURPLE, 255, 255); | ||
+ | CRGB green = CHSV( HUE_GREEN, 255, 255); | ||
+ | CRGB black = CRGB::Black; | ||
+ | |||
+ | currentPalette = CRGBPalette16( | ||
+ | green, green, black, black, | ||
+ | purple, purple, black, black, | ||
+ | green, green, black, black, | ||
+ | purple, purple, black, black ); | ||
+ | } | ||
+ | |||
+ | |||
+ | // This example shows how to set up a static color palette | ||
+ | // which is stored in PROGMEM (flash), which is almost always more | ||
+ | // plentiful than RAM. A static PROGMEM palette like this | ||
+ | // takes up 64 bytes of flash. | ||
+ | const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM = | ||
+ | { | ||
+ | CRGB::Red, | ||
+ | CRGB::Gray, // 'white' is too bright compared to red and blue | ||
+ | CRGB::Blue, | ||
+ | CRGB::Black, | ||
+ | |||
+ | CRGB::Red, | ||
+ | CRGB::Gray, | ||
+ | CRGB::Blue, | ||
+ | CRGB::Black, | ||
+ | |||
+ | CRGB::Red, | ||
+ | CRGB::Red, | ||
+ | CRGB::Gray, | ||
+ | CRGB::Gray, | ||
+ | CRGB::Blue, | ||
+ | CRGB::Blue, | ||
+ | CRGB::Black, | ||
+ | CRGB::Black | ||
+ | }; |
Revision as of 20:20, 10 November 2017
This is the instruction page for the NeoPixel Workshop ran by Andy Miller on 11/11/17
Software to install
You will need to install the following programs and drivers
Download and install the Arduino IDE V 1.8.5 (or newer).
Do not download/install the web IDE!
https://www.arduino.cc/en/Main/Software
There are some step by step instructions here: https://www.arduino.cc/en/Guide/HomePage
Download and install the CH340 USB drivers for the Arduino clones:
https://sparks.gogo.co.nz/ch340.html
Note: The CH340 chip is a USB to serial chip used frequently on Arduino clones. Official Arduinos use the FTDI chip. Those drivers are included in the Arduino software install.
Download the FastLED library from:
https://github.com/FastLED/FastLED/releases Current version is 3.1.6
We will show you how to install this library. The FastLED library is used to control NeoPixels! The official page for the FASTLED library is:
https://github.com/FastLED/FastLED/tree/v3.1.6
Code
Color Pallet
- include <FastLED.h>
- define LED_PIN 6
- define NUM_LEDS 60
- define BRIGHTNESS 96
- define LED_TYPE WS2811
- define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
- define UPDATES_PER_SECOND 100
// FastLED provides a few pre-configured color palettes, and makes it
// extremely easy to make up your own color schemes with palettes.
//
// Some notes on the more abstract 'theory and practice' of
// FastLED compact palettes are at the bottom of this file.
CRGBPalette16 currentPalette; TBlendType currentBlending;
extern CRGBPalette16 myRedWhiteBluePalette; extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;
void setup() {
delay( 3000 ); // power-up safety delay FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness( BRIGHTNESS ); currentPalette = RainbowColors_p; currentBlending = LINEARBLEND;
}
void loop()
{
ChangePalettePeriodically(); static uint8_t startIndex = 0; startIndex = startIndex + 1; /* motion speed */ FillLEDsFromPaletteColors( startIndex); FastLED.show(); FastLED.delay(1000 / UPDATES_PER_SECOND);
}
void FillLEDsFromPaletteColors( uint8_t colorIndex) {
uint8_t brightness = 255; for( int i = 0; i < NUM_LEDS; i++) { leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending); colorIndex += 3; }
}
void ChangePalettePeriodically() {
uint8_t secondHand = (millis() / 1000) % 60; static uint8_t lastSecond = 99; if( lastSecond != secondHand) { lastSecond = secondHand; if( secondHand == 0) { currentPalette = RainbowColors_p; currentBlending = LINEARBLEND; } if( secondHand == 10) { currentPalette = RainbowStripeColors_p; currentBlending = NOBLEND; } if( secondHand == 15) { currentPalette = RainbowStripeColors_p; currentBlending = LINEARBLEND; } if( secondHand == 20) { SetupPurpleAndGreenPalette(); currentBlending = LINEARBLEND; } if( secondHand == 25) { SetupTotallyRandomPalette(); currentBlending = LINEARBLEND; } if( secondHand == 30) { SetupBlackAndWhiteStripedPalette(); currentBlending = NOBLEND; } if( secondHand == 35) { SetupBlackAndWhiteStripedPalette(); currentBlending = LINEARBLEND; } if( secondHand == 40) { currentPalette = CloudColors_p; currentBlending = LINEARBLEND; } if( secondHand == 45) { currentPalette = PartyColors_p; currentBlending = LINEARBLEND; } if( secondHand == 50) { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND; } if( secondHand == 55) { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; } }
}
// This function fills the palette with totally random colors. void SetupTotallyRandomPalette() {
for( int i = 0; i < 16; i++) { currentPalette[i] = CHSV( random8(), 255, random8()); }
}
// This function sets up a palette of black and white stripes, // using code. Since the palette is effectively an array of // sixteen CRGB colors, the various fill_* functions can be used // to set them up. void SetupBlackAndWhiteStripedPalette() {
// 'black out' all 16 palette entries... fill_solid( currentPalette, 16, CRGB::Black); // and set every fourth one to white. currentPalette[0] = CRGB::White; currentPalette[4] = CRGB::White; currentPalette[8] = CRGB::White; currentPalette[12] = CRGB::White;
}
// This function sets up a palette of purple and green stripes. void SetupPurpleAndGreenPalette() {
CRGB purple = CHSV( HUE_PURPLE, 255, 255); CRGB green = CHSV( HUE_GREEN, 255, 255); CRGB black = CRGB::Black; currentPalette = CRGBPalette16( green, green, black, black, purple, purple, black, black, green, green, black, black, purple, purple, black, black );
}
// This example shows how to set up a static color palette
// which is stored in PROGMEM (flash), which is almost always more
// plentiful than RAM. A static PROGMEM palette like this
// takes up 64 bytes of flash.
const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM =
{
CRGB::Red, CRGB::Gray, // 'white' is too bright compared to red and blue CRGB::Blue, CRGB::Black, CRGB::Red, CRGB::Gray, CRGB::Blue, CRGB::Black, CRGB::Red, CRGB::Red, CRGB::Gray, CRGB::Gray, CRGB::Blue, CRGB::Blue, CRGB::Black, CRGB::Black
};