be334245ff
That makes it easier to enable/disable sensors. Also added support for APDS9930
157 lines
No EOL
4.1 KiB
C++
157 lines
No EOL
4.1 KiB
C++
/****************************************************************
|
|
ProximityInterrupt.ino
|
|
APDS-9930 Ambient light and proximity sensor
|
|
Davide Depau
|
|
December 11, 2015
|
|
https://github.com/Davideddu/APDS9930
|
|
|
|
Shawn Hymel @ SparkFun Electronics
|
|
October 24, 2014
|
|
https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor
|
|
|
|
Tests the proximity interrupt abilities of the APDS-9930.
|
|
Configures the APDS-9930 over I2C and waits for an external
|
|
interrupt based on high or low proximity conditions. Move your
|
|
hand near the sensor and watch the LED on pin 13.
|
|
|
|
Hardware Connections:
|
|
|
|
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
|
|
|
Arduino Pin APDS-9930 Board Function
|
|
|
|
3.3V VCC Power
|
|
GND GND Ground
|
|
A4 SDA I2C Data
|
|
A5 SCL I2C Clock
|
|
2 INT Interrupt
|
|
13 - LED
|
|
|
|
Resources:
|
|
Include Wire.h and APDS9930.h
|
|
|
|
Development environment specifics:
|
|
Written in Arduino 1.6.5
|
|
Tested with Arduino Uno and Mega
|
|
|
|
This code is beerware; if you see me (or any other SparkFun
|
|
employee) at the local, and you've found our code helpful, please
|
|
buy us a round!
|
|
|
|
Distributed as-is; no warranty is given.
|
|
****************************************************************/
|
|
|
|
#define DUMP_REGS
|
|
|
|
#include <Wire.h>
|
|
#include <APDS9930.h>
|
|
|
|
// Pins
|
|
#define APDS9930_INT 2 // Needs to be an interrupt pin
|
|
#define LED_PIN 13 // LED for showing interrupt
|
|
|
|
// Constants
|
|
#define PROX_INT_HIGH 600 // Proximity level for interrupt
|
|
#define PROX_INT_LOW 0 // No far interrupt
|
|
|
|
// Global variables
|
|
APDS9930 apds = APDS9930();
|
|
uint16_t proximity_data = 0;
|
|
volatile bool isr_flag = false;
|
|
|
|
void setup() {
|
|
|
|
// Set LED as output
|
|
pinMode(LED_PIN, OUTPUT);
|
|
pinMode(APDS9930_INT, INPUT);
|
|
|
|
// Initialize Serial port
|
|
Serial.begin(9600);
|
|
Serial.println();
|
|
Serial.println(F("------------------------------"));
|
|
Serial.println(F("APDS-9930 - ProximityInterrupt"));
|
|
Serial.println(F("------------------------------"));
|
|
|
|
// Initialize interrupt service routine
|
|
attachInterrupt(0, interruptRoutine, FALLING);
|
|
|
|
// Initialize APDS-9930 (configure I2C and initial values)
|
|
if ( apds.init() ) {
|
|
Serial.println(F("APDS-9930 initialization complete"));
|
|
} else {
|
|
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
|
}
|
|
|
|
// Adjust the Proximity sensor gain
|
|
if ( !apds.setProximityGain(PGAIN_2X) ) {
|
|
Serial.println(F("Something went wrong trying to set PGAIN"));
|
|
}
|
|
|
|
// Set proximity interrupt thresholds
|
|
if ( !apds.setProximityIntLowThreshold(PROX_INT_LOW) ) {
|
|
Serial.println(F("Error writing low threshold"));
|
|
}
|
|
if ( !apds.setProximityIntHighThreshold(PROX_INT_HIGH) ) {
|
|
Serial.println(F("Error writing high threshold"));
|
|
}
|
|
|
|
// Start running the APDS-9930 proximity sensor (interrupts)
|
|
if ( apds.enableProximitySensor(true) ) {
|
|
Serial.println(F("Proximity sensor is now running"));
|
|
} else {
|
|
Serial.println(F("Something went wrong during sensor init!"));
|
|
}
|
|
|
|
#ifdef DUMP_REGS
|
|
/* Register dump */
|
|
uint8_t reg;
|
|
uint8_t val;
|
|
|
|
for(reg = 0x00; reg <= 0x19; reg++) {
|
|
if( (reg != 0x10) && \
|
|
(reg != 0x11) )
|
|
{
|
|
apds.wireReadDataByte(reg, val);
|
|
Serial.print(reg, HEX);
|
|
Serial.print(": 0x");
|
|
Serial.println(val, HEX);
|
|
}
|
|
}
|
|
apds.wireReadDataByte(0x1E, val);
|
|
Serial.print(0x1E, HEX);
|
|
Serial.print(": 0x");
|
|
Serial.println(val, HEX);
|
|
#endif
|
|
|
|
}
|
|
|
|
void loop() {
|
|
|
|
// If interrupt occurs, print out the proximity level
|
|
if ( isr_flag ) {
|
|
|
|
// Read proximity level and print it out
|
|
if ( !apds.readProximity(proximity_data) ) {
|
|
Serial.println("Error reading proximity value");
|
|
} else {
|
|
Serial.print("Proximity detected! Level: ");
|
|
Serial.println(proximity_data);
|
|
}
|
|
|
|
// Turn on LED for a half a second
|
|
digitalWrite(LED_PIN, HIGH);
|
|
delay(500);
|
|
digitalWrite(LED_PIN, LOW);
|
|
|
|
// Reset flag and clear APDS-9930 interrupt (IMPORTANT!)
|
|
isr_flag = false;
|
|
if ( !apds.clearProximityInt() ) {
|
|
Serial.println("Error clearing interrupt");
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void interruptRoutine() {
|
|
isr_flag = true;
|
|
} |