#light #sensor #embedded-hal-driver #gesture #proximity

no-std apds9960

Platform-agnostic Rust driver for the APDS9960 digital proximity, ambient light, RGB and gesture sensor

1 unstable release

Uses old Rust 2015

0.1.0 Dec 21, 2018

#779 in Embedded development

Download history 20/week @ 2024-02-19 13/week @ 2024-02-26 10/week @ 2024-03-04 21/week @ 2024-03-11 7/week @ 2024-03-18 9/week @ 2024-03-25 24/week @ 2024-04-01

63 downloads per month
Used in adafruit-nrf52840-sense

MIT/Apache

43KB
547 lines

Rust APDS9960 Digital Proximity, Ambient Light, RGB and Gesture Sensor Driver

crates.io Docs Build Status Coverage Status Maintenance Intention

This is a platform agnostic Rust driver for the APDS9960 digital proximity, ambient light, RGB and gesture sensor, based on the embedded-hal traits.

This driver allows you to:

  • Enable/disable the sensor. See: enable().
  • Enable/disable delay between proximity and / or color / ambient light cycles. See: enable_wait().
  • Enable/disable long delay between proximity and / or color / ambient light cycles. See: enable_wait_long().
  • Set the waiting time between proximity and / or color / ambient light cycles. See: set_wait_time().
  • Force an interrupt. See: force_interrupt().
  • Clear all non-gesture interrupts. See: clear_interrupts().
  • Read the device ID. See: read_device_id().
  • Proximity:
    • Enable/disable the proximity sensor. See: enable_proximity().
    • Enable/disable proximity interrupt generation. See: enable_proximity_interrupts().
    • Enable/disable proximity saturation interrupt generation. See: enable_proximity_saturation_interrupts().
    • Read the proximity data. See: read_proximity().
    • Check whether the proximity data is valid. See: is_proximity_data_valid().
    • Set the proximity interrupt low/high thresholds. See: set_proximity_low_threshold().
    • Set the proximity offsets. See: set_proximity_offsets().
    • Clear proximity interrupt. See: clear_proximity_interrupt().
  • Color / ambient light:
    • Enable/disable the color / ambient light sensor. See: enable_light().
    • Enable/disable ambient light interrupt generation. See: enable_light_interrupts().
    • Enable/disable ambient light saturation interrupt generation. See: enable_light_saturation_interrupts().
    • Check whether the color / ambient light data is valid. See: is_light_data_valid().
    • Read the color / ambient light data. See: read_light().
    • Set the color / ambient light integration time. See: set_light_integration_time().
    • Set the clear light channel interrupt low/high thresholds. See: set_light_low_threshold().
    • Clear ambient light interrupt. See: clear_light_interrupt().
  • Gesture detection:
    • Enable/disable gesture detection. See: enable_gesture().
    • Enable/disable gesture mode. See: enable_gesture_mode().
    • Enable/disable gesture interrupts. See: enable_gesture_interrupts().
    • Read whether there is valid gesture data available. See: is_gesture_data_valid().
    • Read the amount of gesture data available. See: read_gesture_data_level().
    • Set the threshold of amount of available gesture data. See: set_gesture_data_level_threshold().
    • Read whether the gesture data has overflown. See: has_gesture_data_overflown().
    • Read the gesture data. See: read_gesture_data().
    • Set the gesture proximity entry/exit thresholds. See: set_gesture_proximity_entry_threshold().
    • Set the gesture offsets. See: set_gesture_offsets().

The device

The APDS-9960 device features advanced gesture detection, proximity detection, digital ambient light sense (ALS) and color sense (RGBC).

The communication is done through an I2C bidirectional bus.

Datasheet:

Usage example

Please find additional examples in this repository: apds9960-examples

extern crate embedded_hal;
extern crate linux_embedded_hal;
#[macro_use]
extern crate nb;
extern crate apds9960;

use apds9960::Apds9960;
use linux_embedded_hal::I2cdev;

fn main() {
    let dev = I2cdev::new("/dev/i2c-1").unwrap();
    let mut sensor = Apds9960::new(dev);
    sensor.enable().unwrap();
    sensor.enable_proximity().unwrap();
    loop {
        let p = block!(sensor.read_proximity()).unwrap();
        println!("Proximity: {}", p);
    }
}

License

Licensed under either of

Contributing

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~71KB