for EVK odin mbed os 5.5

Dependents:   Mbed-Connect-Cloud-Demo Mbed-Connect-Cloud-Demo HTTP-all-sensors mbed-cloud-connect-sensor-light ... more

Fork of TSL2561 by Tuan Anh Nguyen

Committer:
andcor02
Date:
Fri Oct 20 12:13:21 2017 +0000
Revision:
3:8450950ca50b
Parent:
1:ab906ac6e90b
Child:
4:8146a28a20cc
changed intergration time, stops 0 values coming back

Who changed what in which revision?

UserRevisionLine numberNew 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:
andcor02 3:8450950ca50b 86 wait_ms(450);
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 }