Edwin Cho
/
TSL2591
Adafruit TSL2591 sensor
TSL2591.cpp@2:dd10c541a3dc, 2016-03-14 (annotated)
- Committer:
- 12104404
- Date:
- Mon Mar 14 03:11:03 2016 +0000
- Revision:
- 2:dd10c541a3dc
- Parent:
- 1:308cc5302475
- Child:
- 3:fecb1929cbef
lux working?
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
12104404 | 0:815555c72774 | 1 | #include "TSL2591.h" |
12104404 | 0:815555c72774 | 2 | |
12104404 | 0:815555c72774 | 3 | TSL2591::TSL2591 (I2C& tsl2591_i2c, uint8_t tsl2591_addr): |
12104404 | 0:815555c72774 | 4 | _i2c(tsl2591_i2c), _addr(tsl2591_addr) |
12104404 | 0:815555c72774 | 5 | { |
12104404 | 0:815555c72774 | 6 | _init = false; |
12104404 | 0:815555c72774 | 7 | _integ = TSL2591_INTT_100MS; |
12104404 | 2:dd10c541a3dc | 8 | _gain = TSL2591_GAIN_LOW; |
12104404 | 0:815555c72774 | 9 | } |
12104404 | 0:815555c72774 | 10 | /* |
12104404 | 0:815555c72774 | 11 | * Initialize TSL2591 |
12104404 | 0:815555c72774 | 12 | * Checks ID and sets gain and integration time |
12104404 | 0:815555c72774 | 13 | */ |
12104404 | 0:815555c72774 | 14 | bool TSL2591::init(void) |
12104404 | 0:815555c72774 | 15 | { |
12104404 | 0:815555c72774 | 16 | char write[] = {(TSL2591_CMD_BIT|TSL2591_REG_ID)}; |
12104404 | 0:815555c72774 | 17 | if(_i2c.write(_addr<<1, write, 1, 0) == 0) { |
12104404 | 0:815555c72774 | 18 | char read[1]; |
12104404 | 0:815555c72774 | 19 | _i2c.read(_addr<<1, read, 1, 0); |
12104404 | 0:815555c72774 | 20 | if(read[0] == TSL2591_ID) { |
12104404 | 0:815555c72774 | 21 | _init = true; |
12104404 | 2:dd10c541a3dc | 22 | setGain(TSL2591_GAIN_LOW); |
12104404 | 1:308cc5302475 | 23 | setTime(TSL2591_INTT_100MS); |
12104404 | 0:815555c72774 | 24 | disable(); |
12104404 | 0:815555c72774 | 25 | return true; |
12104404 | 0:815555c72774 | 26 | } |
12104404 | 0:815555c72774 | 27 | } |
12104404 | 0:815555c72774 | 28 | return false; |
12104404 | 0:815555c72774 | 29 | } |
12104404 | 0:815555c72774 | 30 | |
12104404 | 0:815555c72774 | 31 | void TSL2591::enable(void) |
12104404 | 0:815555c72774 | 32 | { |
12104404 | 0:815555c72774 | 33 | char write[] = {(TSL2591_CMD_BIT|TSL2591_REG_ENABLE), (TSL2591_EN_PON|TSL2591_EN_AEN|TSL2591_EN_AIEN|TSL2591_EN_NPIEN)}; |
12104404 | 0:815555c72774 | 34 | _i2c.write(_addr<<1, write, 2, 0); |
12104404 | 0:815555c72774 | 35 | } |
12104404 | 0:815555c72774 | 36 | |
12104404 | 0:815555c72774 | 37 | void TSL2591::disable(void) |
12104404 | 0:815555c72774 | 38 | { |
12104404 | 0:815555c72774 | 39 | char write[] = {(TSL2591_CMD_BIT|TSL2591_REG_ENABLE), (TSL2591_EN_POFF)}; |
12104404 | 0:815555c72774 | 40 | _i2c.write(_addr<<1, write, 2, 0); |
12104404 | 0:815555c72774 | 41 | } |
12104404 | 0:815555c72774 | 42 | |
12104404 | 0:815555c72774 | 43 | void TSL2591::setGain(tsl2591Gain_t gain) |
12104404 | 0:815555c72774 | 44 | { |
12104404 | 0:815555c72774 | 45 | enable(); |
12104404 | 0:815555c72774 | 46 | _gain = gain; |
12104404 | 0:815555c72774 | 47 | char write[] = {(TSL2591_CMD_BIT|TSL2591_REG_CONTROL), (_integ|_gain)}; |
12104404 | 0:815555c72774 | 48 | _i2c.write(_addr<<1, write, 2, 0); |
12104404 | 0:815555c72774 | 49 | disable(); |
12104404 | 0:815555c72774 | 50 | } |
12104404 | 0:815555c72774 | 51 | |
12104404 | 1:308cc5302475 | 52 | void TSL2591::setTime(tsl2591IntegrationTime_t integ) |
12104404 | 0:815555c72774 | 53 | { |
12104404 | 0:815555c72774 | 54 | enable(); |
12104404 | 0:815555c72774 | 55 | _integ = integ; |
12104404 | 0:815555c72774 | 56 | char write[] = {(TSL2591_CMD_BIT|TSL2591_REG_CONTROL), (_integ|_gain)}; |
12104404 | 0:815555c72774 | 57 | _i2c.write(_addr<<1, write, 2, 0); |
12104404 | 0:815555c72774 | 58 | disable(); |
12104404 | 0:815555c72774 | 59 | } |
12104404 | 0:815555c72774 | 60 | |
12104404 | 0:815555c72774 | 61 | void TSL2591::getALS(void) |
12104404 | 0:815555c72774 | 62 | { |
12104404 | 0:815555c72774 | 63 | enable(); |
12104404 | 1:308cc5302475 | 64 | for(uint8_t t=0; t<=_integ+1; t++) { |
12104404 | 1:308cc5302475 | 65 | wait(0.12); |
12104404 | 0:815555c72774 | 66 | } |
12104404 | 1:308cc5302475 | 67 | char write1[] = {(TSL2591_CMD_BIT|TSL2591_REG_CHAN1_L)}; |
12104404 | 0:815555c72774 | 68 | _i2c.write(_addr<<1, write1, 1, 0); |
12104404 | 0:815555c72774 | 69 | char read1[2]; |
12104404 | 0:815555c72774 | 70 | _i2c.read(_addr<<1, read1, 2, 0); |
12104404 | 1:308cc5302475 | 71 | char write2[] = {(TSL2591_CMD_BIT|TSL2591_REG_CHAN0_L)}; |
12104404 | 0:815555c72774 | 72 | _i2c.write(_addr<<1, write2, 1, 0); |
12104404 | 0:815555c72774 | 73 | char read2[2]; |
12104404 | 0:815555c72774 | 74 | _i2c.read(_addr<<1, read2, 2, 0); |
12104404 | 2:dd10c541a3dc | 75 | _rawALS = (((read1[1]<<8)|read1[0])<<16)|((read2[1]<<8)|read2[0]); |
12104404 | 0:815555c72774 | 76 | disable(); |
12104404 | 2:dd10c541a3dc | 77 | full = _rawALS & 0xFFFF; |
12104404 | 2:dd10c541a3dc | 78 | ir = _rawALS >> 16; |
12104404 | 2:dd10c541a3dc | 79 | visible = full - ir; |
12104404 | 2:dd10c541a3dc | 80 | } |
12104404 | 2:dd10c541a3dc | 81 | |
12104404 | 2:dd10c541a3dc | 82 | void TSL2591::calcLux(void) |
12104404 | 2:dd10c541a3dc | 83 | { |
12104404 | 2:dd10c541a3dc | 84 | float atime, again, cpl, lux1, lux2, lux3; |
12104404 | 2:dd10c541a3dc | 85 | if((full == 0xFFFF)|(ir == 0xFFFF)) { |
12104404 | 2:dd10c541a3dc | 86 | lux3 = 0; |
12104404 | 2:dd10c541a3dc | 87 | return; |
12104404 | 2:dd10c541a3dc | 88 | } |
12104404 | 2:dd10c541a3dc | 89 | switch(_integ) { |
12104404 | 2:dd10c541a3dc | 90 | case TSL2591_INTT_100MS: |
12104404 | 2:dd10c541a3dc | 91 | atime = 100.0F; |
12104404 | 2:dd10c541a3dc | 92 | break; |
12104404 | 2:dd10c541a3dc | 93 | case TSL2591_INTT_200MS: |
12104404 | 2:dd10c541a3dc | 94 | atime = 200.0F; |
12104404 | 2:dd10c541a3dc | 95 | break; |
12104404 | 2:dd10c541a3dc | 96 | case TSL2591_INTT_300MS: |
12104404 | 2:dd10c541a3dc | 97 | atime = 300.0F; |
12104404 | 2:dd10c541a3dc | 98 | break; |
12104404 | 2:dd10c541a3dc | 99 | case TSL2591_INTT_400MS: |
12104404 | 2:dd10c541a3dc | 100 | atime = 400.0F; |
12104404 | 2:dd10c541a3dc | 101 | break; |
12104404 | 2:dd10c541a3dc | 102 | case TSL2591_INTT_500MS: |
12104404 | 2:dd10c541a3dc | 103 | atime = 500.0F; |
12104404 | 2:dd10c541a3dc | 104 | break; |
12104404 | 2:dd10c541a3dc | 105 | case TSL2591_INTT_600MS: |
12104404 | 2:dd10c541a3dc | 106 | atime = 600.0F; |
12104404 | 2:dd10c541a3dc | 107 | break; |
12104404 | 2:dd10c541a3dc | 108 | default: |
12104404 | 2:dd10c541a3dc | 109 | atime = 100.0F; |
12104404 | 2:dd10c541a3dc | 110 | break; |
12104404 | 2:dd10c541a3dc | 111 | } |
12104404 | 2:dd10c541a3dc | 112 | switch(_gain) { |
12104404 | 2:dd10c541a3dc | 113 | case TSL2591_GAIN_LOW: |
12104404 | 2:dd10c541a3dc | 114 | again = 1.0F; |
12104404 | 2:dd10c541a3dc | 115 | break; |
12104404 | 2:dd10c541a3dc | 116 | case TSL2591_GAIN_MED: |
12104404 | 2:dd10c541a3dc | 117 | again = 25.0F; |
12104404 | 2:dd10c541a3dc | 118 | break; |
12104404 | 2:dd10c541a3dc | 119 | case TSL2591_GAIN_HIGH: |
12104404 | 2:dd10c541a3dc | 120 | again = 428.0F; |
12104404 | 2:dd10c541a3dc | 121 | break; |
12104404 | 2:dd10c541a3dc | 122 | case TSL2591_GAIN_MAX: |
12104404 | 2:dd10c541a3dc | 123 | again = 9876.0F; |
12104404 | 2:dd10c541a3dc | 124 | break; |
12104404 | 2:dd10c541a3dc | 125 | default: |
12104404 | 2:dd10c541a3dc | 126 | again = 1.0F; |
12104404 | 2:dd10c541a3dc | 127 | break; |
12104404 | 2:dd10c541a3dc | 128 | } |
12104404 | 2:dd10c541a3dc | 129 | cpl = (atime * again) / TSL2591_LUX_DF; |
12104404 | 2:dd10c541a3dc | 130 | lux1 = ((float)full - (TSL2591_LUX_COEFB * (float)ir)) / cpl; |
12104404 | 2:dd10c541a3dc | 131 | lux2 = (( TSL2591_LUX_COEFC * (float)full ) - ( TSL2591_LUX_COEFD * (float)ir)) / cpl; |
12104404 | 2:dd10c541a3dc | 132 | lux3 = lux1 > lux2 ? lux1 : lux2; |
12104404 | 2:dd10c541a3dc | 133 | lux = (uint32_t)lux3; |
12104404 | 0:815555c72774 | 134 | } |
12104404 | 0:815555c72774 | 135 | |
12104404 | 0:815555c72774 | 136 | /* |
12104404 | 0:815555c72774 | 137 | uint16_t TSL2591::getLumin(uint8_t channel) |
12104404 | 0:815555c72774 | 138 | { |
12104404 | 0:815555c72774 | 139 | uint32_t x = |
12104404 | 0:815555c72774 | 140 | } |
12104404 | 0:815555c72774 | 141 | */ |
12104404 | 0:815555c72774 | 142 | //uint32_t TSL2591::calcLux() |