details
In this tutorial, Author will hook up a gesture sensor to a dizmo. Author is going to use an Arduino and WebSockets.
Parts needed
- Sparkfun APDS-9660 Gesture Sensor
- Arduino Ethernet
- Level converter
- Breadboard
- Jumper cables
- Serial to USB Adaptor: https://www.sparkfun.com/products/9716
Code
#include <SPI.h>
#include <Wire.h>
#include <Ethernet.h>
#include <SparkFun_APDS9960.h>
// Enabe debug tracing to Serial port.
#define DEBUG true
#define STATICIP false
// Pins
#define APDS9960_INT 2 // Needs to be an interrupt pin
// Here we define a maximum framelength to 64 bytes. Default is 256.
#define MAX_FRAME_LENGTH 64
#include <WebSocket.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x91, 0x8C };
#if STATICIP
byte ip[] = {10,0,1,100};
#endif
// Create a Websocket server
WebSocketServer wsServer;
void onConnect(WebSocket &socket) {
Serial.println("onConnect called");
}
// You must have at least one function with the following signature.
// It will be called by the server when a data frame is received.
void onData(WebSocket &socket, char* dataString, byte frameLength) {
#ifdef DEBUG
Serial.print("Got data: ");
Serial.write((unsigned char*)dataString, frameLength);
Serial.println();
#endif
// Just echo back data for fun.
socket.send(dataString, strlen(dataString));
}
void onDisconnect(WebSocket &socket) {
Serial.println("onDisconnect called");
}
// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
#ifdef DEBUG
Serial.begin(9600);
#endif
#if STATICIP
Ethernet.begin(mac, ip);
#else
if (Ethernet.begin(mac) == 0) {
#if DEBUG
Serial.println("Unable to set server IP address using DHCP");
#endif
for(;;)
;
}
#if DEBUG
// report the dhcp IP address:
Serial.println(Ethernet.localIP());
#endif
#endif
wsServer.registerConnectCallback(&onConnect);
wsServer.registerDataCallback(&onData);
wsServer.registerDisconnectCallback(&onDisconnect);
wsServer.begin();
delay(100); // Give Ethernet time to get ready
// Set interrupt pin as input
pinMode(APDS9960_INT, INPUT);
// 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!"));
}
}
void interruptRoutine() {
isr_flag = 1;
}
String handleGesture() {
String gesture;
gesture="NONE ";
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP ");
gesture="UP";
break;
case DIR_DOWN:
Serial.println("DOWN");
gesture="DOWN ";
break;
case DIR_LEFT:
Serial.println("LEFT");
gesture="LEFT ";
break;
case DIR_RIGHT:
Serial.println("RIGHT");
gesture="RIGHT";
break;
case DIR_NEAR:
Serial.println("NEAR");
gesture="NEAR ";
break;
case DIR_FAR:
Serial.println("FAR");
gesture="FAR ";
break;
default:
Serial.println("NONE");
gesture="NONE ";
}
}
return gesture;
}
String rv;
char gest[6];
void loop() {
// Should be called for each loop.
wsServer.listen();
// Do other stuff here, but don't hang or cause long delays.
delay(100);
if( isr_flag == 1 ) {
detachInterrupt(0);
rv=handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
if (rv!="NONE ") {
if (wsServer.connectionCount() > 0) {
rv.toCharArray(gest, 6);
wsServer.send(gest, 6);
}
}
}
}
Result
If hold your finger a few centimeters above the sensor and move it left or right .. You should see the sensed gesture in this project
For more detailed information, refer to this url.
https://www.dizmo.com/arduino-gesture-sensor-tutorial/
Source : https://www.dizmo.com/arduino-gesture-sensor-tutorial/
COMMENTS