Arduino and APDS-9930 sensor connection example

The APDS-9930 provides digital ambient light sensing, IR LED and a complete proximity detection system in a single 8 pin package. The proximity function offers plug and play detection to 100 mm thus eliminating the need for factory calibration of the end equipment or sub-assembly. The proximity detection feature operates well from bright sunlight to dark rooms.
The wide dynamic range also allows for operation in short distance detection behind dark glass such as a cell phone.
In addition, an internal state machine provides the ability to put the device into a low power mode in between ALS and proximity measurements providing very low average power consumption. The ALS provides a photopic response to light intensity in very low light condition or behind a dark faceplate.

The proximity function is targeted specifically towards near field proximity applications. In cell phones, the proximity detection can detect when the user positions the phone close to their ear. The device is fast enough to provide proximity information at a high repetition rate needed when answering a phone call. This provides both improved “green” power saving capability and the added security to lock the computer when the user is not present.
The addition of the micro-optics lenses within the module, provide highly efficient transmission and reception of infrared energy which lowers overall power dissipation.

Features

– ALS, IR LED and Proximity Detector in an Optical Module
– Ambient Light Sensing (ALS)
– Approximates Human Eye Response
– Programmable Interrupt Function with Upper and Lower Threshold
– Up to 16-Bit Resolution
– High Sensitivity Operates Behind Darkened Glass
– Low Lux Performance at 0.01 lux Proximity Detection
– Fully Calibrated to 100 mm Detection
– Integrated IR LED and Synchronous LED Driver
– Wait State Power – 90 µA Typical
– Programmable from 2.7 ms to > 8 sec
– Up to 400 kHz (I2C Fast-Mode)
– Dedicated Interrupt Pin

 

Connection and Layout

 

Pin Label Description
VL Optional power to the IR LED. Must be 3.0 – 4.5V
GND  ground.
VCC Must be 2.4 – 3.6V
SDA I2C data
SCL I2C clock
INT External interrupt pin.

 

And now a layout drawing to show this

 

Code

You need to install the following library – https://github.com/Davideddu/APDS9930 .

[codesyntax lang=”cpp”]

/****************************************************************

 Arduino Pin  APDS-9930 Board  Function
 
 3.3V         VCC              Power
 GND          GND              Ground
 A4           SDA              I2C Data
 A5           SCL              I2C Clock
****************************************************************/

#define DUMP_REGS

#include <Wire.h>
#include <APDS9930.h>

// Global Variables
APDS9930 apds = APDS9930();
float ambient_light = 0; // can also be an unsigned long
uint16_t ch0 = 0;
uint16_t ch1 = 1;

void setup() 
{
  
  // Initialize Serial port
  Serial.begin(9600);
  Serial.println();
  
  // 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!"));
  }
  
  // Start running the APDS-9930 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!"));
  }

  // Wait for initialization and calibration to finish
  delay(500);
}


void loop() 
{
  
  // Read the light levels (ambient, red, green, blue)
  if (  !apds.readAmbientLightLux(ambient_light) ||
        !apds.readCh0Light(ch0) || 
        !apds.readCh1Light(ch1) ) {
    Serial.println(F("Error reading light values"));
  } 
  else 
  {
    Serial.print(F("Ambient: "));
    Serial.print(ambient_light);
    Serial.print(F("  Ch0: "));
    Serial.print(ch0);
    Serial.print(F("  Ch1: "));
    Serial.println(ch1);
  }
  
  // Wait 1 second before next reading
  delay(1000);
}

[/codesyntax]

 

Testing

Open the serial monitor and you should see something like this

Ambient: 704.13 Ch0: 743 Ch1: 318
Ambient: 750.47 Ch0: 779 Ch1: 332
Ambient: 716.68 Ch0: 785 Ch1: 334
Ambient: 763.03 Ch0: 791 Ch1: 337
Ambient: 727.30 Ch0: 761 Ch1: 325

 

Links
Non-contact detection of proximity and gesture and posture RGB sensor APDS-9930

Related posts

Arduino and GY-21P readings on a web page

MPL3115A2 sensor readings displayed on a web page

Adafruit Neopixel shield examples