TSL2561 light sensor lib, tested with Multitech xDot-DK.
Fork of TSL2561 by
TSL2561.cpp@2:53978e994253, 2016-11-26 (annotated)
- Committer:
- lucianovici
- Date:
- Sat Nov 26 14:58:19 2016 +0000
- Revision:
- 2:53978e994253
- Parent:
- 1:ab906ac6e90b
Update default pins for I2C
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
anhnt2407 | 0:df9baf6459b7 | 1 | |
anhnt2407 | 0:df9baf6459b7 | 2 | #include "TSL2561.h" |
anhnt2407 | 1:ab906ac6e90b | 3 | #include "mbed.h" |
anhnt2407 | 1:ab906ac6e90b | 4 | |
anhnt2407 | 0:df9baf6459b7 | 5 | Serial DEBUG(USBTX, USBRX); |
anhnt2407 | 0:df9baf6459b7 | 6 | |
anhnt2407 | 0:df9baf6459b7 | 7 | #define DEBUG_PRINTX(z,x) if(z==1) DEBUG.printf(x); |
anhnt2407 | 0:df9baf6459b7 | 8 | #define DEBUG_PRINTLNX(z,x) if(z==1) {DEBUG.printf(x); DEBUG.printf("\r\n");} |
anhnt2407 | 0:df9baf6459b7 | 9 | #define DEBUG_PRINTXY(z,x, y) if(z==1) DEBUG.printf(x, y); |
anhnt2407 | 0:df9baf6459b7 | 10 | #define DEBUG_PRINTLNXY(z,x, y) if(z==1) {DEBUG.printf(x, y); DEBUG.printf("\r\n");} |
anhnt2407 | 0:df9baf6459b7 | 11 | |
anhnt2407 | 0:df9baf6459b7 | 12 | TSL2561::TSL2561():i2c(TSL2561_I2C_PINNAME_SDA,TSL2561_I2C_PINNAME_SCL){ |
anhnt2407 | 0:df9baf6459b7 | 13 | i2c.frequency (300); |
anhnt2407 | 1:ab906ac6e90b | 14 | _addr = TSL2561_ADDR_FLOAT; |
anhnt2407 | 0:df9baf6459b7 | 15 | _initialized = false; |
anhnt2407 | 0:df9baf6459b7 | 16 | _integration = TSL2561_INTEGRATIONTIME_13MS; |
anhnt2407 | 0:df9baf6459b7 | 17 | _gain = TSL2561_GAIN_16X; |
anhnt2407 | 0:df9baf6459b7 | 18 | } |
anhnt2407 | 0:df9baf6459b7 | 19 | |
anhnt2407 | 0:df9baf6459b7 | 20 | TSL2561::TSL2561(uint8_t addr):i2c(TSL2561_I2C_PINNAME_SDA,TSL2561_I2C_PINNAME_SCL) { |
anhnt2407 | 0:df9baf6459b7 | 21 | |
anhnt2407 | 1:ab906ac6e90b | 22 | _addr = addr; |
anhnt2407 | 0:df9baf6459b7 | 23 | _initialized = false; |
anhnt2407 | 0:df9baf6459b7 | 24 | _integration = TSL2561_INTEGRATIONTIME_13MS; |
anhnt2407 | 0:df9baf6459b7 | 25 | _gain = TSL2561_GAIN_16X; |
anhnt2407 | 0:df9baf6459b7 | 26 | // we cant do wire initialization till later, because we havent loaded Wire yet |
anhnt2407 | 0:df9baf6459b7 | 27 | } |
anhnt2407 | 0:df9baf6459b7 | 28 | |
anhnt2407 | 0:df9baf6459b7 | 29 | TSL2561::TSL2561(PinName sda, PinName scl):i2c(sda, scl) { |
anhnt2407 | 0:df9baf6459b7 | 30 | |
anhnt2407 | 1:ab906ac6e90b | 31 | _addr = TSL2561_ADDR_FLOAT; |
anhnt2407 | 0:df9baf6459b7 | 32 | _initialized = false; |
anhnt2407 | 0:df9baf6459b7 | 33 | _integration = TSL2561_INTEGRATIONTIME_13MS; |
anhnt2407 | 0:df9baf6459b7 | 34 | _gain = TSL2561_GAIN_16X; |
anhnt2407 | 0:df9baf6459b7 | 35 | // we cant do wire initialization till later, because we havent loaded Wire yet |
anhnt2407 | 0:df9baf6459b7 | 36 | } |
anhnt2407 | 0:df9baf6459b7 | 37 | |
anhnt2407 | 0:df9baf6459b7 | 38 | TSL2561::TSL2561(PinName sda, PinName scl, uint8_t addr):i2c(sda, scl) { |
anhnt2407 | 0:df9baf6459b7 | 39 | |
anhnt2407 | 1:ab906ac6e90b | 40 | _addr = addr; |
anhnt2407 | 0:df9baf6459b7 | 41 | _initialized = false; |
anhnt2407 | 0:df9baf6459b7 | 42 | _integration = TSL2561_INTEGRATIONTIME_13MS; |
anhnt2407 | 0:df9baf6459b7 | 43 | _gain = TSL2561_GAIN_16X; |
anhnt2407 | 0:df9baf6459b7 | 44 | // we cant do wire initialization till later, because we havent loaded Wire yet |
anhnt2407 | 0:df9baf6459b7 | 45 | } |
anhnt2407 | 0:df9baf6459b7 | 46 | |
anhnt2407 | 0:df9baf6459b7 | 47 | uint16_t TSL2561::getLuminosity (uint8_t channel) { |
anhnt2407 | 0:df9baf6459b7 | 48 | |
anhnt2407 | 0:df9baf6459b7 | 49 | uint32_t x = getFullLuminosity(); |
anhnt2407 | 0:df9baf6459b7 | 50 | |
anhnt2407 | 0:df9baf6459b7 | 51 | if (channel == 0) { |
anhnt2407 | 0:df9baf6459b7 | 52 | // Reads two byte value from channel 0 (visible + infrared) |
anhnt2407 | 0:df9baf6459b7 | 53 | |
anhnt2407 | 0:df9baf6459b7 | 54 | return (x & 0xFFFF); |
anhnt2407 | 0:df9baf6459b7 | 55 | } else if (channel == 1) { |
anhnt2407 | 0:df9baf6459b7 | 56 | // Reads two byte value from channel 1 (infrared) |
anhnt2407 | 0:df9baf6459b7 | 57 | |
anhnt2407 | 0:df9baf6459b7 | 58 | return (x >> 16); |
anhnt2407 | 0:df9baf6459b7 | 59 | } else if (channel == 2) { |
anhnt2407 | 0:df9baf6459b7 | 60 | // Reads all and subtracts out just the visible! |
anhnt2407 | 0:df9baf6459b7 | 61 | |
anhnt2407 | 1:ab906ac6e90b | 62 | return ( (x & 0xFFFF) - (x >> 16) ); |
anhnt2407 | 0:df9baf6459b7 | 63 | } |
anhnt2407 | 0:df9baf6459b7 | 64 | |
anhnt2407 | 0:df9baf6459b7 | 65 | // unknown channel! |
anhnt2407 | 0:df9baf6459b7 | 66 | return 0; |
anhnt2407 | 0:df9baf6459b7 | 67 | } |
anhnt2407 | 0:df9baf6459b7 | 68 | |
anhnt2407 | 0:df9baf6459b7 | 69 | uint32_t TSL2561::getFullLuminosity (void) |
anhnt2407 | 0:df9baf6459b7 | 70 | { |
anhnt2407 | 0:df9baf6459b7 | 71 | if (!_initialized) begin(); |
anhnt2407 | 0:df9baf6459b7 | 72 | |
anhnt2407 | 0:df9baf6459b7 | 73 | // Enable the device by setting the control bit to 0x03 |
anhnt2407 | 0:df9baf6459b7 | 74 | enable(); |
anhnt2407 | 0:df9baf6459b7 | 75 | |
anhnt2407 | 0:df9baf6459b7 | 76 | // Wait x ms for ADC to complete |
anhnt2407 | 0:df9baf6459b7 | 77 | switch (_integration) |
anhnt2407 | 0:df9baf6459b7 | 78 | { |
anhnt2407 | 0:df9baf6459b7 | 79 | case TSL2561_INTEGRATIONTIME_13MS: |
anhnt2407 | 0:df9baf6459b7 | 80 | wait_ms(14); |
anhnt2407 | 0:df9baf6459b7 | 81 | break; |
anhnt2407 | 0:df9baf6459b7 | 82 | case TSL2561_INTEGRATIONTIME_101MS: |
anhnt2407 | 0:df9baf6459b7 | 83 | wait_ms(102); |
anhnt2407 | 0:df9baf6459b7 | 84 | break; |
anhnt2407 | 0:df9baf6459b7 | 85 | default: |
anhnt2407 | 0:df9baf6459b7 | 86 | wait_ms(403); |
anhnt2407 | 0:df9baf6459b7 | 87 | break; |
anhnt2407 | 0:df9baf6459b7 | 88 | } |
anhnt2407 | 0:df9baf6459b7 | 89 | |
anhnt2407 | 1:ab906ac6e90b | 90 | //DEBUG_PRINTLNXY(0," Integration:= %d",_integration); |
anhnt2407 | 0:df9baf6459b7 | 91 | |
anhnt2407 | 0:df9baf6459b7 | 92 | uint32_t x; |
anhnt2407 | 0:df9baf6459b7 | 93 | x = read16(TSL2561_COMMAND_BIT | TSL2561_WORD_BIT | TSL2561_REGISTER_CHAN1_LOW); |
anhnt2407 | 0:df9baf6459b7 | 94 | |
anhnt2407 | 1:ab906ac6e90b | 95 | // DEBUG_PRINTLNXY(0," x:= %d",x); |
anhnt2407 | 0:df9baf6459b7 | 96 | |
anhnt2407 | 0:df9baf6459b7 | 97 | x <<= 16; |
anhnt2407 | 0:df9baf6459b7 | 98 | x |= read16(TSL2561_COMMAND_BIT | TSL2561_WORD_BIT | TSL2561_REGISTER_CHAN0_LOW); |
anhnt2407 | 0:df9baf6459b7 | 99 | |
anhnt2407 | 1:ab906ac6e90b | 100 | //DEBUG_PRINTLNXY(0," x:= %d",x); |
anhnt2407 | 0:df9baf6459b7 | 101 | |
anhnt2407 | 1:ab906ac6e90b | 102 | //wait(3); |
anhnt2407 | 0:df9baf6459b7 | 103 | disable(); |
anhnt2407 | 0:df9baf6459b7 | 104 | |
anhnt2407 | 0:df9baf6459b7 | 105 | return x; |
anhnt2407 | 0:df9baf6459b7 | 106 | } |
anhnt2407 | 0:df9baf6459b7 | 107 | |
anhnt2407 | 0:df9baf6459b7 | 108 | |
anhnt2407 | 0:df9baf6459b7 | 109 | bool TSL2561::begin(void) { |
anhnt2407 | 0:df9baf6459b7 | 110 | |
anhnt2407 | 1:ab906ac6e90b | 111 | char reg[1]; |
anhnt2407 | 1:ab906ac6e90b | 112 | reg[0] = TSL2561_REGISTER_ID; |
anhnt2407 | 1:ab906ac6e90b | 113 | char receivedata[1]; |
anhnt2407 | 1:ab906ac6e90b | 114 | char read; |
anhnt2407 | 1:ab906ac6e90b | 115 | i2c.write(_addr<<1, reg, 1); |
anhnt2407 | 1:ab906ac6e90b | 116 | i2c.read(_addr<<1, receivedata, 1); |
anhnt2407 | 1:ab906ac6e90b | 117 | read=receivedata[0]; |
anhnt2407 | 1:ab906ac6e90b | 118 | |
anhnt2407 | 0:df9baf6459b7 | 119 | if (read & 0x0A ) { |
anhnt2407 | 1:ab906ac6e90b | 120 | DEBUG_PRINTLNXY(0,"Read 0x%x => Found TSL2561",read); |
anhnt2407 | 0:df9baf6459b7 | 121 | } else { |
anhnt2407 | 0:df9baf6459b7 | 122 | return false; |
anhnt2407 | 0:df9baf6459b7 | 123 | } |
anhnt2407 | 0:df9baf6459b7 | 124 | _initialized = true; |
anhnt2407 | 0:df9baf6459b7 | 125 | |
anhnt2407 | 0:df9baf6459b7 | 126 | // Set default integration time and gain |
anhnt2407 | 0:df9baf6459b7 | 127 | setTiming(_integration); |
anhnt2407 | 0:df9baf6459b7 | 128 | setGain(_gain); |
anhnt2407 | 0:df9baf6459b7 | 129 | |
anhnt2407 | 0:df9baf6459b7 | 130 | // Note: by default, the device is in power down mode on bootup |
anhnt2407 | 0:df9baf6459b7 | 131 | disable(); |
anhnt2407 | 0:df9baf6459b7 | 132 | |
anhnt2407 | 0:df9baf6459b7 | 133 | return true; |
anhnt2407 | 0:df9baf6459b7 | 134 | } |
anhnt2407 | 0:df9baf6459b7 | 135 | |
anhnt2407 | 0:df9baf6459b7 | 136 | uint16_t TSL2561::read16(uint8_t reg) |
anhnt2407 | 0:df9baf6459b7 | 137 | { |
anhnt2407 | 1:ab906ac6e90b | 138 | uint16_t x; |
anhnt2407 | 1:ab906ac6e90b | 139 | uint16_t t; |
anhnt2407 | 1:ab906ac6e90b | 140 | char _x; |
anhnt2407 | 1:ab906ac6e90b | 141 | char _t; |
anhnt2407 | 1:ab906ac6e90b | 142 | char r[1]; |
anhnt2407 | 0:df9baf6459b7 | 143 | r[0] = reg; |
anhnt2407 | 1:ab906ac6e90b | 144 | char receivedata[2]; |
anhnt2407 | 0:df9baf6459b7 | 145 | |
anhnt2407 | 1:ab906ac6e90b | 146 | i2c.write(_addr<<1, r, 1); |
anhnt2407 | 1:ab906ac6e90b | 147 | i2c.read(_addr<<1, receivedata, 2); |
anhnt2407 | 1:ab906ac6e90b | 148 | |
anhnt2407 | 1:ab906ac6e90b | 149 | _t=receivedata[0]; |
anhnt2407 | 1:ab906ac6e90b | 150 | _x=receivedata[1]; |
anhnt2407 | 0:df9baf6459b7 | 151 | |
anhnt2407 | 1:ab906ac6e90b | 152 | DEBUG_PRINTLNXY(0,"_t:=0x%x",_t); |
anhnt2407 | 1:ab906ac6e90b | 153 | DEBUG_PRINTLNXY(0,"_x:=0x%x",_x); |
anhnt2407 | 0:df9baf6459b7 | 154 | |
anhnt2407 | 1:ab906ac6e90b | 155 | t=(uint16_t)_t; |
anhnt2407 | 1:ab906ac6e90b | 156 | x=(uint16_t)_x; |
anhnt2407 | 0:df9baf6459b7 | 157 | x <<= 8; |
anhnt2407 | 0:df9baf6459b7 | 158 | x |= t; |
anhnt2407 | 1:ab906ac6e90b | 159 | |
anhnt2407 | 1:ab906ac6e90b | 160 | DEBUG_PRINTLNXY(0,"x:= %d",x); |
anhnt2407 | 1:ab906ac6e90b | 161 | |
anhnt2407 | 0:df9baf6459b7 | 162 | return x; |
anhnt2407 | 0:df9baf6459b7 | 163 | } |
anhnt2407 | 0:df9baf6459b7 | 164 | |
anhnt2407 | 0:df9baf6459b7 | 165 | void TSL2561::write8 (uint8_t reg, uint8_t value) |
anhnt2407 | 0:df9baf6459b7 | 166 | { |
anhnt2407 | 0:df9baf6459b7 | 167 | i2c.start(); |
anhnt2407 | 1:ab906ac6e90b | 168 | i2c.write(_addr<<1); |
anhnt2407 | 0:df9baf6459b7 | 169 | i2c.write(reg); |
anhnt2407 | 0:df9baf6459b7 | 170 | i2c.write(value); |
anhnt2407 | 0:df9baf6459b7 | 171 | i2c.stop(); |
anhnt2407 | 0:df9baf6459b7 | 172 | } |
anhnt2407 | 0:df9baf6459b7 | 173 | |
anhnt2407 | 0:df9baf6459b7 | 174 | void TSL2561::setTiming(tsl2561IntegrationTime_t integration){ |
anhnt2407 | 0:df9baf6459b7 | 175 | |
anhnt2407 | 0:df9baf6459b7 | 176 | if (!_initialized) begin(); |
anhnt2407 | 0:df9baf6459b7 | 177 | |
anhnt2407 | 1:ab906ac6e90b | 178 | else DEBUG_PRINTLNX(0,"--------------Set Timing---------"); |
anhnt2407 | 0:df9baf6459b7 | 179 | |
anhnt2407 | 0:df9baf6459b7 | 180 | enable(); |
anhnt2407 | 0:df9baf6459b7 | 181 | |
anhnt2407 | 0:df9baf6459b7 | 182 | _integration = integration; |
anhnt2407 | 0:df9baf6459b7 | 183 | |
anhnt2407 | 1:ab906ac6e90b | 184 | DEBUG_PRINTLNXY(0,"Integration: 0x%x",_integration); |
anhnt2407 | 1:ab906ac6e90b | 185 | DEBUG_PRINTLNXY(0,"Gain: 0x%x",_gain); |
anhnt2407 | 1:ab906ac6e90b | 186 | DEBUG_PRINTLNXY(0,"Integration | Gain: 0x%x",_integration | _gain); |
anhnt2407 | 0:df9baf6459b7 | 187 | |
anhnt2407 | 0:df9baf6459b7 | 188 | write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_TIMING, _integration | _gain); |
anhnt2407 | 0:df9baf6459b7 | 189 | |
anhnt2407 | 0:df9baf6459b7 | 190 | disable(); |
anhnt2407 | 0:df9baf6459b7 | 191 | |
anhnt2407 | 1:ab906ac6e90b | 192 | DEBUG_PRINTLNX(0,"--------------Complete Set Timing-------------"); |
anhnt2407 | 0:df9baf6459b7 | 193 | |
anhnt2407 | 1:ab906ac6e90b | 194 | //wait(1); |
anhnt2407 | 0:df9baf6459b7 | 195 | |
anhnt2407 | 0:df9baf6459b7 | 196 | } |
anhnt2407 | 0:df9baf6459b7 | 197 | |
anhnt2407 | 0:df9baf6459b7 | 198 | void TSL2561::setGain(tsl2561Gain_t gain) { |
anhnt2407 | 0:df9baf6459b7 | 199 | |
anhnt2407 | 0:df9baf6459b7 | 200 | if (!_initialized) begin(); |
anhnt2407 | 1:ab906ac6e90b | 201 | else DEBUG_PRINTLNX(0,"-------------Set Gain--------------"); |
anhnt2407 | 0:df9baf6459b7 | 202 | |
anhnt2407 | 0:df9baf6459b7 | 203 | |
anhnt2407 | 0:df9baf6459b7 | 204 | enable(); |
anhnt2407 | 0:df9baf6459b7 | 205 | |
anhnt2407 | 1:ab906ac6e90b | 206 | DEBUG_PRINTLNXY(0,"Intergration: 0x%x",_integration); |
anhnt2407 | 1:ab906ac6e90b | 207 | DEBUG_PRINTLNXY(0,"Gain: 0x%x",_gain); |
anhnt2407 | 1:ab906ac6e90b | 208 | DEBUG_PRINTLNXY(0,"Intergration | Gain: 0x%x",_integration | _gain); |
anhnt2407 | 0:df9baf6459b7 | 209 | |
anhnt2407 | 0:df9baf6459b7 | 210 | _gain = gain; |
anhnt2407 | 0:df9baf6459b7 | 211 | write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_TIMING, _integration | _gain); |
anhnt2407 | 0:df9baf6459b7 | 212 | //write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_TIMING, _gain); |
anhnt2407 | 0:df9baf6459b7 | 213 | disable(); |
anhnt2407 | 0:df9baf6459b7 | 214 | |
anhnt2407 | 1:ab906ac6e90b | 215 | DEBUG_PRINTLNX(0,"---------------Complete Set Gain----------------"); |
anhnt2407 | 1:ab906ac6e90b | 216 | //wait(1); |
anhnt2407 | 0:df9baf6459b7 | 217 | |
anhnt2407 | 0:df9baf6459b7 | 218 | } |
anhnt2407 | 0:df9baf6459b7 | 219 | |
anhnt2407 | 0:df9baf6459b7 | 220 | void TSL2561::enable(void) |
anhnt2407 | 0:df9baf6459b7 | 221 | { |
anhnt2407 | 0:df9baf6459b7 | 222 | if (!_initialized) begin(); |
anhnt2407 | 0:df9baf6459b7 | 223 | |
anhnt2407 | 0:df9baf6459b7 | 224 | // Enable the device by setting the control bit to 0x03 |
anhnt2407 | 1:ab906ac6e90b | 225 | DEBUG_PRINTLNX(0," Power On"); |
anhnt2407 | 0:df9baf6459b7 | 226 | write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWERON); |
anhnt2407 | 0:df9baf6459b7 | 227 | } |
anhnt2407 | 0:df9baf6459b7 | 228 | |
anhnt2407 | 0:df9baf6459b7 | 229 | void TSL2561::disable(void) |
anhnt2407 | 0:df9baf6459b7 | 230 | { |
anhnt2407 | 0:df9baf6459b7 | 231 | if (!_initialized) begin(); |
anhnt2407 | 0:df9baf6459b7 | 232 | |
anhnt2407 | 0:df9baf6459b7 | 233 | // Disable the device by setting the control bit to 0x03 |
anhnt2407 | 1:ab906ac6e90b | 234 | DEBUG_PRINTLNX(0," Power Off"); |
anhnt2407 | 0:df9baf6459b7 | 235 | write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWEROFF); |
anhnt2407 | 0:df9baf6459b7 | 236 | } |