It's a great idea to get your software all set up and loaded onto your board right away, to make testing your connections easier later on.

To get the code running you'll need:

  1. Arduino IDE (1.8 or newer preferred)
  2. Adafruit Board support for Gemma M0
  3. Arduino libraries: FastLED, Adafruit_FreeTouch, Adafruit_NeoPixel

1. Arduino IDE

If you’re not using a recent version of the Arduino IDE (1.8.5 or newer), this would be a good time to upgrade.  If this is your first time using Arduino, head over to this guide to get it installed.  It's free and fairly simple to get set up.

2. Board Support

You'll need to tell the Arduino IDE which board you're using.  This takes just a few minutes of setup, and you'll only need to do it once. 

Here is a step-by-step tutorial for setting up Gemma M0

3. Libraries

All three libraries can be installed using the Arduino Library Manager — use Sketch→Include Library→Manage Libraries… and search for all or part of the library’s name, then click “Install.”

Look for:

  • FastLED
  • Adafruit_FreeTouch
  • Adafruit_NeoPixel

Adafruit_NeoPixel isn’t absolutely required for this project, but it’s handy to have installed in case you have problems with FastLED. Troubleshooting the basics is a little easier with Adafruit_NeoPixel.

Upload the Code

Plug your microcontroller into your computer with a USB cable.  In the Arduino IDE, go to Tools > Boards and select the name of the board.  Then go to Tools > Port and select the board there too.  (If it's not showing up there, be sure your microcontroller is plugged into your computer via USB)

// SPDX-FileCopyrightText: 2018 Erin St. Blaine for Adafruit Industries
// SPDX-License-Identifier: MIT

#include "Adafruit_FreeTouch.h"
#include "FastLED.h"

#define NEOPIXEL_PIN 1
#define LED_PIN 0
#define NUM_LEDS    12

#define LED_TYPE    WS2812

int touch = 500;    // Change this variable to something between your capacitive touch serial readouts for on and off

long oldState = 0;
int gHue=0;

Adafruit_FreeTouch qt_1 = Adafruit_FreeTouch(CAPTOUCH_PIN, OVERSAMPLE_4, RESISTOR_50K, FREQ_MODE_NONE);
//Adafruit_FreeTouch qt_2 = Adafruit_FreeTouch(A2, OVERSAMPLE_4, RESISTOR_50K, FREQ_MODE_NONE);

void setup() {

  if (! qt_1.begin())  
    Serial.println("Failed to begin qt on pin A1");
   pinMode(LED_PIN, OUTPUT);  //initialize the LED pin

   FastLED.addLeds<WS2812, NEOPIXEL_PIN, COLOR_ORDER>(leds, NUM_LEDS);  // Set up neopixels with FastLED
   FastLED.setMaxPowerInVoltsAndMilliamps(3,350);  //Constrain FastLED's power usage

void loop() {
  Serial.write(' ');

void checkpress() {

// Get current button state.
    long newState =  qt_1.measure();  
   if (newState > touch && oldState < touch) {
    // Short delay to debounce button.
    // Check if button is still low after debounce.
    long newState =  qt_1.measure(); }

  if (newState > touch ) {  
     digitalWrite(LED_PIN, HIGH);

    else {
      digitalWrite(LED_PIN, LOW);

  // Set the last button state to the old state.
  oldState = newState;

  // do some periodic updates
  EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow

void rainbow() 
  // FastLED's built-in rainbow generator
  fill_rainbow( leds, NUM_LEDS, gHue, 7);;

void dark()
  for(int i = 0; i < NUM_LEDS; i++) { 
  leds[i] = CRGB::Black;;

This guide was first published on Jan 26, 2018. It was last updated on May 21, 2024.

This page (Software) was last updated on May 21, 2024.

Text editor powered by tinymce.