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