Evan Rust
Published © GPL3+

Motion Controlled Color Changer!

Using the power of motion, swipe in 4 directions to change the color of an LED!

BeginnerFull instructions provided1 hour31,197
Motion Controlled Color Changer!

Things used in this project

Hardware components

Sparkfun APDS-9960
×1
Jumper wires (generic)
Jumper wires (generic)
×1
Arduino UNO
Arduino UNO
×1
Resistor 4.75k ohm
Resistor 4.75k ohm
×1
RGB Diffused Common Cathode
RGB Diffused Common Cathode
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Schematics

Schematic

Connect as-is.

Code

Arduino Code

C/C++
Copy and Paste
#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Pins
#define APDS9960_INT    2 // Needs to be an interrupt pin

// Constants
int red_pin = A0;
int green_pin = A1;
int blue_pin = A2;

int onOff_flag = 0;

//Make the array to loop through
int colorNumber = 0;

// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {

  // Set interrupt pin as input
  pinMode(APDS9960_INT, INPUT);

  // Initialize Serial port
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));
  
  // Initialize interrupt service routine
  attachInterrupt(0, interruptRoutine, FALLING);

  // Initialize APDS-9960 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }
  
  // Start running the APDS-9960 gesture sensor engine
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("Gesture sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during gesture sensor init!"));
  }
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  analogWrite(A0, 0);
  analogWrite(A1, 0);
  analogWrite(A2, 0);
}

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
  if (onOff_flag == 1){
  switch (colorNumber){
    case 0:
    Serial.println("red");
      analogWrite(red_pin, 255);
      analogWrite(green_pin, 0);
      analogWrite(blue_pin, 0);
      break;
    case 1:
    Serial.println("baby blue");
      analogWrite(red_pin, 255);
      analogWrite(green_pin, 153);
      analogWrite(blue_pin, 204);
      break;
    case 2:
    Serial.println("dark blue");
      analogWrite(red_pin, 100);
      analogWrite(green_pin, 0);
      analogWrite(blue_pin, 170);
      break;
    case 3:
    Serial.println("green");
      analogWrite(red_pin, 0);
      analogWrite(green_pin, 255);
      analogWrite(blue_pin, 0);
      break;
    case 4:
    Serial.println("blue");
      analogWrite(red_pin, 0);
      analogWrite(green_pin, 0);
      analogWrite(blue_pin, 255);
      break;
    case 5:
    Serial.println("violet");
      analogWrite(red_pin, 191);
      analogWrite(green_pin, 0);
      analogWrite(blue_pin, 255);
      break;
  }
}
else if(onOff_flag == 0){
  analogWrite(red_pin, 0);
  analogWrite(green_pin, 0);
  analogWrite(blue_pin, 0);
}
delay(1000);
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        onOff_flag = 1;
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        onOff_flag = 0;
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        if(onOff_flag == 1){
          if(colorNumber>0){
            colorNumber -= 1;
            Serial.println(colorNumber);
        }
        else if(colorNumber < 1){
          colorNumber = 5;
          Serial.println(colorNumber);
        }
        }
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        if(onOff_flag == 1){
          if(colorNumber < 5){
            colorNumber += 1;
            Serial.println(colorNumber);
          }
          else if(colorNumber > 4){
            colorNumber = 0;
            Serial.println(colorNumber);
          }
        }
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Credits

Evan Rust

Evan Rust

120 projects • 1054 followers
IoT, web, and embedded systems enthusiast. Contact me for product reviews or custom project requests.

Comments