Plant Monitoring CS

Dependencies:   HTS221

Committer:
titi9211
Date:
Thu Mar 26 10:01:31 2020 +0000
Revision:
62:4763f2aa486c
Parent:
59:169324c8e604
TSL2561

Who changed what in which revision?

UserRevisionLine numberNew 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 }