Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /****************************************************************
- 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement