TSL2561

Dependents:   Hexi_TSL2561 HexiHeart_Main

Fork of TSL2561 by Kenji Arai

Committer:
kenjiArai
Date:
Sat Mar 07 23:42:22 2015 +0000
Revision:
1:25a700e9b8ec
Parent:
0:eec7bcd27c52
Child:
2:17591031447b
Changed lux calculation way

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:eec7bcd27c52 1 /*
kenjiArai 0:eec7bcd27c52 2 * mbed library program
kenjiArai 0:eec7bcd27c52 3 * Luminosity sensor -- LIGHT-TO-DIGITAL CONVERTER (light intensity to a digital signal output)
kenjiArai 0:eec7bcd27c52 4 * TSL2561 by Texas Advanced Optoelectronic Solutions Inc.
kenjiArai 0:eec7bcd27c52 5 *
kenjiArai 0:eec7bcd27c52 6 * Copyright (c) 2015 Kenji Arai / JH1PJL
kenjiArai 0:eec7bcd27c52 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:eec7bcd27c52 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:eec7bcd27c52 9 * Created: Feburary 21st, 2015
kenjiArai 1:25a700e9b8ec 10 * Revised: March 8th, 2015
kenjiArai 0:eec7bcd27c52 11 *
kenjiArai 0:eec7bcd27c52 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:eec7bcd27c52 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:eec7bcd27c52 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:eec7bcd27c52 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:eec7bcd27c52 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:eec7bcd27c52 17 */
kenjiArai 0:eec7bcd27c52 18 /*
kenjiArai 0:eec7bcd27c52 19 *---------------- REFERENCE ----------------------------------------------------------------------
kenjiArai 0:eec7bcd27c52 20 * https://docs.google.com/viewer?url=http%3A%2F%2Fwww.adafruit.com%2Fdatasheets%2FTSL256x.pdf
kenjiArai 0:eec7bcd27c52 21 * https://learn.adafruit.com/tsl2561?view=all
kenjiArai 0:eec7bcd27c52 22 * http://www.adafruit.com/products/439
kenjiArai 0:eec7bcd27c52 23 * http://akizukidenshi.com/catalog/g/gM-08219/
kenjiArai 0:eec7bcd27c52 24 */
kenjiArai 0:eec7bcd27c52 25
kenjiArai 0:eec7bcd27c52 26 #ifndef TSL2561_H
kenjiArai 0:eec7bcd27c52 27 #define TSL2561_H
kenjiArai 0:eec7bcd27c52 28
kenjiArai 0:eec7bcd27c52 29 #include "mbed.h"
kenjiArai 0:eec7bcd27c52 30
kenjiArai 0:eec7bcd27c52 31 // Luminosity sensor, TSL2561
kenjiArai 0:eec7bcd27c52 32 // Address b7=0,b6=1,b5=1,b4=1,b3=0,b2=0,b1=1, b0=R/W
kenjiArai 0:eec7bcd27c52 33 #define TSL2561_ADDRESS_GND (0x29 << 1)
kenjiArai 0:eec7bcd27c52 34 #define TSL2561_ADDRESS_FLOAT (0x39 << 1)
kenjiArai 0:eec7bcd27c52 35 #define TSL2561_ADDRESS_VDD (0x49 << 1)
kenjiArai 0:eec7bcd27c52 36
kenjiArai 0:eec7bcd27c52 37 ////////////// Registers //////////////////////////////////
kenjiArai 0:eec7bcd27c52 38 // Register definition
kenjiArai 0:eec7bcd27c52 39 #define TSL2561_CONTROL 0x00
kenjiArai 0:eec7bcd27c52 40 #define TSL2561_TIMING 0x01
kenjiArai 0:eec7bcd27c52 41 #define TSL2561_THRESHLOWLOW 0x02
kenjiArai 0:eec7bcd27c52 42 #define TSL2561_THRESHHIGHLOW 0x04
kenjiArai 0:eec7bcd27c52 43 #define TSL2561_INTERRUPT 0x06
kenjiArai 0:eec7bcd27c52 44 #define TSL2561_CRC 0x08
kenjiArai 0:eec7bcd27c52 45 #define TSL2561_ID 0x0A
kenjiArai 0:eec7bcd27c52 46 #define TSL2561_DATA0LOW 0x0C
kenjiArai 0:eec7bcd27c52 47 #define TSL2561_DATA0HIGH 0x0D
kenjiArai 0:eec7bcd27c52 48 #define TSL2561_DATA1LOW 0x0E
kenjiArai 0:eec7bcd27c52 49 #define TSL2561_DATA1HIGH 0x0F
kenjiArai 0:eec7bcd27c52 50
kenjiArai 1:25a700e9b8ec 51 ////////////// TIMING PARAMETER ///////////////////////////
kenjiArai 1:25a700e9b8ec 52 #define TIMING_GAIN_1 (0UL << 4)
kenjiArai 1:25a700e9b8ec 53 #define TIMING_GAIN_16 (1UL << 4)
kenjiArai 1:25a700e9b8ec 54 #define TIMING_TIME_13R7 (0x0)
kenjiArai 1:25a700e9b8ec 55 #define TIMING_TIME_101 (0x1)
kenjiArai 1:25a700e9b8ec 56 #define TIMING_TIME_402 (0x2)
kenjiArai 1:25a700e9b8ec 57 #define TIMING_TIME_MANU (0x3)
kenjiArai 1:25a700e9b8ec 58 #define TIMING_DEFAULT (TIMING_GAIN_1 + TIMING_TIME_402)
kenjiArai 1:25a700e9b8ec 59
kenjiArai 0:eec7bcd27c52 60 ////////////// ID /////////////////////////////////////////
kenjiArai 0:eec7bcd27c52 61 #define I_AM_TSL2561 0x50
kenjiArai 0:eec7bcd27c52 62 #define REG_NO_MASK 0x0F
kenjiArai 0:eec7bcd27c52 63
kenjiArai 0:eec7bcd27c52 64 ////////////// COMMAND ////////////////////////////////////
kenjiArai 0:eec7bcd27c52 65 #define CMD_CMDMODE (1UL << 7)
kenjiArai 0:eec7bcd27c52 66 #define CMD_CLEAR (1UL << 6)
kenjiArai 0:eec7bcd27c52 67 #define CMD_WORD (1UL << 5)
kenjiArai 0:eec7bcd27c52 68 #define CMD_BLOCK (1UL << 4)
kenjiArai 0:eec7bcd27c52 69 #define CMD_SINGLE (CMD_CMDMODE)
kenjiArai 0:eec7bcd27c52 70 #define CMD_MULTI (CMD_CMDMODE + CMD_WORD)
kenjiArai 0:eec7bcd27c52 71
kenjiArai 0:eec7bcd27c52 72 /** Interface for Luminosity sensor, TSL2561
kenjiArai 0:eec7bcd27c52 73 * @code
kenjiArai 0:eec7bcd27c52 74 * #include "mbed.h"
kenjiArai 0:eec7bcd27c52 75 * #include "TSL2561.h"
kenjiArai 0:eec7bcd27c52 76 *
kenjiArai 0:eec7bcd27c52 77 * // I2C Communication
kenjiArai 0:eec7bcd27c52 78 * TSL2561 lum(dp5,dp27); // TSL2561 SDA, SCL
kenjiArai 0:eec7bcd27c52 79 * // If you connected I2C line not only this device but also other devices,
kenjiArai 0:eec7bcd27c52 80 * // you need to declare following method.
kenjiArai 1:25a700e9b8ec 81 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 0:eec7bcd27c52 82 * TSL2561 lum(i2c); // TSL2561 SDA, SCL (Data available every 400mSec)
kenjiArai 0:eec7bcd27c52 83 *
kenjiArai 0:eec7bcd27c52 84 * int main() {;
kenjiArai 0:eec7bcd27c52 85 * while(true){
kenjiArai 0:eec7bcd27c52 86 * printf("Illuminance: %+7.2f [Lux]\r\n", lum.lux());
kenjiArai 0:eec7bcd27c52 87 * wait(1.0);
kenjiArai 0:eec7bcd27c52 88 * }
kenjiArai 0:eec7bcd27c52 89 * }
kenjiArai 0:eec7bcd27c52 90 * @endcode
kenjiArai 0:eec7bcd27c52 91 */
kenjiArai 0:eec7bcd27c52 92
kenjiArai 0:eec7bcd27c52 93 class TSL2561
kenjiArai 0:eec7bcd27c52 94 {
kenjiArai 0:eec7bcd27c52 95 public:
kenjiArai 0:eec7bcd27c52 96 /** Configure data pin
kenjiArai 0:eec7bcd27c52 97 * @param data SDA and SCL pins
kenjiArai 0:eec7bcd27c52 98 */
kenjiArai 0:eec7bcd27c52 99 TSL2561(PinName p_sda, PinName p_scl);
kenjiArai 0:eec7bcd27c52 100 TSL2561(PinName p_sda, PinName p_scl, uint8_t addr);
kenjiArai 0:eec7bcd27c52 101
kenjiArai 0:eec7bcd27c52 102 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:eec7bcd27c52 103 * @param I2C previous definition
kenjiArai 0:eec7bcd27c52 104 */
kenjiArai 0:eec7bcd27c52 105 TSL2561(I2C& p_i2c);
kenjiArai 0:eec7bcd27c52 106 TSL2561(I2C& p_i2c, uint8_t addr);
kenjiArai 0:eec7bcd27c52 107
kenjiArai 0:eec7bcd27c52 108 /** Get approximates the human eye response
kenjiArai 0:eec7bcd27c52 109 * in the commonly used Illuminance unit of Lux
kenjiArai 0:eec7bcd27c52 110 * @param none
kenjiArai 0:eec7bcd27c52 111 * @return Lux
kenjiArai 0:eec7bcd27c52 112 */
kenjiArai 0:eec7bcd27c52 113 float lux(void);
kenjiArai 0:eec7bcd27c52 114
kenjiArai 1:25a700e9b8ec 115 /** Set timing register
kenjiArai 1:25a700e9b8ec 116 * @param timing parameter
kenjiArai 1:25a700e9b8ec 117 * @return timing read data
kenjiArai 0:eec7bcd27c52 118 */
kenjiArai 1:25a700e9b8ec 119 uint8_t set_timing_reg(uint8_t parameter);
kenjiArai 1:25a700e9b8ec 120
kenjiArai 1:25a700e9b8ec 121 /** Read timing register
kenjiArai 1:25a700e9b8ec 122 * @param timing parameter
kenjiArai 1:25a700e9b8ec 123 * @return timing read data
kenjiArai 1:25a700e9b8ec 124 */
kenjiArai 1:25a700e9b8ec 125 uint8_t read_timing_reg(void);
kenjiArai 0:eec7bcd27c52 126
kenjiArai 0:eec7bcd27c52 127 /** Set I2C clock frequency
kenjiArai 0:eec7bcd27c52 128 * @param freq.
kenjiArai 0:eec7bcd27c52 129 * @return none
kenjiArai 0:eec7bcd27c52 130 */
kenjiArai 0:eec7bcd27c52 131 void frequency(int hz);
kenjiArai 0:eec7bcd27c52 132
kenjiArai 0:eec7bcd27c52 133 /** check Device ID number
kenjiArai 0:eec7bcd27c52 134 * @param none
kenjiArai 0:eec7bcd27c52 135 * @return TSL2561 = 1, others 0
kenjiArai 0:eec7bcd27c52 136 */
kenjiArai 0:eec7bcd27c52 137 uint8_t who_am_i(void);
kenjiArai 0:eec7bcd27c52 138
kenjiArai 0:eec7bcd27c52 139 /** Read ID and Revision Number
kenjiArai 0:eec7bcd27c52 140 * @param none
kenjiArai 0:eec7bcd27c52 141 * @return ID + REVNO
kenjiArai 0:eec7bcd27c52 142 */
kenjiArai 0:eec7bcd27c52 143 uint16_t read_ID(void);
kenjiArai 0:eec7bcd27c52 144
kenjiArai 0:eec7bcd27c52 145 /** Power Up/Down
kenjiArai 0:eec7bcd27c52 146 * @param none
kenjiArai 0:eec7bcd27c52 147 * @return none
kenjiArai 0:eec7bcd27c52 148 */
kenjiArai 0:eec7bcd27c52 149 void power_up(void);
kenjiArai 0:eec7bcd27c52 150 void power_down(void);
kenjiArai 0:eec7bcd27c52 151
kenjiArai 0:eec7bcd27c52 152 protected:
kenjiArai 0:eec7bcd27c52 153 I2C _i2c;
kenjiArai 0:eec7bcd27c52 154
kenjiArai 0:eec7bcd27c52 155 void init(void);
kenjiArai 0:eec7bcd27c52 156
kenjiArai 0:eec7bcd27c52 157 private:
kenjiArai 0:eec7bcd27c52 158 uint8_t TSL2561_addr;
kenjiArai 0:eec7bcd27c52 159 uint8_t dt[4];
kenjiArai 1:25a700e9b8ec 160 uint32_t ch0;
kenjiArai 1:25a700e9b8ec 161 uint32_t ch1;
kenjiArai 1:25a700e9b8ec 162 int8_t gain;
kenjiArai 1:25a700e9b8ec 163 uint8_t id_number;
kenjiArai 1:25a700e9b8ec 164 double integ_time;
kenjiArai 0:eec7bcd27c52 165 };
kenjiArai 0:eec7bcd27c52 166
kenjiArai 0:eec7bcd27c52 167 #endif // TSL2561_H