APDS9960 Gesture/Proximity/RGB/Light Sensor Module
Nim wrapper for the APDS9960 gesture/color/proximity/light sensor.
The APDS9960 is a versatile sensor that can detect gestures (up, down, left, right), measure proximity, sense RGB color, and measure ambient light levels.
Features:
- Gesture recognition (up, down, left, right)
- Proximity detection (0-255 range)
- RGB color sensing with 16-bit per channel resolution
- Ambient light sensing
- I2C interface only
Example:
import nimphea import nimphea/dev/apds9960 var sensor: Apds9960I2C var config: Apds9960Config # Configure sensor config.color_mode = true config.prox_mode = true config.gesture_mode = false config.transport_config.periph = I2C_1 config.transport_config.scl = getPin(11) config.transport_config.sda = getPin(12) if sensor.init(config) == APDS9960_OK: while true: if sensor.colorDataReady(): var r, g, b, c: uint16 sensor.getColorData(r.addr, g.addr, b.addr, c.addr) let prox = sensor.readProximity() let gesture = sensor.readGesture()
Types
Apds9960Config {.importcpp: "daisy::Apds9960I2C::Config", bycopy.} = object integrationTimeMs* {.importcpp: "integrationTimeMs".}: uint16 adcGain* {.importcpp: "adcGain".}: uint8 ## (0-3): 1x, 4x, 16x, 64x gestureDimensions* {.importcpp: "gestureDimensions".}: uint8 ## (0-2): all, up/down, left/right gestureFifoThresh* {.importcpp: "gestureFifoThresh".}: uint8 ## (0-3): 1, 2, 3, 4 datasets gestureGain* {.importcpp: "gestureGain".}: uint8 ## (0-3): 1x, 2x, 4x, 8x gestureProximityThresh* {.importcpp: "gestureProximityThresh".}: uint16 color_mode* {.importcpp: "color_mode".}: bool prox_mode* {.importcpp: "prox_mode".}: bool gesture_mode* {.importcpp: "gesture_mode".}: bool transport_config* {.importcpp: "transport_config".}: Apds9960I2CTransportConfig
- APDS9960 configuration Source Edit
Apds9960I2C {.importcpp: "daisy::Apds9960I2C", bycopy.} = object
- APDS9960 sensor with I2C transport Source Edit
Apds9960I2CTransport {.importcpp: "daisy::Apds9960I2CTransport", bycopy.} = object
- I2C transport for APDS9960 Source Edit
Apds9960I2CTransportConfig {.importcpp: "daisy::Apds9960I2CTransport::Config", bycopy.} = object periph* {.importcpp: "periph".}: I2CPeripheral speed* {.importcpp: "speed".}: I2CSpeed scl* {.importcpp: "scl".}: Pin sda* {.importcpp: "sda".}: Pin
- I2C transport configuration Source Edit
Apds9960Result {.importcpp: "daisy::Apds9960<daisy::Apds9960I2CTransport>::Result", size: 4.} = enum APDS9960_OK = 0, ## Success APDS9960_ERR = 1 ## Error
- Operation result Source Edit
Consts
APDS9960_ADDRESS = 0x39'u8
- I2C address Source Edit
APDS9960_DOWN = 0x02'u8
- Gesture: Down Source Edit
APDS9960_LEFT = 0x03'u8
- Gesture: Left Source Edit
APDS9960_RIGHT = 0x04'u8
- Gesture: Right Source Edit
APDS9960_UP = 0x01'u8
- Gesture: Up Source Edit
Procs
proc calculateColorTemperature(this: var Apds9960I2C; r, g, b: uint16): uint16 {. importcpp: "#.CalculateColorTemperature(#, #, #)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
-
Convert RGB to color temperature in Kelvin
Returns: Color temperature in degrees Kelvin
Source Edit proc calculateLux(this: var Apds9960I2C; r, g, b: uint16): uint16 {. importcpp: "#.CalculateLux(#, #, #)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
-
Calculate ambient light level in lux
Returns: Illuminance in lux
Source Edit proc clearInterrupt(this: var Apds9960I2C) {.importcpp: "#.ClearInterrupt()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Clear interrupts Source Edit
proc colorDataReady(this: var Apds9960I2C): bool {. importcpp: "#.ColorDataReady()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
-
Check if color data is ready
Returns: true if color data available
Source Edit proc enable(this: var Apds9960I2C; en: bool = true) {.importcpp: "#.Enable(#)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Enable or disable the sensor (power on/off) Source Edit
proc enableColor(this: var Apds9960I2C; en: bool) {. importcpp: "#.EnableColor(#)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Enable or disable color/light sensing Source Edit
proc enableGesture(this: var Apds9960I2C; en: bool) {. importcpp: "#.EnableGesture(#)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Enable or disable gesture recognition Source Edit
proc enableProximity(this: var Apds9960I2C; en: bool) {. importcpp: "#.EnableProximity(#)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Enable or disable proximity detection Source Edit
proc gestureValid(this: var Apds9960I2C): bool {.importcpp: "#.GestureValid()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
-
Check if gesture data is valid
Returns: true if gesture data ready
Source Edit proc getADCIntegrationTime(this: var Apds9960I2C): cfloat {. importcpp: "#.GetADCIntegrationTime()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
-
Get current ADC integration time
Returns: Integration time in milliseconds
Source Edit proc getColorData(this: var Apds9960I2C; r, g, b, c: ptr uint16) {. importcpp: "#.GetColorData(#, #, #, #)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
-
Get all color channel values at once
Parameters:
- r - Pointer to store red value
- g - Pointer to store green value
- b - Pointer to store blue value
- c - Pointer to store clear value
proc getColorDataBlue(this: var Apds9960I2C): uint16 {. importcpp: "#.GetColorDataBlue()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Get blue channel value (16-bit) Source Edit
proc getColorDataClear(this: var Apds9960I2C): uint16 {. importcpp: "#.GetColorDataClear()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Get clear/ambient light value (16-bit) Source Edit
proc getColorDataGreen(this: var Apds9960I2C): uint16 {. importcpp: "#.GetColorDataGreen()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Get green channel value (16-bit) Source Edit
proc getColorDataRed(this: var Apds9960I2C): uint16 {. importcpp: "#.GetColorDataRed()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Get red channel value (16-bit) Source Edit
proc getProxGain(this: var Apds9960I2C): uint8 {.importcpp: "#.GetProxGain()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Get current proximity gain Source Edit
proc init(this: var Apds9960I2C; config: Apds9960Config): Apds9960Result {. importcpp: "#.Init(#)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
-
Initialize the APDS9960 sensor
Returns: APDS9960_OK on success, APDS9960_ERR on failure
Source Edit proc initApds9960Config(): Apds9960Config {.constructor, importcpp: "daisy::Apds9960I2C::Config(@)", header: "dev/apds9960.h".}
- Initialize sensor config with defaults Source Edit
proc initApds9960I2CTransportConfig(): Apds9960I2CTransportConfig {.constructor, importcpp: "daisy::Apds9960I2CTransport::Config(@)", header: "dev/apds9960.h".}
- Initialize I2C transport config with defaults Source Edit
proc readGesture(this: var Apds9960I2C): uint8 {.importcpp: "#.ReadGesture()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
-
Read detected gesture
Returns: 0 (none), APDS9960_UP, APDS9960_DOWN, APDS9960_LEFT, or APDS9960_RIGHT
Source Edit proc readProximity(this: var Apds9960I2C): uint8 {. importcpp: "#.ReadProximity()", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
-
Read proximity value (0-255)
Returns: Proximity value (0 = far, 255 = very close)
Source Edit proc setADCGain(this: var Apds9960I2C; gain: uint8) {. importcpp: "#.SetADCGain(#)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Set ADC gain (0-3 for 1x, 4x, 16x, 64x) Source Edit
proc setADCIntegrationTime(this: var Apds9960I2C; timeMs: uint16) {. importcpp: "#.SetADCIntegrationTime(#)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Set ADC integration time in milliseconds Source Edit
proc setGestureOffset(this: var Apds9960I2C; up, down, left, right: uint8) {. importcpp: "#.SetGestureOffset(#, #, #, #)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Set gesture sensor offsets for calibration Source Edit
proc setLED(this: var Apds9960I2C; drive, boost: uint8) {. importcpp: "#.SetLED(#, #)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
-
Set LED brightness for proximity/gesture
Parameters:
- drive - LED drive (0-3): 100mA, 50mA, 25mA, 12.5mA
- boost - LED boost (0-3): 100%, 150%, 200%, 300%
proc setProxGain(this: var Apds9960I2C; gain: uint8) {. importcpp: "#.SetProxGain(#)", header: "dev/apds9960.h", ...raises: [], tags: [], forbids: [].}
- Set proximity gain (0-3) Source Edit