A library for the Avago ADJD-S311-CR999 Color Light Sensor
Dependents: ADJD-S311_HelloWorld
Diff: ADJDs311.h
- Revision:
- 0:d5bb69f92ea3
- Child:
- 1:fc17a6ccc6f0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ADJDs311.h Mon Mar 24 04:46:51 2014 +0000 @@ -0,0 +1,218 @@ +#ifndef ADJDs311_h +#define ADJDs311_h + +/** + * Includes + */ +#include "mbed.h" + +// ADJD-S311's I2C address, don't change +#define WRITE_ADDRESS 0xE8 // Address for write +#define READ_ADDRESS 0xE9 // Address for read + + +//#define RED 0 +//#define GREEN 1 +//#define BLUE 2 +//#define CLEAR 3 + +// ADJD-S311's register list +#define CTRL 0x00 +#define CONFIG 0x01 +#define CAP_RED 0x06 +#define CAP_GREEN 0x07 +#define CAP_BLUE 0x08 +#define CAP_CLEAR 0x09 +#define INT_RED_LO 0xA +#define INT_RED_HI 0xB +#define INT_GREEN_LO 0xC +#define INT_GREEN_HI 0xD +#define INT_BLUE_LO 0xE +#define INT_BLUE_HI 0xF +#define INT_CLEAR_LO 0x10 +#define INT_CLEAR_HI 0x11 +#define DATA_RED_LO 0x40 +#define DATA_RED_HI 0x41 +#define DATA_GREEN_LO 0x42 +#define DATA_GREEN_HI 0x43 +#define DATA_BLUE_LO 0x44 +#define DATA_BLUE_HI 0x45 +#define DATA_CLEAR_LO 0x46 +#define DATA_CLEAR_HI 0x47 +#define OFFSET_RED 0x48 +#define OFFSET_GREEN 0x49 +#define OFFSET_BLUE 0x4A +#define OFFSET_CLEAR 0x4B + +struct RGBC{ + int red; + int blue; + int green; + int clear; +}; + + +class ADJDs311{ + public: + +/** + * Create a color sensor interface + * + * @param sda pin connected to sda of color sensor + * @param scl pin connected to scl of color sensor + * @param led pin connected to on board led of the sensor + */ + ADJDs311(PinName sda, PinName scl, PinName led); + + +/** + * Calibrate the capacitance and integration time slot so that the current + * readings are as close to 1000 as possible and the difference between RGB + * readings are as small as possible + */ + void calibrate(); + +/** + * Turn the on board LED on/off. + * + * @param ledOn Whether to turn the LED on. + */ + void ledMode(bool ledOn); + +/** + * Get the current offset stored in offset registers + * + * @return Current offset stored in offset registers + */ + RGBC getOffset(); + +/** + * Use the current light condition to set the offset + * + * @param useOffset Wether to use the offset + * @return The offset set + */ + RGBC setOffset(bool useOffset = true); + + +/** + * Use the offset registers to automatically subtract offset from the readings + * + * @param useOffset Wether to use the offset + */ + void offsetMode(bool useOffset); + +/** + * Read in the color value from the sensor + * + * @return Structure containing the value of red, green, blue and clear + */ + RGBC read(); + +/** + * Get the gain of number of capacitor for each channel, in the range of 0 to + * 15. Less capacitor will give higher sensitivity. + * + * @return Structure containing the gain of number of capacitor for each + * channel. + */ + RGBC getColorCap(); + +/** + * Get the gain of number of integration time slot, in the range of 0 to 4095. + * More integration time slot will give higher sensitivity. + * + * @return Structure containing the gain of number of integration time + * slot for each channel. + */ + RGBC getColorInt(); + +/** + * Set the gain of number of capacitor for each channel, in the range of 0 to + * 15. Less capacitor will give higher sensitivity. + * + * @param red gain value for red + * @param green gain value for green + * @param blue gain value for blue + * @param clear gain value for clear + */ + void setColorCap(int red, int green, int blue, int clear); + +/** + * Set the gain of number of integration time slot, in the range of 0 to 4095. + * More integration time slot will give higher sensitivity. + * + * @param red gain value for red + * @param green gain value for green + * @param blue gain value for blue + * @param clear gain value for clear + */ + void setColorInt(int red, int green, int blue, int clear); + +private: + + // fields + I2C _i2c; + DigitalOut _led; + + RGBC colorCap; + RGBC colorInt; + RGBC colorOffset; + +// private memeber functions + +/** Write a byte of data to ADJD-S311 register + * + * @param data byte data to write to the register + * @param regAddr address of the register to write + */ + void writeRegister(char data, char regAddr); + +/** Read a byte of data from ADJD-S311 register + * + * @param regAddr address of the register to write + * @retrun byte data read from the register + */ + char readRegister(char regAddr); + +/** Read 2 bytes of data from ADJD-S311 registers and return as an integer + * + * @param loRegAddr low register address + * @return value from registers as an int + */ + int readInt(char loRegAddr); + +/** Write an integer data of 2 bytes to ADJD-S311 registers + * + * @param loRegAddr low register address + * @param data integer value to write + */ + void writeInt(int data, char loRegAddr); + +/** + * Tell the color sensor to perform measurement and store data to the color and + * clear registers. Must be called before reading + * color values + */ + void performMeasurement(); + +/** + * Calibrate the clear integration time slot so that current reading of the + * clear channel will be as close to 1000 as possible + */ + void calibrateClearInt(); + +/** + * Calibrate the color integration time slots so that the max current reading + * of the RGB channels will be as close to 1000 as possible + */ + void calibrateColorInt(); + +/** + * Calibrate the color capacitors so the difference of reading of different + * channels are as small as possible + */ + void calibrateCapacitors(); +}; + +#endif \ No newline at end of file