Adafruit TSL2591 sensor

Dependencies:   mbed

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?

UserRevisionLine numberNew 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()