Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
10 years ago.
SparkFun_APDS9960
Do you have an example main program that shows how to use your library: SparkFun_APDS9960? If so, I could use the help.
Question relating to:
1 Answer
10 years ago.
Hi Marc,
yes, i have a small Test-Program for the library. I did it for the LPC11U68 board and it uses my adapted SparkFun-MicroOLED library for display of the gestures on a 64 x 48 pixel OLED screen, but you can easily change the Test-Program for a different mbed-platform and use serial for gesture detection output.
You can also have a look at this youtube-video from sparkfun, that explains the 6 gestures implemented in the library:
If you like to have examples for use of the RGB, ambient light and proximity sensing, you can look at these Arduino code examples from SparkFun. The programs should be fairly easy to adapt for mbed, as most or all of the hardware specific stuff is in the library.
My gesture detection Test-Program
#include "mbed.h"
#include "SparkFun_APDS9960.h"
#include "SFE_MicroOLED.h"
// Constants
// Global Variables and forward declarations
InterruptIn apds_int(P1_24);
SPI my_spi(P0_9, P0_8, P1_29);
MicroOLED uView(my_spi, P2_3, P1_28, P1_25);
I2C my_i2c(P0_5, P0_4);
SparkFun_APDS9960 apds = SparkFun_APDS9960(my_i2c);
volatile int isr_flag = 0;
void interruptRoutine();
void handleGesture();
void drawArrowUp();
void drawArrowDown();
void drawArrowLeft();
void drawArrowRight();
void drawCircle();
void drawX();
int main() {
// Initialize MicroView
uView.init(0, 8000000);
uView.clear(PAGE);
// Initialize interrupt service routine
apds_int.mode(PullUp);
apds_int.fall(&interruptRoutine);
apds_int.disable_irq();
uView.setFontType(0);
wait_ms(500);
// Initialize APDS-9960 (configure I2C and initial values)
if ( apds.init(400000) ) {
uView.puts("INIT OK!\n");
} else {
uView.puts("I-ERROR!\n");
}
// Start running the gesture sensor engine (with interrupts)
if ( apds.enableGestureSensor(true) ) {
uView.puts("Gest OK!");
} else {
uView.puts("G-ERROR!");
}
uView.display();
// Wait for initialization and calibration to finish
wait_ms(2000);
uView.clear(PAGE);
// Draw title
uView.setCursor(16, 0);
uView.puts("Swipe!");
uView.display();
apds_int.enable_irq();
while(1) {
// If interrupt, display gesture on MicroOLED
if( isr_flag == 1 ) {
apds_int.disable_irq();
handleGesture();
isr_flag = 0;
wait_ms(500);
uView.display();
apds_int.enable_irq();
}
// Wait before next reading
wait_ms(100);
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
bool do_clear = true;
// Draw symbol based on gesture
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
drawArrowUp();
break;
case DIR_DOWN:
drawArrowDown();
break;
case DIR_LEFT:
drawArrowLeft();
break;
case DIR_RIGHT:
drawArrowRight();
break;
case DIR_NEAR:
drawCircle();
break;
case DIR_FAR:
drawX();
break;
default:
do_clear = false;
}
}
// Let symbol sit on screen for a while, then clear
if ( do_clear ) {
uView.clear(PAGE);
uView.setCursor(16, 0);
uView.puts("Swipe!");
}
}
void drawArrowUp() {
uView.clear(PAGE);
uView.line(27, 43, 37, 43); // Bottom: over 10
uView.line(27, 43, 27, 18); // Legs: Up 25
uView.line(37, 43, 37, 18); // Legs: Up 25
uView.line(27, 18, 17, 18); // Head: Over 10
uView.line(37, 18, 47, 18); // Head: Over 10
uView.line(17, 18, 32, 3); // Tip: Over 14, up 15
uView.line(47, 18, 32, 3); // Tip: Over 14, up 15
uView.display();
}
void drawArrowDown() {
uView.clear(PAGE);
uView.line(27, 5, 37, 5); // Bottom: over 10
uView.line(27, 5, 27, 30); // Legs: Up 25
uView.line(37, 5, 37, 30); // Legs: Up 25
uView.line(27, 30, 17, 30); // Head: Over 10
uView.line(37, 30, 47, 30); // Head: Over 10
uView.line(17, 30, 32, 45); // Tip: Over 14, up 15
uView.line(47, 30, 32, 45); // Tip: Over 14, up 15
uView.display();
}
void drawArrowLeft() {
uView.clear(PAGE);
uView.line(52, 19, 52, 29); // Bottom: up 10
uView.line(52, 19, 27, 19); // Legs: over 25
uView.line(52, 29, 27, 29); // Legs: over 25
uView.line(27, 19, 27, 9); // Head: up 10
uView.line(27, 29, 27, 39); // Head: down 10
uView.line(27, 9, 12, 24); // Tip: over 15, down 14
uView.line(27, 39, 12, 24); // Tip: over 15, down 14
uView.display();
}
void drawArrowRight() {
uView.clear(PAGE);
uView.line(12, 19, 12, 29); // Bottom: up 10
uView.line(12, 19, 37, 19); // Legs: over 25
uView.line(12, 29, 37, 29); // Legs: over 25
uView.line(37, 19, 37, 9); // Head: up 10
uView.line(37, 29, 37, 39); // Head: down 10
uView.line(37, 9, 53, 25); // Tip: over 15, down 14
uView.line(37, 39, 52, 24); // Tip: over 15, down 14
uView.display();
}
void drawCircle() {
uView.clear(PAGE);
uView.circle(32, 24, 20);
uView.display();
}
void drawX() {
uView.clear(PAGE);
uView.line(12, 4, 52, 44);
uView.line(12, 44, 52, 4);
uView.display();
}
Best regards
Neni