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
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 #ifndef ADAFRUIT_TSL2561_H_
kenjiArai 5:5b1b625fda6f 22 #define ADAFRUIT_TSL2561_H_
kenjiArai 5:5b1b625fda6f 23
kenjiArai 5:5b1b625fda6f 24 #include <Arduino.h>
kenjiArai 5:5b1b625fda6f 25 #include <Adafruit_Sensor.h>
kenjiArai 5:5b1b625fda6f 26 #include <Wire.h>
kenjiArai 5:5b1b625fda6f 27
kenjiArai 5:5b1b625fda6f 28 #define TSL2561_VISIBLE 2 ///< channel 0 - channel 1
kenjiArai 5:5b1b625fda6f 29 #define TSL2561_INFRARED 1 ///< channel 1
kenjiArai 5:5b1b625fda6f 30 #define TSL2561_FULLSPECTRUM 0 ///< channel 0
kenjiArai 5:5b1b625fda6f 31
kenjiArai 5:5b1b625fda6f 32 // I2C address options
kenjiArai 5:5b1b625fda6f 33 #define TSL2561_ADDR_LOW (0x29) ///< Default address (pin pulled low)
kenjiArai 5:5b1b625fda6f 34 #define TSL2561_ADDR_FLOAT (0x39) ///< Default address (pin left floating)
kenjiArai 5:5b1b625fda6f 35 #define TSL2561_ADDR_HIGH (0x49) ///< Default address (pin pulled high)
kenjiArai 5:5b1b625fda6f 36
kenjiArai 5:5b1b625fda6f 37 // Lux calculations differ slightly for CS package
kenjiArai 5:5b1b625fda6f 38 //#define TSL2561_PACKAGE_CS ///< Chip scale package
kenjiArai 5:5b1b625fda6f 39 #define TSL2561_PACKAGE_T_FN_CL ///< Dual Flat No-Lead package
kenjiArai 5:5b1b625fda6f 40
kenjiArai 5:5b1b625fda6f 41 #define TSL2561_COMMAND_BIT (0x80) ///< Must be 1
kenjiArai 5:5b1b625fda6f 42 #define TSL2561_CLEAR_BIT (0x40) ///< Clears any pending interrupt (write 1 to clear)
kenjiArai 5:5b1b625fda6f 43 #define TSL2561_WORD_BIT (0x20) ///< 1 = read/write word (rather than byte)
kenjiArai 5:5b1b625fda6f 44 #define TSL2561_BLOCK_BIT (0x10) ///< 1 = using block read/write
kenjiArai 5:5b1b625fda6f 45
kenjiArai 5:5b1b625fda6f 46 #define TSL2561_CONTROL_POWERON (0x03) ///< Control register setting to turn on
kenjiArai 5:5b1b625fda6f 47 #define TSL2561_CONTROL_POWEROFF (0x00) ///< Control register setting to turn off
kenjiArai 5:5b1b625fda6f 48
kenjiArai 5:5b1b625fda6f 49 #define TSL2561_LUX_LUXSCALE (14) ///< Scale by 2^14
kenjiArai 5:5b1b625fda6f 50 #define TSL2561_LUX_RATIOSCALE (9) ///< Scale ratio by 2^9
kenjiArai 5:5b1b625fda6f 51 #define TSL2561_LUX_CHSCALE (10) ///< Scale channel values by 2^10
kenjiArai 5:5b1b625fda6f 52 #define TSL2561_LUX_CHSCALE_TINT0 (0x7517) ///< 322/11 * 2^TSL2561_LUX_CHSCALE
kenjiArai 5:5b1b625fda6f 53 #define TSL2561_LUX_CHSCALE_TINT1 (0x0FE7) ///< 322/81 * 2^TSL2561_LUX_CHSCALE
kenjiArai 5:5b1b625fda6f 54
kenjiArai 5:5b1b625fda6f 55 // T, FN and CL package values
kenjiArai 5:5b1b625fda6f 56 #define TSL2561_LUX_K1T (0x0040) ///< 0.125 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 57 #define TSL2561_LUX_B1T (0x01f2) ///< 0.0304 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 58 #define TSL2561_LUX_M1T (0x01be) ///< 0.0272 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 59 #define TSL2561_LUX_K2T (0x0080) ///< 0.250 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 60 #define TSL2561_LUX_B2T (0x0214) ///< 0.0325 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 61 #define TSL2561_LUX_M2T (0x02d1) ///< 0.0440 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 62 #define TSL2561_LUX_K3T (0x00c0) ///< 0.375 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 63 #define TSL2561_LUX_B3T (0x023f) ///< 0.0351 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 64 #define TSL2561_LUX_M3T (0x037b) ///< 0.0544 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 65 #define TSL2561_LUX_K4T (0x0100) ///< 0.50 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 66 #define TSL2561_LUX_B4T (0x0270) ///< 0.0381 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 67 #define TSL2561_LUX_M4T (0x03fe) ///< 0.0624 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 68 #define TSL2561_LUX_K5T (0x0138) ///< 0.61 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 69 #define TSL2561_LUX_B5T (0x016f) ///< 0.0224 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 70 #define TSL2561_LUX_M5T (0x01fc) ///< 0.0310 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 71 #define TSL2561_LUX_K6T (0x019a) ///< 0.80 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 72 #define TSL2561_LUX_B6T (0x00d2) ///< 0.0128 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 73 #define TSL2561_LUX_M6T (0x00fb) ///< 0.0153 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 74 #define TSL2561_LUX_K7T (0x029a) ///< 1.3 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 75 #define TSL2561_LUX_B7T (0x0018) ///< 0.00146 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 76 #define TSL2561_LUX_M7T (0x0012) ///< 0.00112 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 77 #define TSL2561_LUX_K8T (0x029a) ///< 1.3 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 78 #define TSL2561_LUX_B8T (0x0000) ///< 0.000 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 79 #define TSL2561_LUX_M8T (0x0000) ///< 0.000 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 80
kenjiArai 5:5b1b625fda6f 81 // CS package values
kenjiArai 5:5b1b625fda6f 82 #define TSL2561_LUX_K1C (0x0043) ///< 0.130 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 83 #define TSL2561_LUX_B1C (0x0204) ///< 0.0315 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 84 #define TSL2561_LUX_M1C (0x01ad) ///< 0.0262 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 85 #define TSL2561_LUX_K2C (0x0085) ///< 0.260 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 86 #define TSL2561_LUX_B2C (0x0228) ///< 0.0337 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 87 #define TSL2561_LUX_M2C (0x02c1) ///< 0.0430 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 88 #define TSL2561_LUX_K3C (0x00c8) ///< 0.390 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 89 #define TSL2561_LUX_B3C (0x0253) ///< 0.0363 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 90 #define TSL2561_LUX_M3C (0x0363) ///< 0.0529 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 91 #define TSL2561_LUX_K4C (0x010a) ///< 0.520 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 92 #define TSL2561_LUX_B4C (0x0282) ///< 0.0392 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 93 #define TSL2561_LUX_M4C (0x03df) ///< 0.0605 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 94 #define TSL2561_LUX_K5C (0x014d) ///< 0.65 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 95 #define TSL2561_LUX_B5C (0x0177) ///< 0.0229 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 96 #define TSL2561_LUX_M5C (0x01dd) ///< 0.0291 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 97 #define TSL2561_LUX_K6C (0x019a) ///< 0.80 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 98 #define TSL2561_LUX_B6C (0x0101) ///< 0.0157 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 99 #define TSL2561_LUX_M6C (0x0127) ///< 0.0180 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 100 #define TSL2561_LUX_K7C (0x029a) ///< 1.3 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 101 #define TSL2561_LUX_B7C (0x0037) ///< 0.00338 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 102 #define TSL2561_LUX_M7C (0x002b) ///< 0.00260 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 103 #define TSL2561_LUX_K8C (0x029a) ///< 1.3 * 2^RATIO_SCALE
kenjiArai 5:5b1b625fda6f 104 #define TSL2561_LUX_B8C (0x0000) ///< 0.000 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 105 #define TSL2561_LUX_M8C (0x0000) ///< 0.000 * 2^LUX_SCALE
kenjiArai 5:5b1b625fda6f 106
kenjiArai 5:5b1b625fda6f 107 // Auto-gain thresholds
kenjiArai 5:5b1b625fda6f 108 #define TSL2561_AGC_THI_13MS (4850) ///< Max value at Ti 13ms = 5047
kenjiArai 5:5b1b625fda6f 109 #define TSL2561_AGC_TLO_13MS (100) ///< Min value at Ti 13ms = 100
kenjiArai 5:5b1b625fda6f 110 #define TSL2561_AGC_THI_101MS (36000) ///< Max value at Ti 101ms = 37177
kenjiArai 5:5b1b625fda6f 111 #define TSL2561_AGC_TLO_101MS (200) ///< Min value at Ti 101ms = 200
kenjiArai 5:5b1b625fda6f 112 #define TSL2561_AGC_THI_402MS (63000) ///< Max value at Ti 402ms = 65535
kenjiArai 5:5b1b625fda6f 113 #define TSL2561_AGC_TLO_402MS (500) ///< Min value at Ti 402ms = 500
kenjiArai 5:5b1b625fda6f 114
kenjiArai 5:5b1b625fda6f 115 // Clipping thresholds
kenjiArai 5:5b1b625fda6f 116 #define TSL2561_CLIPPING_13MS (4900) ///< # Counts that trigger a change in gain/integration
kenjiArai 5:5b1b625fda6f 117 #define TSL2561_CLIPPING_101MS (37000) ///< # Counts that trigger a change in gain/integration
kenjiArai 5:5b1b625fda6f 118 #define TSL2561_CLIPPING_402MS (65000) ///< # Counts that trigger a change in gain/integration
kenjiArai 5:5b1b625fda6f 119
kenjiArai 5:5b1b625fda6f 120 // Delay for integration times
kenjiArai 5:5b1b625fda6f 121 #define TSL2561_DELAY_INTTIME_13MS (15) ///< Wait 15ms for 13ms integration
kenjiArai 5:5b1b625fda6f 122 #define TSL2561_DELAY_INTTIME_101MS (120) ///< Wait 120ms for 101ms integration
kenjiArai 5:5b1b625fda6f 123 #define TSL2561_DELAY_INTTIME_402MS (450) ///< Wait 450ms for 402ms integration
kenjiArai 5:5b1b625fda6f 124
kenjiArai 5:5b1b625fda6f 125 /** TSL2561 I2C Registers */
kenjiArai 5:5b1b625fda6f 126 enum
kenjiArai 5:5b1b625fda6f 127 {
kenjiArai 5:5b1b625fda6f 128 TSL2561_REGISTER_CONTROL = 0x00, // Control/power register
kenjiArai 5:5b1b625fda6f 129 TSL2561_REGISTER_TIMING = 0x01, // Set integration time register
kenjiArai 5:5b1b625fda6f 130 TSL2561_REGISTER_THRESHHOLDL_LOW = 0x02, // Interrupt low threshold low-byte
kenjiArai 5:5b1b625fda6f 131 TSL2561_REGISTER_THRESHHOLDL_HIGH = 0x03, // Interrupt low threshold high-byte
kenjiArai 5:5b1b625fda6f 132 TSL2561_REGISTER_THRESHHOLDH_LOW = 0x04, // Interrupt high threshold low-byte
kenjiArai 5:5b1b625fda6f 133 TSL2561_REGISTER_THRESHHOLDH_HIGH = 0x05, // Interrupt high threshold high-byte
kenjiArai 5:5b1b625fda6f 134 TSL2561_REGISTER_INTERRUPT = 0x06, // Interrupt settings
kenjiArai 5:5b1b625fda6f 135 TSL2561_REGISTER_CRC = 0x08, // Factory use only
kenjiArai 5:5b1b625fda6f 136 TSL2561_REGISTER_ID = 0x0A, // TSL2561 identification setting
kenjiArai 5:5b1b625fda6f 137 TSL2561_REGISTER_CHAN0_LOW = 0x0C, // Light data channel 0, low byte
kenjiArai 5:5b1b625fda6f 138 TSL2561_REGISTER_CHAN0_HIGH = 0x0D, // Light data channel 0, high byte
kenjiArai 5:5b1b625fda6f 139 TSL2561_REGISTER_CHAN1_LOW = 0x0E, // Light data channel 1, low byte
kenjiArai 5:5b1b625fda6f 140 TSL2561_REGISTER_CHAN1_HIGH = 0x0F // Light data channel 1, high byte
kenjiArai 5:5b1b625fda6f 141 };
kenjiArai 5:5b1b625fda6f 142
kenjiArai 5:5b1b625fda6f 143 /** Three options for how long to integrate readings for */
kenjiArai 5:5b1b625fda6f 144 typedef enum
kenjiArai 5:5b1b625fda6f 145 {
kenjiArai 5:5b1b625fda6f 146 TSL2561_INTEGRATIONTIME_13MS = 0x00, // 13.7ms
kenjiArai 5:5b1b625fda6f 147 TSL2561_INTEGRATIONTIME_101MS = 0x01, // 101ms
kenjiArai 5:5b1b625fda6f 148 TSL2561_INTEGRATIONTIME_402MS = 0x02 // 402ms
kenjiArai 5:5b1b625fda6f 149 }
kenjiArai 5:5b1b625fda6f 150 tsl2561IntegrationTime_t;
kenjiArai 5:5b1b625fda6f 151
kenjiArai 5:5b1b625fda6f 152 /** TSL2561 offers 2 gain settings */
kenjiArai 5:5b1b625fda6f 153 typedef enum
kenjiArai 5:5b1b625fda6f 154 {
kenjiArai 5:5b1b625fda6f 155 TSL2561_GAIN_1X = 0x00, // No gain
kenjiArai 5:5b1b625fda6f 156 TSL2561_GAIN_16X = 0x10, // 16x gain
kenjiArai 5:5b1b625fda6f 157 }
kenjiArai 5:5b1b625fda6f 158 tsl2561Gain_t;
kenjiArai 5:5b1b625fda6f 159
kenjiArai 5:5b1b625fda6f 160
kenjiArai 5:5b1b625fda6f 161
kenjiArai 5:5b1b625fda6f 162 /**************************************************************************/
kenjiArai 5:5b1b625fda6f 163 /*!
kenjiArai 5:5b1b625fda6f 164 @brief Class that stores state and functions for interacting with TSL2561 Light Sensor
kenjiArai 5:5b1b625fda6f 165 */
kenjiArai 5:5b1b625fda6f 166 /**************************************************************************/
kenjiArai 5:5b1b625fda6f 167 class Adafruit_TSL2561_Unified : public Adafruit_Sensor {
kenjiArai 5:5b1b625fda6f 168 public:
kenjiArai 5:5b1b625fda6f 169 Adafruit_TSL2561_Unified(uint8_t addr, int32_t sensorID = -1);
kenjiArai 5:5b1b625fda6f 170 boolean begin(void);
kenjiArai 5:5b1b625fda6f 171 boolean begin(TwoWire *theWire);
kenjiArai 5:5b1b625fda6f 172 boolean init();
kenjiArai 5:5b1b625fda6f 173
kenjiArai 5:5b1b625fda6f 174 /* TSL2561 Functions */
kenjiArai 5:5b1b625fda6f 175 void enableAutoRange(bool enable);
kenjiArai 5:5b1b625fda6f 176 void setIntegrationTime(tsl2561IntegrationTime_t time);
kenjiArai 5:5b1b625fda6f 177 void setGain(tsl2561Gain_t gain);
kenjiArai 5:5b1b625fda6f 178 void getLuminosity (uint16_t *broadband, uint16_t *ir);
kenjiArai 5:5b1b625fda6f 179 uint32_t calculateLux(uint16_t broadband, uint16_t ir);
kenjiArai 5:5b1b625fda6f 180
kenjiArai 5:5b1b625fda6f 181 /* Unified Sensor API Functions */
kenjiArai 5:5b1b625fda6f 182 bool getEvent(sensors_event_t*);
kenjiArai 5:5b1b625fda6f 183 void getSensor(sensor_t*);
kenjiArai 5:5b1b625fda6f 184
kenjiArai 5:5b1b625fda6f 185 private:
kenjiArai 5:5b1b625fda6f 186 TwoWire *_i2c;
kenjiArai 5:5b1b625fda6f 187
kenjiArai 5:5b1b625fda6f 188 int8_t _addr;
kenjiArai 5:5b1b625fda6f 189 boolean _tsl2561Initialised;
kenjiArai 5:5b1b625fda6f 190 boolean _tsl2561AutoGain;
kenjiArai 5:5b1b625fda6f 191 tsl2561IntegrationTime_t _tsl2561IntegrationTime;
kenjiArai 5:5b1b625fda6f 192 tsl2561Gain_t _tsl2561Gain;
kenjiArai 5:5b1b625fda6f 193 int32_t _tsl2561SensorID;
kenjiArai 5:5b1b625fda6f 194
kenjiArai 5:5b1b625fda6f 195 void enable (void);
kenjiArai 5:5b1b625fda6f 196 void disable (void);
kenjiArai 5:5b1b625fda6f 197 void write8 (uint8_t reg, uint8_t value);
kenjiArai 5:5b1b625fda6f 198 uint8_t read8 (uint8_t reg);
kenjiArai 5:5b1b625fda6f 199 uint16_t read16 (uint8_t reg);
kenjiArai 5:5b1b625fda6f 200 void getData (uint16_t *broadband, uint16_t *ir);
kenjiArai 5:5b1b625fda6f 201 };
kenjiArai 5:5b1b625fda6f 202
kenjiArai 5:5b1b625fda6f 203 #endif // ADAFRUIT_TSL2561_H