Luminosity sensor by Texas Advanced Optoelectronic Solutions Inc.. Device combines one broadband photodiode (visible plus infrared) and one infrared-responding photodiode. Sets Gain x1 and 402mS as default.
Dependents: MusicBoxForFathersDay FTHR_SensorHub Affich_Lum_Moist Projetv0 ... more
TSL2561.h
- Committer:
- kenjiArai
- Date:
- 2018-09-21
- Revision:
- 5:5b1b625fda6f
- Parent:
- 3:d60d8198d76d
File content as of revision 5:5b1b625fda6f:
/*! * @file Adafruit_TSL2561_U.h * * This is part of Adafruit's FXOS8700 driver for the Arduino platform. It is * designed specifically to work with the Adafruit FXOS8700 breakout: * https://www.adafruit.com/products/3463 * * These sensors use I2C to communicate, 2 pins (SCL+SDA) are required * to interface with the breakout. * * Adafruit invests time and resources providing this open source code, * please support Adafruit and open-source hardware by purchasing * products from Adafruit! * * Written by Kevin "KTOWN" Townsend for Adafruit Industries. * * BSD license, all text here must be included in any redistribution. * */ //------- Modified by ---------------------------------------------------------- // Kenji Arai / JH1PJL // http://www.page.sannet.ne.jp/kenjia/index.html // http://mbed.org/users/kenjiArai/ // Created: Feburary 21st, 2015 // Revised: August 23rd, 2017 // Revised: Feburary 20th, 2018 bug fix -> read_ID() & who_am_i() // Thanks PARK JAICHANG // Revised: March 31st, 2018 Added "Auto Range mode" // Use Adafruit library // // Original information https://www.adafruit.com/product/439 // Original source files https://github.com/adafruit/TSL2561-Arduino-Library // https://github.com/adafruit/Adafruit_TSL2561 // Change for Mbed platform // modified -> all related files //------------------------------------------------------------------------------ #ifndef TSL2561_H_ #define TSL2561_H_ #include "mbed.h" // Luminosity sensor, TSL2561 // Address b7=0,b6=1,b5=1,b4=1,b3=0,b2=0,b1=1, b0=R/W #define TSL2561_ADDRESS_GND (0x29 << 1) #define TSL2561_ADDR_LOW (0x29 << 1) #define TSL2561_ADDRESS_FLOAT (0x39 << 1) #define TSL2561_ADDR_FLOAT (0x39 << 1) #define TSL2561_ADDRESS_VDD (0x49 << 1) #define TSL2561_ADDR_HIGH (0x49 << 1) // Lux calculations differ slightly for CS package //#define TSL2561_PACKAGE_CS ///< Chip scale package #define TSL2561_PACKAGE_T_FN_CL ///< Dual Flat No-Lead package // ID #define I_AM_TSL2561CS 0x01 #define I_AM_TSL2561T_FN_CL 0x05 // COMMAND register bit definition #define TSL2561_COMMAND_BIT (0x80) ///< Must be 1 ///< Clears any pending interrupt (write 1 to clear) #define TSL2561_CLEAR_BIT (0x40) ///< 1 = read/write word (rather than byte) #define TSL2561_WORD_BIT (0x20) ///< 1 = using block read/write #define TSL2561_BLOCK_BIT (0x10) // Control register setting to turn on/off #define TSL2561_CONTROL_POWERON (0x03) #define TSL2561_CONTROL_POWEROFF (0x00) #define TSL2561_LUX_LUXSCALE (14) ///< Scale by 2^14 #define TSL2561_LUX_RATIOSCALE (9) ///< Scale ratio by 2^9 #define TSL2561_LUX_CHSCALE (10) ///< Scale channel values by 2^10 #define TSL2561_LUX_CHSCALE_TINT0 (0x7517) ///< 322/11 * 2^TSL2561_LUX_CHSCALE #define TSL2561_LUX_CHSCALE_TINT1 (0x0FE7) ///< 322/81 * 2^TSL2561_LUX_CHSCALE /** TSL2561 I2C Registers */ enum { TSL2561_REGISTER_CONTROL = 0x00, // Control/power register TSL2561_REGISTER_TIMING = 0x01, // Set integration time register TSL2561_REGISTER_THRESHHOLDL_LOW = 0x02, // Interrupt low threshold low-byte TSL2561_REGISTER_THRESHHOLDL_HIGH = 0x03, // Interrupt low threshold high-byte TSL2561_REGISTER_THRESHHOLDH_LOW = 0x04, // Interrupt high threshold low-byte TSL2561_REGISTER_THRESHHOLDH_HIGH = 0x05, // Interrupt high threshold high-byte TSL2561_REGISTER_INTERRUPT = 0x06, // Interrupt settings TSL2561_REGISTER_CRC = 0x08, // Factory use only TSL2561_REGISTER_ID = 0x0A, // TSL2561 identification setting TSL2561_REGISTER_CHAN0_LOW = 0x0C, // Light data channel 0, low byte TSL2561_REGISTER_CHAN0_HIGH = 0x0D, // Light data channel 0, high byte TSL2561_REGISTER_CHAN1_LOW = 0x0E, // Light data channel 1, low byte TSL2561_REGISTER_CHAN1_HIGH = 0x0F // Light data channel 1, high byte }; /** Three options for how long to integrate readings for */ typedef enum { TSL2561_INTEGRATIONTIME_13MS = 0x00, // 13.7ms TSL2561_INTEGRATIONTIME_101MS = 0x01, // 101ms TSL2561_INTEGRATIONTIME_402MS = 0x02 // 402ms } TSL2561IntegrationTime_t; /** TSL2561 offers 2 gain settings */ typedef enum { TSL2561_GAIN_1X = 0x00, // No gain TSL2561_GAIN_16X = 0x10, // 16x gain } TSL2561Gain_t; /** struct sensors_color_s is used to return color data in a common format. */ typedef struct { union { float c[3]; /* RGB color space */ struct { float r; /**< Red component */ float g; /**< Green component */ float b; /**< Blue component */ }; }; uint32_t rgba; /**< 24-bit RGBA value */ } sensors_color_t; #define SENSOR_TYPE_LIGHT 5 /* Sensor details */ /** struct sensor_s is used to describe basic information about a specific sensor. */ typedef struct { float max_value; /**< maximum value of this sensor's value in SI units */ float min_value; /**< minimum value of this sensor's value in SI units */ /**< smallest difference between two values reported by this sensor */ float resolution; /**< min delay in microseconds between events. zero = not a constant rate */ int32_t min_delay; } sensor_t; /** Interface for Luminosity sensor, TSL2561 * @code * #include "mbed.h" * #include "TSL2561.h" * * // I2C Communication * TSL2561 lum(dp5,dp27); // TSL2561 SDA, SCL * // If you connected I2C line not only this device but also other devices, * // you need to declare following method. * I2C i2c(dp5,dp27); // SDA, SCL * TSL2561 lum(i2c); // TSL2561 SDA, SCL (Data available every 400mSec) * * int main() {; * while(true){ * printf("Illuminance: %+7.2f [Lux]\r\n", lum.lux()); * wait(1.0); * } * } * @endcode */ /**************************************************************************/ /*! @brief Class that stores state and functions for interacting with TSL2561 Light Sensor */ /**************************************************************************/ class TSL2561 { public: /** Configure data pin * @param data SDA and SCL pins */ TSL2561(PinName p_sda, PinName p_scl); TSL2561(PinName p_sda, PinName p_scl, uint8_t addr); /** Configure data pin (with other devices on I2C line) * @param I2C previous definition */ TSL2561(I2C& p_i2c); TSL2561(I2C& p_i2c, uint8_t addr); /** Get approximates the human eye response * in the commonly used Illuminance unit of Lux * @param none * @return Lux */ float lux(void); /** Get approximates the human eye response with "Auto Range" * in the commonly used Illuminance unit of Lux * @param none * @return Lux */ float lux_auto(void); /** Set timing register * @param timing parameter * @return timing read data */ uint8_t set_timing_reg(uint8_t parameter); /** Read timing register * @param timing parameter * @return timing read data */ uint8_t read_timing_reg(void); /** Set I2C clock frequency * @param freq. * @return none */ void frequency(int hz); /** check Device ID number * @param none * @return TSL2561 = 1, others 0 */ uint8_t who_am_i(void); /** Read ID and Revision Number * @param none * @return ID + REVNO */ uint8_t read_ID(void); /** Power Up/Down * @param none * @return none */ void power_up(void); void power_down(void); //---------- Adafruit_TSL2561_U.h Original functions part ------------------ bool init(); /* TSL2561 Functions */ void enableAutoRange(bool enable); void setIntegrationTime(TSL2561IntegrationTime_t time); void setGain(TSL2561Gain_t gain); void getLuminosity (uint16_t *broadband, uint16_t *ir); uint32_t calculateLux(uint16_t broadband, uint16_t ir); /* Unified Sensor API Functions */ bool getEvent(uint32_t*); void getSensor(sensor_t*); private: I2C *_i2c_p; I2C &_i2c; Timer t; int8_t _addr; bool _TSL2561Initialised; bool _TSL2561AutoGain; TSL2561IntegrationTime_t _TSL2561IntegrationTime; TSL2561Gain_t _TSL2561Gain; uint32_t ch0; uint32_t ch1; int8_t gain; uint8_t id_number; float integ_time; uint8_t dt[4]; void enable (void); void disable (void); void write8 (uint8_t reg, uint8_t value); uint8_t read8 (uint8_t reg); uint16_t read16 (uint8_t reg); void getData (uint16_t *broadband, uint16_t *ir); }; #endif // TSL2561_H