Software Setup
Before you get started, follow the Introducing Gemma M0 guide or Introducing GEMMA guide
FastLED Library
You will also need to install the FastLED library in Arduino (Sketch > Include Library > Manage Libraries...
)
Libraries? Why? What's a Library?
In a nutshell, Arduino libraries have a lot of pre-written functions that make your neopixels easy to command. You can do fancy stuff without being a code guru. Yay Libraries!
FastLED is a fast, efficient, easy-to-use Arduino library for programming addressable LED strips and pixels. It has a lot of features to get your animations up and running fast -- and it has a lot of code samples available if you're just learning to code.
All about Arduino Libraries will tell you everything you ever wanted to know about libraries, including more detailed installation instructions.
Once your curiosity is satiated and your library is installed, copy and paste the code into your Arduino window.
Go to your Tools menu and select Gemma from the list of boards. Plug your Gemma into your computer via the onboard USB port. Press the "reset" button on your Gemma and wait for the blinky red light, then click the upload button in Arduino.
// SPDX-FileCopyrightText: 2018 Mikey Sklar for Adafruit Industries // // SPDX-License-Identifier: MIT #include <FastLED.h> #define LED_PIN 1 // which pin your pixels are connected to #define NUM_LEDS 78 // how many LEDs you have #define BRIGHTNESS 200 // 0-255, higher number is brighter. #define SATURATION 255 // 0-255, 0 is pure white, 255 is fully saturated color #define SPEED 10 // How fast the colors move. Higher numbers = faster motion #define STEPS 2 // How wide the bands of color are. 1 = more like a gradient, 10 = more like stripes #define BUTTON_PIN 2 // button is connected to pin 2 and GND #define COLOR_ORDER GRB // Try mixing up the letters (RGB, GBR, BRG, etc) for a whole new world of color combinations CRGB leds[NUM_LEDS]; CRGBPalette16 currentPalette; CRGBPalette16 targetPalette( PartyColors_p ); TBlendType currentBlending; int ledMode = 0; //FastLED comes with several palettes pre-programmed. I like purple a LOT, and so I added a custom purple palette. const TProgmemPalette16 PurpleColors_p PROGMEM = { CRGB::Purple, CRGB::Purple, CRGB::MidnightBlue, CRGB::MidnightBlue, CRGB::Purple, CRGB::Purple, CRGB::BlueViolet, CRGB::BlueViolet, CRGB::DarkTurquoise, CRGB::DarkTurquoise, CRGB::DarkBlue, CRGB::DarkBlue, CRGB::Purple, CRGB::Purple, CRGB::BlueViolet, CRGB::BlueViolet }; unsigned long keyPrevMillis = 0; const unsigned long keySampleIntervalMs = 25; byte longKeyPressCountMax = 80; // 80 * 25 = 2000 ms byte longKeyPressCount = 0; byte prevKeyState = HIGH; // button is active low void setup() { delay( 2000 ); // power-up safety delay FastLED.addLeds<WS2812B, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness( BRIGHTNESS ); currentBlending =LINEARBLEND; pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { byte currKeyState = digitalRead(BUTTON_PIN); if ((prevKeyState == LOW) && (currKeyState == HIGH)) { shortKeyPress(); } prevKeyState = currKeyState; static uint8_t startIndex = 0; startIndex = startIndex + 1; /* motion speed */ switch (ledMode) { case 0: currentPalette = HeatColors_p; //Red & Yellow, Fire Colors break; case 1: currentPalette = ForestColors_p; //Foresty greens and yellows break; case 2: currentPalette = OceanColors_p; //Oceans are pretty and filled with mermaids break; case 3: currentPalette = PurpleColors_p; //My custom palette from above break; case 4: currentPalette = RainbowColors_p; //All the colors! break; case 5: currentPalette = RainbowStripeColors_p; //Rainbow stripes break; case 6: currentPalette = PartyColors_p; //All the colors except the greens, which make people look a bit washed out break; } FillLEDsFromPaletteColors( startIndex); FastLED.show(); FastLED.delay(1000 / SPEED); } void FillLEDsFromPaletteColors( uint8_t colorIndex) { for( int i = 0; i < NUM_LEDS; i++) { leds[i] = ColorFromPalette( currentPalette, colorIndex, BRIGHTNESS, currentBlending); colorIndex += STEPS; } } void shortKeyPress() { ledMode++; if (ledMode > 6) { ledMode=0; } }
Taking a look at the code, you'll see that there are a few variables at the top you can change.
#define NUM_LEDS 78 -- change this number to match the number of LEDs in your scarf.
#define BRIGHTNESS 200 -- change this number to make your scarf brighter (woo hoo!) or dimmer (longer battery life). 0 is totally dark, max bright is 255.
#define SATURATION 255 -- lower number to make the colors more pastel / less saturated. Max is 255.
#define SPEED 10 -- 10 is kind of a slow crawl of color. Higher numbers make it move faster.
#define STEPS 2 -- How wide the bands of color are. 1 = more like a gradient, 10 = more like stripes
You'll also see a custom purple color palette. You can play around with this and change it to whichever colors you like. All the supported color names can be found in the keywords.txt document you downloaded along with the FastLED library.
If you encounter trouble…
Any time you hit a roadblock with a neopixel project, we’ll usually ask that you start with the “strandtest” example from our own Adafruit_NeoPixel library. This helps us narrow down whether it’s a hardware or software issue. The library is installed similarly to FastLED or any other in Arduino (Sketch > Include Library > Manage Libraries...
)
You’ll find the strandtest example under File→Sketchbook→Libraries→Adafruit_NeoPixel→strandtest
If strandtest fails to run, this suggests a hardware issue…for example, connecting to the wrong Gemma pin.
If you’re new to Arduino programming and LEDs, we usually suggest starting with the Adafruit_NeoPixel library…it’s pretty basic, the strip declaration is more conventional, and we can stay on top of keeping it compatible with our own products and the most mainstream Arduino boards.
As FastLED is a more “bleeding edge” third-party library, we can’t always guarantee compatibility across versions or with specific boards. You can find help through their community on Google+. This is potent stuff, written by people with a deep appreciation for LED art, and we wanted to showcase it.