Source code for APDS9300

#!/usr/bin/python
import sys
import smbus
import time
bus = smbus.SMBus(1)


__author__ = "D.Qendri"
__copyright__ = "Copyright 2015 Sensorian"
__license__ = "GPL V3"
__version__ = "1.0"


APDS9300ADDR = 0x29					#Address of ambient light sensor

#Register definitions
CONTROL           = 0x00			#Control of basic functions
TIMING            = 0x01
THRESHLOWLOW      = 0x02
THRESHLOWHIGH     = 0x03
THRESHHIGHLOW     = 0x04
THRESHHIGHHIGH    = 0x05
INTERRUPT         = 0x06			#Interrupt control 
CRC               = 0x08
ID                = 0x0A
DATA0LOW          = 0x0C
DATA0HIGH         = 0x0D
DATA1LOW          = 0x0E
DATA1HIGH         = 0x0F

#COMMAND REG
COMMAND           = 0x80
CMD_CLEAR_INT     = 0x40
CMD_WORD          = 0x20

#CONTROL REG
POWERON 		  = 0x03
POWEROFF          = 0x00

#Timing Reg
GAIN              = 0x10
MANUAL            = 0x08
INTEG13_7MS       = 0x00
INTEG101MS        = 0x01
INTEG402MS        = 0x02

#INTERRUPT REG
INTERR_THRSHOLD   = 0x01
INTERR_DIS        = 0x00
INTERR_EN         = 0x10

[docs]class APDS9300(object): """ Ambient Light Sensor. Class functions for the APDS9300 ambient light sensor. """ def __init__(self): """ Powers on the sensor :param none: :returns: none """ self._address = APDS9300ADDR self.setpowerState(POWERON) #Power on sensor self.setGain(1) self.setSamplingTime(0x02)
[docs] def setpowerState(self,state): """ Configures the power state of the chip. :param state: Denotes the power state of the sensor ,set to 0/1 to turn off/on. :returns: none """ self.writeRegister(CONTROL|CMD_CLEAR_INT|CONTROL,state) #Turn on or off the sensor
[docs] def setGain(self,gain): """ Set the gain of the internal photodiode sensors, can be 1x or 16x. :param gain: Gain type can be GAIN_1 or GAIN_16 for gain of 1 or 16x :returns: none """ value = 0 if (gain == 1): value = self.readByte(COMMAND|TIMING) #Write to TIMING register value &= 0b11101111 self.writeByte(COMMAND|TIMING) #Write to TIMING register self.writeByte(value) elif (gain == 16): self.writeByte(COMMAND|TIMING) #Write to TIMING register self.writeByte(GAIN) else : self.writeByte(COMMAND|TIMING) #Write to TIMING register self.writeByte(GAIN)
[docs] def setSamplingTime(self,sampling_time): """ Configure the sampling time of the sensor. :param sampling_time: Can be 0x00,0x01,0x02 :returns: none """ self.writeByte(TIMING|COMMAND) self.writeByte(sampling_time)
[docs] def readChannel(self,channel): """ Read raw data from channel 0 or channel 1 :param channel: Value of 0 or 1. :returns: data - Channel data as raw number. """ if(channel == 1): self.writeByte(COMMAND|CMD_CLEAR_INT|CMD_WORD|DATA0LOW) channel = self.readWord(0x00) else : self.writeByte(COMMAND|CMD_CLEAR_INT|CMD_WORD|DATA1LOW) channel = self.readWord(0x00) return channel
[docs] def getLuxLevel(self,ch0, ch1): """ Returns LUX output from the raw sensor data. :param ch0: Channel 0 value :param ch1: Channel 1 value :returns: Lux Float value of light intensity """ k = 0 if(ch0 !=0): k = float(ch1/ch0) Lux=0 if((k>=0) and (k<=0.52)): Lux=(0.0315*ch0)-(0.0593*ch0*pow(k,1.4)) elif( (k>0.52) and (k<=0.65)): Lux=(0.0229*ch0)-(0.0291*ch1) elif((k>0.65) and (k<=0.80)): Lux=(0.0157*ch0)-(0.0180*ch1) elif((k>0.80) and (k<=1.30)): Lux=(0.00338*ch0)-(0.00260*ch1) else : Lux=0 return Lux
[docs] def setIntLowThreshold(self,lowvalue): """ Set the low level data threshold for the interrupt. :param lowvalue: Low interrupt threshold value :returns: none """ self.writeWord((THRESHLOWLOW|COMMAND|CMD_WORD),lowvalue) #use the write word protocol to write these 16 bit values
[docs] def setIntHighThreshold(self,highvalue): """ Set the high level data threshold for the interrupt. :param highvalue: High interrupt threshold value :returns: none """ self.writeWord((THRESHHIGHLOW| COMMAND | CMD_WORD),highvalue)
[docs] def clearInterrupt(self): """ Clear any active interrupts. :param none: :returns: none """ self.writeByte(COMMAND|CMD_CLEAR_INT) #Set clear bit to 1
[docs] def setInterruptState(self,enable=False): """ Enable or disable the interrupts on the sensor. :param enable: Enables or diable interrupt. Default is False. :returns: none """ if enable == True: self.writeRegister(COMMAND|INTERRUPT,INTERR_EN) else: self.writeRegister(COMMAND|INTERRUPT,INTERR_DIS)
[docs] def chipID(self): """ Read the unique chip ID. :param none: :returns: partID ID of chip """ partID = self.readByte(COMMAND|ID) return partID
[docs] def writeByte(self,data): """ Write a byte value. Assumes the register pointer is predefined. :param data: Data byte to write on the I2C bus :returns: none """ bus.write_byte(self._address,data) return 0
[docs] def writeRegister(self,reg,data): """ Write a byte value to a register. :param reg: Register address :param data: Data byte to be written on register. :returns: none """ bus.write_byte_data(self._address,reg,data)
[docs] def writeWord(self,reg, data): """ Write a word value to a register. :param reg: Register address :param data: Data word to be written on the register. :returns: none """ buffer = [(data >> 8) & 0xFF, data & 0xFF] bus.write_i2c_block_data(self._address, reg, buffer)
[docs] def readByte(self,reg): """ Read a byte value from a register. :param reg: Register address :returns: Register byte content """ x = bus.read_byte_data(self._address, reg) return x
[docs] def readWord(self,reg): """ Read a word value from a register. :param reg: Register address :returns: Register word content """ x = bus.read_word_data(self._address, reg) return x