/**************************************************************** AmbientLightInterrupt.ino APDS-9960 RGB and Gesture Sensor Shawn Hymel @ SparkFun Electronics October 24, 2014 https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor Tests the ambient light interrupt abilities of the APDS-9960. Configures the APDS-9960 over I2C and waits for an external interrupt based on high or low light conditions. Try covering the sensor with your hand or bringing the sensor close to a bright light source. You might need to adjust the LIGHT_INT_HIGH and LIGHT_INT_LOW values to get the interrupt to work correctly. Hardware Connections: IMPORTANT: The APDS-9960 can only accept 3.3V! Arduino Pin APDS-9960 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 SparkFun_APDS-9960.h Development environment specifics: Written in Arduino 1.0.5 Tested with SparkFun Arduino Pro Mini 3.3V 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. ****************************************************************/ #include #include // Pins #define APDS9960_INT 2 // Needs to be an interrupt pin #define LED_PIN 13 // LED for showing interrupt // Constants #define LIGHT_INT_HIGH 1000 // High light level for interrupt #define LIGHT_INT_LOW 10 // Low light level for interrupt // Global variables SparkFun_APDS9960 apds = SparkFun_APDS9960(); uint16_t ambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0; int isr_flag = 0; uint16_t threshold = 0; void setup() { // Set LED as output pinMode(LED_PIN, OUTPUT); pinMode(APDS9960_INT, INPUT); // Initialize Serial port Serial.begin(9600); Serial.println(); Serial.println(F("-------------------------------------")); Serial.println(F("SparkFun APDS-9960 - Light Interrupts")); 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!")); } // Set high and low interrupt thresholds if ( !apds.setLightIntLowThreshold(LIGHT_INT_LOW) ) { Serial.println(F("Error writing low threshold")); } if ( !apds.setLightIntHighThreshold(LIGHT_INT_HIGH) ) { Serial.println(F("Error writing high threshold")); } // Start running the APDS-9960 light sensor (no interrupts) if ( apds.enableLightSensor(false) ) { Serial.println(F("Light sensor is now running")); } else { Serial.println(F("Something went wrong during light sensor init!")); } // Read high and low interrupt thresholds if ( !apds.getLightIntLowThreshold(threshold) ) { Serial.println(F("Error reading low threshold")); } else { Serial.print(F("Low Threshold: ")); Serial.println(threshold); } if ( !apds.getLightIntHighThreshold(threshold) ) { Serial.println(F("Error reading high threshold")); } else { Serial.print(F("High Threshold: ")); Serial.println(threshold); } // Enable interrupts if ( !apds.setAmbientLightIntEnable(1) ) { Serial.println(F("Error enabling interrupts")); } // Wait for initialization and calibration to finish delay(500); } void loop() { // If interrupt occurs, print out the light levels if ( isr_flag == 1 ) { // Read the light levels (ambient, red, green, blue) and print if ( !apds.readAmbientLight(ambient_light) || !apds.readRedLight(red_light) || !apds.readGreenLight(green_light) || !apds.readBlueLight(blue_light) ) { Serial.println("Error reading light values"); } else { Serial.print("Interrupt! Ambient: "); Serial.print(ambient_light); Serial.print(" R: "); Serial.print(red_light); Serial.print(" G: "); Serial.print(green_light); Serial.print(" B: "); Serial.println(blue_light); } // Turn on LED for a half a second digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); // Reset flag and clear APDS-9960 interrupt (IMPORTANT!) isr_flag = 0; if ( !apds.clearAmbientLightInt() ) { Serial.println("Error clearing interrupt"); } } } void interruptRoutine() { isr_flag = 1; }