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

Committer:
kenjiArai
Date:
Fri Sep 21 22:57:07 2018 +0000
Revision:
5:5b1b625fda6f
Parent:
3:d60d8198d76d
based on Adafruit program and keep interface functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 5:5b1b625fda6f 1 /*!
kenjiArai 5:5b1b625fda6f 2 * @file Adafruit_TSL2561_U.h
kenjiArai 5:5b1b625fda6f 3 *
kenjiArai 5:5b1b625fda6f 4 * This is part of Adafruit's FXOS8700 driver for the Arduino platform. It is
kenjiArai 5:5b1b625fda6f 5 * designed specifically to work with the Adafruit FXOS8700 breakout:
kenjiArai 5:5b1b625fda6f 6 * https://www.adafruit.com/products/3463
kenjiArai 5:5b1b625fda6f 7 *
kenjiArai 5:5b1b625fda6f 8 * These sensors use I2C to communicate, 2 pins (SCL+SDA) are required
kenjiArai 5:5b1b625fda6f 9 * to interface with the breakout.
kenjiArai 5:5b1b625fda6f 10 *
kenjiArai 5:5b1b625fda6f 11 * Adafruit invests time and resources providing this open source code,
kenjiArai 5:5b1b625fda6f 12 * please support Adafruit and open-source hardware by purchasing
kenjiArai 5:5b1b625fda6f 13 * products from Adafruit!
kenjiArai 5:5b1b625fda6f 14 *
kenjiArai 5:5b1b625fda6f 15 * Written by Kevin "KTOWN" Townsend for Adafruit Industries.
kenjiArai 5:5b1b625fda6f 16 *
kenjiArai 5:5b1b625fda6f 17 * BSD license, all text here must be included in any redistribution.
kenjiArai 5:5b1b625fda6f 18 *
kenjiArai 5:5b1b625fda6f 19 */
kenjiArai 5:5b1b625fda6f 20
kenjiArai 5:5b1b625fda6f 21 //------- Modified by ----------------------------------------------------------
kenjiArai 5:5b1b625fda6f 22 // Kenji Arai / JH1PJL
kenjiArai 5:5b1b625fda6f 23 // http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 5:5b1b625fda6f 24 // http://mbed.org/users/kenjiArai/
kenjiArai 5:5b1b625fda6f 25 // Created: Feburary 21st, 2015
kenjiArai 5:5b1b625fda6f 26 // Revised: August 23rd, 2017
kenjiArai 5:5b1b625fda6f 27 // Revised: Feburary 20th, 2018 bug fix -> read_ID() & who_am_i()
kenjiArai 5:5b1b625fda6f 28 // Thanks PARK JAICHANG
kenjiArai 5:5b1b625fda6f 29 // Revised: March 31st, 2018 Added "Auto Range mode"
kenjiArai 5:5b1b625fda6f 30 // Use Adafruit library
kenjiArai 5:5b1b625fda6f 31 //
kenjiArai 5:5b1b625fda6f 32 // Original information https://www.adafruit.com/product/439
kenjiArai 5:5b1b625fda6f 33 // Original source files https://github.com/adafruit/TSL2561-Arduino-Library
kenjiArai 5:5b1b625fda6f 34 // https://github.com/adafruit/Adafruit_TSL2561
kenjiArai 5:5b1b625fda6f 35 // Change for Mbed platform
kenjiArai 5:5b1b625fda6f 36 // modified -> all related files
kenjiArai 5:5b1b625fda6f 37 //------------------------------------------------------------------------------
kenjiArai 5:5b1b625fda6f 38
kenjiArai 5:5b1b625fda6f 39 #ifndef TSL2561_H_
kenjiArai 5:5b1b625fda6f 40 #define TSL2561_H_
kenjiArai 5:5b1b625fda6f 41
kenjiArai 5:5b1b625fda6f 42 #include "mbed.h"
kenjiArai 5:5b1b625fda6f 43
kenjiArai 5:5b1b625fda6f 44 // Luminosity sensor, TSL2561
kenjiArai 5:5b1b625fda6f 45 // Address b7=0,b6=1,b5=1,b4=1,b3=0,b2=0,b1=1, b0=R/W
kenjiArai 5:5b1b625fda6f 46 #define TSL2561_ADDRESS_GND (0x29 << 1)
kenjiArai 5:5b1b625fda6f 47 #define TSL2561_ADDR_LOW (0x29 << 1)
kenjiArai 5:5b1b625fda6f 48 #define TSL2561_ADDRESS_FLOAT (0x39 << 1)
kenjiArai 5:5b1b625fda6f 49 #define TSL2561_ADDR_FLOAT (0x39 << 1)
kenjiArai 5:5b1b625fda6f 50 #define TSL2561_ADDRESS_VDD (0x49 << 1)
kenjiArai 5:5b1b625fda6f 51 #define TSL2561_ADDR_HIGH (0x49 << 1)
kenjiArai 5:5b1b625fda6f 52
kenjiArai 5:5b1b625fda6f 53 // Lux calculations differ slightly for CS package
kenjiArai 5:5b1b625fda6f 54 //#define TSL2561_PACKAGE_CS ///< Chip scale package
kenjiArai 5:5b1b625fda6f 55 #define TSL2561_PACKAGE_T_FN_CL ///< Dual Flat No-Lead package
kenjiArai 5:5b1b625fda6f 56
kenjiArai 5:5b1b625fda6f 57 // ID
kenjiArai 5:5b1b625fda6f 58 #define I_AM_TSL2561CS 0x01
kenjiArai 5:5b1b625fda6f 59 #define I_AM_TSL2561T_FN_CL 0x05
kenjiArai 5:5b1b625fda6f 60
kenjiArai 5:5b1b625fda6f 61 // COMMAND register bit definition
kenjiArai 5:5b1b625fda6f 62 #define TSL2561_COMMAND_BIT (0x80) ///< Must be 1
kenjiArai 5:5b1b625fda6f 63 ///< Clears any pending interrupt (write 1 to clear)
kenjiArai 5:5b1b625fda6f 64 #define TSL2561_CLEAR_BIT (0x40)
kenjiArai 5:5b1b625fda6f 65 ///< 1 = read/write word (rather than byte)
kenjiArai 5:5b1b625fda6f 66 #define TSL2561_WORD_BIT (0x20)
kenjiArai 5:5b1b625fda6f 67 ///< 1 = using block read/write
kenjiArai 5:5b1b625fda6f 68 #define TSL2561_BLOCK_BIT (0x10)
kenjiArai 5:5b1b625fda6f 69
kenjiArai 5:5b1b625fda6f 70 // Control register setting to turn on/off
kenjiArai 5:5b1b625fda6f 71 #define TSL2561_CONTROL_POWERON (0x03)
kenjiArai 5:5b1b625fda6f 72 #define TSL2561_CONTROL_POWEROFF (0x00)
kenjiArai 5:5b1b625fda6f 73
kenjiArai 5:5b1b625fda6f 74 #define TSL2561_LUX_LUXSCALE (14) ///< Scale by 2^14
kenjiArai 5:5b1b625fda6f 75 #define TSL2561_LUX_RATIOSCALE (9) ///< Scale ratio by 2^9
kenjiArai 5:5b1b625fda6f 76 #define TSL2561_LUX_CHSCALE (10) ///< Scale channel values by 2^10
kenjiArai 5:5b1b625fda6f 77 #define TSL2561_LUX_CHSCALE_TINT0 (0x7517) ///< 322/11 * 2^TSL2561_LUX_CHSCALE
kenjiArai 5:5b1b625fda6f 78 #define TSL2561_LUX_CHSCALE_TINT1 (0x0FE7) ///< 322/81 * 2^TSL2561_LUX_CHSCALE
kenjiArai 5:5b1b625fda6f 79
kenjiArai 5:5b1b625fda6f 80 /** TSL2561 I2C Registers */
kenjiArai 5:5b1b625fda6f 81 enum {
kenjiArai 5:5b1b625fda6f 82 TSL2561_REGISTER_CONTROL = 0x00, // Control/power register
kenjiArai 5:5b1b625fda6f 83 TSL2561_REGISTER_TIMING = 0x01, // Set integration time register
kenjiArai 5:5b1b625fda6f 84 TSL2561_REGISTER_THRESHHOLDL_LOW = 0x02, // Interrupt low threshold low-byte
kenjiArai 5:5b1b625fda6f 85 TSL2561_REGISTER_THRESHHOLDL_HIGH = 0x03, // Interrupt low threshold high-byte
kenjiArai 5:5b1b625fda6f 86 TSL2561_REGISTER_THRESHHOLDH_LOW = 0x04, // Interrupt high threshold low-byte
kenjiArai 5:5b1b625fda6f 87 TSL2561_REGISTER_THRESHHOLDH_HIGH = 0x05, // Interrupt high threshold high-byte
kenjiArai 5:5b1b625fda6f 88 TSL2561_REGISTER_INTERRUPT = 0x06, // Interrupt settings
kenjiArai 5:5b1b625fda6f 89 TSL2561_REGISTER_CRC = 0x08, // Factory use only
kenjiArai 5:5b1b625fda6f 90 TSL2561_REGISTER_ID = 0x0A, // TSL2561 identification setting
kenjiArai 5:5b1b625fda6f 91 TSL2561_REGISTER_CHAN0_LOW = 0x0C, // Light data channel 0, low byte
kenjiArai 5:5b1b625fda6f 92 TSL2561_REGISTER_CHAN0_HIGH = 0x0D, // Light data channel 0, high byte
kenjiArai 5:5b1b625fda6f 93 TSL2561_REGISTER_CHAN1_LOW = 0x0E, // Light data channel 1, low byte
kenjiArai 5:5b1b625fda6f 94 TSL2561_REGISTER_CHAN1_HIGH = 0x0F // Light data channel 1, high byte
kenjiArai 5:5b1b625fda6f 95 };
kenjiArai 5:5b1b625fda6f 96
kenjiArai 5:5b1b625fda6f 97 /** Three options for how long to integrate readings for */
kenjiArai 5:5b1b625fda6f 98 typedef enum {
kenjiArai 5:5b1b625fda6f 99 TSL2561_INTEGRATIONTIME_13MS = 0x00, // 13.7ms
kenjiArai 5:5b1b625fda6f 100 TSL2561_INTEGRATIONTIME_101MS = 0x01, // 101ms
kenjiArai 5:5b1b625fda6f 101 TSL2561_INTEGRATIONTIME_402MS = 0x02 // 402ms
kenjiArai 5:5b1b625fda6f 102 }
kenjiArai 5:5b1b625fda6f 103 TSL2561IntegrationTime_t;
kenjiArai 5:5b1b625fda6f 104
kenjiArai 5:5b1b625fda6f 105 /** TSL2561 offers 2 gain settings */
kenjiArai 5:5b1b625fda6f 106 typedef enum {
kenjiArai 5:5b1b625fda6f 107 TSL2561_GAIN_1X = 0x00, // No gain
kenjiArai 5:5b1b625fda6f 108 TSL2561_GAIN_16X = 0x10, // 16x gain
kenjiArai 5:5b1b625fda6f 109 }
kenjiArai 5:5b1b625fda6f 110 TSL2561Gain_t;
kenjiArai 5:5b1b625fda6f 111
kenjiArai 5:5b1b625fda6f 112 /** struct sensors_color_s is used to return color data in a common format. */
kenjiArai 5:5b1b625fda6f 113 typedef struct {
kenjiArai 5:5b1b625fda6f 114 union {
kenjiArai 5:5b1b625fda6f 115 float c[3];
kenjiArai 5:5b1b625fda6f 116 /* RGB color space */
kenjiArai 5:5b1b625fda6f 117 struct {
kenjiArai 5:5b1b625fda6f 118 float r; /**< Red component */
kenjiArai 5:5b1b625fda6f 119 float g; /**< Green component */
kenjiArai 5:5b1b625fda6f 120 float b; /**< Blue component */
kenjiArai 5:5b1b625fda6f 121 };
kenjiArai 5:5b1b625fda6f 122 };
kenjiArai 5:5b1b625fda6f 123 uint32_t rgba; /**< 24-bit RGBA value */
kenjiArai 5:5b1b625fda6f 124 } sensors_color_t;
kenjiArai 5:5b1b625fda6f 125
kenjiArai 5:5b1b625fda6f 126 #define SENSOR_TYPE_LIGHT 5
kenjiArai 5:5b1b625fda6f 127
kenjiArai 5:5b1b625fda6f 128 /* Sensor details */
kenjiArai 5:5b1b625fda6f 129 /** struct sensor_s is used to describe basic information
kenjiArai 5:5b1b625fda6f 130 about a specific sensor. */
kenjiArai 5:5b1b625fda6f 131 typedef struct {
kenjiArai 5:5b1b625fda6f 132 float max_value; /**< maximum value of this sensor's value in SI units */
kenjiArai 5:5b1b625fda6f 133 float min_value; /**< minimum value of this sensor's value in SI units */
kenjiArai 5:5b1b625fda6f 134 /**< smallest difference between two values reported by this sensor */
kenjiArai 5:5b1b625fda6f 135 float resolution;
kenjiArai 5:5b1b625fda6f 136 /**< min delay in microseconds between events. zero = not a constant rate */
kenjiArai 5:5b1b625fda6f 137 int32_t min_delay;
kenjiArai 5:5b1b625fda6f 138 } sensor_t;
kenjiArai 5:5b1b625fda6f 139
kenjiArai 5:5b1b625fda6f 140 /** Interface for Luminosity sensor, TSL2561
kenjiArai 5:5b1b625fda6f 141 * @code
kenjiArai 5:5b1b625fda6f 142 * #include "mbed.h"
kenjiArai 5:5b1b625fda6f 143 * #include "TSL2561.h"
kenjiArai 5:5b1b625fda6f 144 *
kenjiArai 5:5b1b625fda6f 145 * // I2C Communication
kenjiArai 5:5b1b625fda6f 146 * TSL2561 lum(dp5,dp27); // TSL2561 SDA, SCL
kenjiArai 5:5b1b625fda6f 147 * // If you connected I2C line not only this device but also other devices,
kenjiArai 5:5b1b625fda6f 148 * // you need to declare following method.
kenjiArai 5:5b1b625fda6f 149 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 5:5b1b625fda6f 150 * TSL2561 lum(i2c); // TSL2561 SDA, SCL (Data available every 400mSec)
kenjiArai 5:5b1b625fda6f 151 *
kenjiArai 5:5b1b625fda6f 152 * int main() {;
kenjiArai 5:5b1b625fda6f 153 * while(true){
kenjiArai 5:5b1b625fda6f 154 * printf("Illuminance: %+7.2f [Lux]\r\n", lum.lux());
kenjiArai 5:5b1b625fda6f 155 * wait(1.0);
kenjiArai 5:5b1b625fda6f 156 * }
kenjiArai 5:5b1b625fda6f 157 * }
kenjiArai 5:5b1b625fda6f 158 * @endcode
kenjiArai 5:5b1b625fda6f 159 */
kenjiArai 5:5b1b625fda6f 160
kenjiArai 5:5b1b625fda6f 161 /**************************************************************************/
kenjiArai 5:5b1b625fda6f 162 /*!
kenjiArai 5:5b1b625fda6f 163 @brief Class that stores state and functions
kenjiArai 5:5b1b625fda6f 164 for interacting with TSL2561 Light Sensor
kenjiArai 5:5b1b625fda6f 165 */
kenjiArai 5:5b1b625fda6f 166 /**************************************************************************/
kenjiArai 5:5b1b625fda6f 167 class TSL2561
kenjiArai 5:5b1b625fda6f 168 {
kenjiArai 5:5b1b625fda6f 169 public:
kenjiArai 5:5b1b625fda6f 170 /** Configure data pin
kenjiArai 5:5b1b625fda6f 171 * @param data SDA and SCL pins
kenjiArai 5:5b1b625fda6f 172 */
kenjiArai 5:5b1b625fda6f 173 TSL2561(PinName p_sda, PinName p_scl);
kenjiArai 5:5b1b625fda6f 174 TSL2561(PinName p_sda, PinName p_scl, uint8_t addr);
kenjiArai 5:5b1b625fda6f 175
kenjiArai 5:5b1b625fda6f 176 /** Configure data pin (with other devices on I2C line)
kenjiArai 5:5b1b625fda6f 177 * @param I2C previous definition
kenjiArai 5:5b1b625fda6f 178 */
kenjiArai 5:5b1b625fda6f 179 TSL2561(I2C& p_i2c);
kenjiArai 5:5b1b625fda6f 180 TSL2561(I2C& p_i2c, uint8_t addr);
kenjiArai 5:5b1b625fda6f 181
kenjiArai 5:5b1b625fda6f 182 /** Get approximates the human eye response
kenjiArai 5:5b1b625fda6f 183 * in the commonly used Illuminance unit of Lux
kenjiArai 5:5b1b625fda6f 184 * @param none
kenjiArai 5:5b1b625fda6f 185 * @return Lux
kenjiArai 5:5b1b625fda6f 186 */
kenjiArai 5:5b1b625fda6f 187 float lux(void);
kenjiArai 5:5b1b625fda6f 188
kenjiArai 5:5b1b625fda6f 189 /** Get approximates the human eye response with "Auto Range"
kenjiArai 5:5b1b625fda6f 190 * in the commonly used Illuminance unit of Lux
kenjiArai 5:5b1b625fda6f 191 * @param none
kenjiArai 5:5b1b625fda6f 192 * @return Lux
kenjiArai 5:5b1b625fda6f 193 */
kenjiArai 5:5b1b625fda6f 194 float lux_auto(void);
kenjiArai 5:5b1b625fda6f 195
kenjiArai 5:5b1b625fda6f 196 /** Set timing register
kenjiArai 5:5b1b625fda6f 197 * @param timing parameter
kenjiArai 5:5b1b625fda6f 198 * @return timing read data
kenjiArai 5:5b1b625fda6f 199 */
kenjiArai 5:5b1b625fda6f 200 uint8_t set_timing_reg(uint8_t parameter);
kenjiArai 5:5b1b625fda6f 201
kenjiArai 5:5b1b625fda6f 202 /** Read timing register
kenjiArai 5:5b1b625fda6f 203 * @param timing parameter
kenjiArai 5:5b1b625fda6f 204 * @return timing read data
kenjiArai 5:5b1b625fda6f 205 */
kenjiArai 5:5b1b625fda6f 206 uint8_t read_timing_reg(void);
kenjiArai 5:5b1b625fda6f 207
kenjiArai 5:5b1b625fda6f 208 /** Set I2C clock frequency
kenjiArai 5:5b1b625fda6f 209 * @param freq.
kenjiArai 5:5b1b625fda6f 210 * @return none
kenjiArai 5:5b1b625fda6f 211 */
kenjiArai 5:5b1b625fda6f 212 void frequency(int hz);
kenjiArai 5:5b1b625fda6f 213
kenjiArai 5:5b1b625fda6f 214 /** check Device ID number
kenjiArai 5:5b1b625fda6f 215 * @param none
kenjiArai 5:5b1b625fda6f 216 * @return TSL2561 = 1, others 0
kenjiArai 5:5b1b625fda6f 217 */
kenjiArai 5:5b1b625fda6f 218 uint8_t who_am_i(void);
kenjiArai 5:5b1b625fda6f 219
kenjiArai 5:5b1b625fda6f 220 /** Read ID and Revision Number
kenjiArai 5:5b1b625fda6f 221 * @param none
kenjiArai 5:5b1b625fda6f 222 * @return ID + REVNO
kenjiArai 5:5b1b625fda6f 223 */
kenjiArai 5:5b1b625fda6f 224 uint8_t read_ID(void);
kenjiArai 5:5b1b625fda6f 225
kenjiArai 5:5b1b625fda6f 226 /** Power Up/Down
kenjiArai 5:5b1b625fda6f 227 * @param none
kenjiArai 5:5b1b625fda6f 228 * @return none
kenjiArai 5:5b1b625fda6f 229 */
kenjiArai 5:5b1b625fda6f 230 void power_up(void);
kenjiArai 5:5b1b625fda6f 231 void power_down(void);
kenjiArai 5:5b1b625fda6f 232
kenjiArai 5:5b1b625fda6f 233 //---------- Adafruit_TSL2561_U.h Original functions part ------------------
kenjiArai 5:5b1b625fda6f 234 bool init();
kenjiArai 5:5b1b625fda6f 235
kenjiArai 5:5b1b625fda6f 236 /* TSL2561 Functions */
kenjiArai 5:5b1b625fda6f 237 void enableAutoRange(bool enable);
kenjiArai 5:5b1b625fda6f 238 void setIntegrationTime(TSL2561IntegrationTime_t time);
kenjiArai 5:5b1b625fda6f 239 void setGain(TSL2561Gain_t gain);
kenjiArai 5:5b1b625fda6f 240 void getLuminosity (uint16_t *broadband, uint16_t *ir);
kenjiArai 5:5b1b625fda6f 241 uint32_t calculateLux(uint16_t broadband, uint16_t ir);
kenjiArai 5:5b1b625fda6f 242
kenjiArai 5:5b1b625fda6f 243 /* Unified Sensor API Functions */
kenjiArai 5:5b1b625fda6f 244 bool getEvent(uint32_t*);
kenjiArai 5:5b1b625fda6f 245 void getSensor(sensor_t*);
kenjiArai 5:5b1b625fda6f 246
kenjiArai 5:5b1b625fda6f 247 private:
kenjiArai 5:5b1b625fda6f 248 I2C *_i2c_p;
kenjiArai 5:5b1b625fda6f 249 I2C &_i2c;
kenjiArai 5:5b1b625fda6f 250 Timer t;
kenjiArai 5:5b1b625fda6f 251
kenjiArai 5:5b1b625fda6f 252 int8_t _addr;
kenjiArai 5:5b1b625fda6f 253 bool _TSL2561Initialised;
kenjiArai 5:5b1b625fda6f 254 bool _TSL2561AutoGain;
kenjiArai 5:5b1b625fda6f 255 TSL2561IntegrationTime_t _TSL2561IntegrationTime;
kenjiArai 5:5b1b625fda6f 256 TSL2561Gain_t _TSL2561Gain;
kenjiArai 5:5b1b625fda6f 257 uint32_t ch0;
kenjiArai 5:5b1b625fda6f 258 uint32_t ch1;
kenjiArai 5:5b1b625fda6f 259 int8_t gain;
kenjiArai 5:5b1b625fda6f 260 uint8_t id_number;
kenjiArai 5:5b1b625fda6f 261 float integ_time;
kenjiArai 5:5b1b625fda6f 262
kenjiArai 5:5b1b625fda6f 263 uint8_t dt[4];
kenjiArai 5:5b1b625fda6f 264
kenjiArai 5:5b1b625fda6f 265 void enable (void);
kenjiArai 5:5b1b625fda6f 266 void disable (void);
kenjiArai 5:5b1b625fda6f 267 void write8 (uint8_t reg, uint8_t value);
kenjiArai 5:5b1b625fda6f 268 uint8_t read8 (uint8_t reg);
kenjiArai 5:5b1b625fda6f 269 uint16_t read16 (uint8_t reg);
kenjiArai 5:5b1b625fda6f 270 void getData (uint16_t *broadband, uint16_t *ir);
kenjiArai 5:5b1b625fda6f 271 };
kenjiArai 5:5b1b625fda6f 272
kenjiArai 5:5b1b625fda6f 273 #endif // TSL2561_H