Complete library for whole scientific pre-final

Dependencies:   BOX_1

Committer:
Alessio_Zaino
Date:
Thu Sep 05 20:56:11 2019 +0000
Revision:
5:b0fa65791218
Parent:
4:f693e434d21c
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Alessio_Zaino 4:f693e434d21c 1
Alessio_Zaino 4:f693e434d21c 2 #include "TSL2561.h"
Alessio_Zaino 4:f693e434d21c 3 #include "mbed.h"
Alessio_Zaino 4:f693e434d21c 4
Alessio_Zaino 4:f693e434d21c 5 Serial DEBUG(USBTX, USBRX);
Alessio_Zaino 4:f693e434d21c 6
Alessio_Zaino 4:f693e434d21c 7 #define DEBUG_PRINTX(z,x) if(z==1) DEBUG.printf(x);
Alessio_Zaino 4:f693e434d21c 8 #define DEBUG_PRINTLNX(z,x) if(z==1) {DEBUG.printf(x); DEBUG.printf("\r\n");}
Alessio_Zaino 4:f693e434d21c 9 #define DEBUG_PRINTXY(z,x, y) if(z==1) DEBUG.printf(x, y);
Alessio_Zaino 4:f693e434d21c 10 #define DEBUG_PRINTLNXY(z,x, y) if(z==1) {DEBUG.printf(x, y); DEBUG.printf("\r\n");}
Alessio_Zaino 4:f693e434d21c 11
Alessio_Zaino 4:f693e434d21c 12 TSL2561::TSL2561():i2c(TSL2561_I2C_PINNAME_SDA,TSL2561_I2C_PINNAME_SCL){
Alessio_Zaino 4:f693e434d21c 13 i2c.frequency (300);
Alessio_Zaino 4:f693e434d21c 14 _addr = TSL2561_ADDR_FLOAT;
Alessio_Zaino 4:f693e434d21c 15 _initialized = false;
Alessio_Zaino 4:f693e434d21c 16 _integration = TSL2561_INTEGRATIONTIME_13MS;
Alessio_Zaino 4:f693e434d21c 17 _gain = TSL2561_GAIN_16X;
Alessio_Zaino 4:f693e434d21c 18 }
Alessio_Zaino 4:f693e434d21c 19
Alessio_Zaino 4:f693e434d21c 20 TSL2561::TSL2561(uint8_t addr):i2c(TSL2561_I2C_PINNAME_SDA,TSL2561_I2C_PINNAME_SCL) {
Alessio_Zaino 4:f693e434d21c 21
Alessio_Zaino 4:f693e434d21c 22 _addr = addr;
Alessio_Zaino 4:f693e434d21c 23 _initialized = false;
Alessio_Zaino 4:f693e434d21c 24 _integration = TSL2561_INTEGRATIONTIME_13MS;
Alessio_Zaino 4:f693e434d21c 25 _gain = TSL2561_GAIN_16X;
Alessio_Zaino 4:f693e434d21c 26 // we cant do wire initialization till later, because we havent loaded Wire yet
Alessio_Zaino 4:f693e434d21c 27 }
Alessio_Zaino 4:f693e434d21c 28
Alessio_Zaino 4:f693e434d21c 29 TSL2561::TSL2561(PinName sda, PinName scl):i2c(sda, scl) {
Alessio_Zaino 4:f693e434d21c 30
Alessio_Zaino 4:f693e434d21c 31 _addr = TSL2561_ADDR_FLOAT;
Alessio_Zaino 4:f693e434d21c 32 _initialized = false;
Alessio_Zaino 4:f693e434d21c 33 _integration = TSL2561_INTEGRATIONTIME_13MS;
Alessio_Zaino 4:f693e434d21c 34 _gain = TSL2561_GAIN_16X;
Alessio_Zaino 4:f693e434d21c 35 // we cant do wire initialization till later, because we havent loaded Wire yet
Alessio_Zaino 4:f693e434d21c 36 }
Alessio_Zaino 4:f693e434d21c 37
Alessio_Zaino 4:f693e434d21c 38 TSL2561::TSL2561(PinName sda, PinName scl, uint8_t addr):i2c(sda, scl) {
Alessio_Zaino 4:f693e434d21c 39
Alessio_Zaino 4:f693e434d21c 40 _addr = addr;
Alessio_Zaino 4:f693e434d21c 41 _initialized = false;
Alessio_Zaino 4:f693e434d21c 42 _integration = TSL2561_INTEGRATIONTIME_13MS;
Alessio_Zaino 4:f693e434d21c 43 _gain = TSL2561_GAIN_16X;
Alessio_Zaino 4:f693e434d21c 44 // we cant do wire initialization till later, because we havent loaded Wire yet
Alessio_Zaino 4:f693e434d21c 45 }
Alessio_Zaino 4:f693e434d21c 46
Alessio_Zaino 4:f693e434d21c 47 uint16_t TSL2561::getLuminosity (uint8_t channel) {
Alessio_Zaino 4:f693e434d21c 48
Alessio_Zaino 4:f693e434d21c 49 uint32_t x = getFullLuminosity();
Alessio_Zaino 4:f693e434d21c 50
Alessio_Zaino 4:f693e434d21c 51 if (channel == 0) {
Alessio_Zaino 4:f693e434d21c 52 // Reads two byte value from channel 0 (visible + infrared)
Alessio_Zaino 4:f693e434d21c 53
Alessio_Zaino 4:f693e434d21c 54 return (x & 0xFFFF);
Alessio_Zaino 4:f693e434d21c 55 } else if (channel == 1) {
Alessio_Zaino 4:f693e434d21c 56 // Reads two byte value from channel 1 (infrared)
Alessio_Zaino 4:f693e434d21c 57
Alessio_Zaino 4:f693e434d21c 58 return (x >> 16);
Alessio_Zaino 4:f693e434d21c 59 } else if (channel == 2) {
Alessio_Zaino 4:f693e434d21c 60 // Reads all and subtracts out just the visible!
Alessio_Zaino 4:f693e434d21c 61
Alessio_Zaino 4:f693e434d21c 62 return ( (x & 0xFFFF) - (x >> 16) );
Alessio_Zaino 4:f693e434d21c 63 }
Alessio_Zaino 4:f693e434d21c 64
Alessio_Zaino 4:f693e434d21c 65 // unknown channel!
Alessio_Zaino 4:f693e434d21c 66 return 0;
Alessio_Zaino 4:f693e434d21c 67 }
Alessio_Zaino 4:f693e434d21c 68
Alessio_Zaino 4:f693e434d21c 69 uint32_t TSL2561::getFullLuminosity (void)
Alessio_Zaino 4:f693e434d21c 70 {
Alessio_Zaino 4:f693e434d21c 71 if (!_initialized) begin();
Alessio_Zaino 4:f693e434d21c 72
Alessio_Zaino 4:f693e434d21c 73 // Enable the device by setting the control bit to 0x03
Alessio_Zaino 4:f693e434d21c 74 enable();
Alessio_Zaino 4:f693e434d21c 75
Alessio_Zaino 4:f693e434d21c 76 // Wait x ms for ADC to complete
Alessio_Zaino 4:f693e434d21c 77 switch (_integration)
Alessio_Zaino 4:f693e434d21c 78 {
Alessio_Zaino 4:f693e434d21c 79 case TSL2561_INTEGRATIONTIME_13MS:
Alessio_Zaino 4:f693e434d21c 80 wait_ms(14);
Alessio_Zaino 4:f693e434d21c 81 break;
Alessio_Zaino 4:f693e434d21c 82 case TSL2561_INTEGRATIONTIME_101MS:
Alessio_Zaino 4:f693e434d21c 83 wait_ms(102);
Alessio_Zaino 4:f693e434d21c 84 break;
Alessio_Zaino 4:f693e434d21c 85 default:
Alessio_Zaino 4:f693e434d21c 86 wait_ms(403);
Alessio_Zaino 4:f693e434d21c 87 break;
Alessio_Zaino 4:f693e434d21c 88 }
Alessio_Zaino 4:f693e434d21c 89
Alessio_Zaino 4:f693e434d21c 90 //DEBUG_PRINTLNXY(0," Integration:= %d",_integration);
Alessio_Zaino 4:f693e434d21c 91
Alessio_Zaino 4:f693e434d21c 92 uint32_t x;
Alessio_Zaino 4:f693e434d21c 93 x = read16(TSL2561_COMMAND_BIT | TSL2561_WORD_BIT | TSL2561_REGISTER_CHAN1_LOW);
Alessio_Zaino 4:f693e434d21c 94
Alessio_Zaino 4:f693e434d21c 95 // DEBUG_PRINTLNXY(0," x:= %d",x);
Alessio_Zaino 4:f693e434d21c 96
Alessio_Zaino 4:f693e434d21c 97 x <<= 16;
Alessio_Zaino 4:f693e434d21c 98 x |= read16(TSL2561_COMMAND_BIT | TSL2561_WORD_BIT | TSL2561_REGISTER_CHAN0_LOW);
Alessio_Zaino 4:f693e434d21c 99
Alessio_Zaino 4:f693e434d21c 100 //DEBUG_PRINTLNXY(0," x:= %d",x);
Alessio_Zaino 4:f693e434d21c 101
Alessio_Zaino 4:f693e434d21c 102 //wait(3);
Alessio_Zaino 4:f693e434d21c 103 disable();
Alessio_Zaino 4:f693e434d21c 104
Alessio_Zaino 4:f693e434d21c 105 return x;
Alessio_Zaino 4:f693e434d21c 106 }
Alessio_Zaino 4:f693e434d21c 107
Alessio_Zaino 4:f693e434d21c 108
Alessio_Zaino 4:f693e434d21c 109 bool TSL2561::begin(void) {
Alessio_Zaino 4:f693e434d21c 110
Alessio_Zaino 4:f693e434d21c 111 char reg[1];
Alessio_Zaino 4:f693e434d21c 112 reg[0] = TSL2561_REGISTER_ID;
Alessio_Zaino 4:f693e434d21c 113 char receivedata[1];
Alessio_Zaino 4:f693e434d21c 114 char read;
Alessio_Zaino 4:f693e434d21c 115 i2c.write(_addr<<1, reg, 1);
Alessio_Zaino 4:f693e434d21c 116 i2c.read(_addr<<1, receivedata, 1);
Alessio_Zaino 4:f693e434d21c 117 read=receivedata[0];
Alessio_Zaino 4:f693e434d21c 118
Alessio_Zaino 4:f693e434d21c 119 if (read & 0x0A ) {
Alessio_Zaino 4:f693e434d21c 120 DEBUG_PRINTLNXY(0,"Read 0x%x => Found TSL2561",read);
Alessio_Zaino 4:f693e434d21c 121 } else {
Alessio_Zaino 4:f693e434d21c 122 return false;
Alessio_Zaino 4:f693e434d21c 123 }
Alessio_Zaino 4:f693e434d21c 124 _initialized = true;
Alessio_Zaino 4:f693e434d21c 125
Alessio_Zaino 4:f693e434d21c 126 // Set default integration time and gain
Alessio_Zaino 4:f693e434d21c 127 setTiming(_integration);
Alessio_Zaino 4:f693e434d21c 128 setGain(_gain);
Alessio_Zaino 4:f693e434d21c 129
Alessio_Zaino 4:f693e434d21c 130 // Note: by default, the device is in power down mode on bootup
Alessio_Zaino 4:f693e434d21c 131 disable();
Alessio_Zaino 4:f693e434d21c 132
Alessio_Zaino 4:f693e434d21c 133 return true;
Alessio_Zaino 4:f693e434d21c 134 }
Alessio_Zaino 4:f693e434d21c 135
Alessio_Zaino 4:f693e434d21c 136 uint16_t TSL2561::read16(uint8_t reg)
Alessio_Zaino 4:f693e434d21c 137 {
Alessio_Zaino 4:f693e434d21c 138 uint16_t x;
Alessio_Zaino 4:f693e434d21c 139 uint16_t t;
Alessio_Zaino 4:f693e434d21c 140 char _x;
Alessio_Zaino 4:f693e434d21c 141 char _t;
Alessio_Zaino 4:f693e434d21c 142 char r[1];
Alessio_Zaino 4:f693e434d21c 143 r[0] = reg;
Alessio_Zaino 4:f693e434d21c 144 char receivedata[2];
Alessio_Zaino 4:f693e434d21c 145
Alessio_Zaino 4:f693e434d21c 146 i2c.write(_addr<<1, r, 1);
Alessio_Zaino 4:f693e434d21c 147 i2c.read(_addr<<1, receivedata, 2);
Alessio_Zaino 4:f693e434d21c 148
Alessio_Zaino 4:f693e434d21c 149 _t=receivedata[0];
Alessio_Zaino 4:f693e434d21c 150 _x=receivedata[1];
Alessio_Zaino 4:f693e434d21c 151
Alessio_Zaino 4:f693e434d21c 152 DEBUG_PRINTLNXY(0,"_t:=0x%x",_t);
Alessio_Zaino 4:f693e434d21c 153 DEBUG_PRINTLNXY(0,"_x:=0x%x",_x);
Alessio_Zaino 4:f693e434d21c 154
Alessio_Zaino 4:f693e434d21c 155 t=(uint16_t)_t;
Alessio_Zaino 4:f693e434d21c 156 x=(uint16_t)_x;
Alessio_Zaino 4:f693e434d21c 157 x <<= 8;
Alessio_Zaino 4:f693e434d21c 158 x |= t;
Alessio_Zaino 4:f693e434d21c 159
Alessio_Zaino 4:f693e434d21c 160 DEBUG_PRINTLNXY(0,"x:= %d",x);
Alessio_Zaino 4:f693e434d21c 161
Alessio_Zaino 4:f693e434d21c 162 return x;
Alessio_Zaino 4:f693e434d21c 163 }
Alessio_Zaino 4:f693e434d21c 164
Alessio_Zaino 4:f693e434d21c 165 void TSL2561::write8 (uint8_t reg, uint8_t value)
Alessio_Zaino 4:f693e434d21c 166 {
Alessio_Zaino 4:f693e434d21c 167 i2c.start();
Alessio_Zaino 4:f693e434d21c 168 i2c.write(_addr<<1);
Alessio_Zaino 4:f693e434d21c 169 i2c.write(reg);
Alessio_Zaino 4:f693e434d21c 170 i2c.write(value);
Alessio_Zaino 4:f693e434d21c 171 i2c.stop();
Alessio_Zaino 4:f693e434d21c 172 }
Alessio_Zaino 4:f693e434d21c 173
Alessio_Zaino 4:f693e434d21c 174 void TSL2561::setTiming(tsl2561IntegrationTime_t integration){
Alessio_Zaino 4:f693e434d21c 175
Alessio_Zaino 4:f693e434d21c 176 if (!_initialized) begin();
Alessio_Zaino 4:f693e434d21c 177
Alessio_Zaino 4:f693e434d21c 178 else DEBUG_PRINTLNX(0,"--------------Set Timing---------");
Alessio_Zaino 4:f693e434d21c 179
Alessio_Zaino 4:f693e434d21c 180 enable();
Alessio_Zaino 4:f693e434d21c 181
Alessio_Zaino 4:f693e434d21c 182 _integration = integration;
Alessio_Zaino 4:f693e434d21c 183
Alessio_Zaino 4:f693e434d21c 184 DEBUG_PRINTLNXY(0,"Integration: 0x%x",_integration);
Alessio_Zaino 4:f693e434d21c 185 DEBUG_PRINTLNXY(0,"Gain: 0x%x",_gain);
Alessio_Zaino 4:f693e434d21c 186 DEBUG_PRINTLNXY(0,"Integration | Gain: 0x%x",_integration | _gain);
Alessio_Zaino 4:f693e434d21c 187
Alessio_Zaino 4:f693e434d21c 188 write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_TIMING, _integration | _gain);
Alessio_Zaino 4:f693e434d21c 189
Alessio_Zaino 4:f693e434d21c 190 disable();
Alessio_Zaino 4:f693e434d21c 191
Alessio_Zaino 4:f693e434d21c 192 DEBUG_PRINTLNX(0,"--------------Complete Set Timing-------------");
Alessio_Zaino 4:f693e434d21c 193
Alessio_Zaino 4:f693e434d21c 194 //wait(1);
Alessio_Zaino 4:f693e434d21c 195
Alessio_Zaino 4:f693e434d21c 196 }
Alessio_Zaino 4:f693e434d21c 197
Alessio_Zaino 4:f693e434d21c 198 void TSL2561::setGain(tsl2561Gain_t gain) {
Alessio_Zaino 4:f693e434d21c 199
Alessio_Zaino 4:f693e434d21c 200 if (!_initialized) begin();
Alessio_Zaino 4:f693e434d21c 201 else DEBUG_PRINTLNX(0,"-------------Set Gain--------------");
Alessio_Zaino 4:f693e434d21c 202
Alessio_Zaino 4:f693e434d21c 203
Alessio_Zaino 4:f693e434d21c 204 enable();
Alessio_Zaino 4:f693e434d21c 205
Alessio_Zaino 4:f693e434d21c 206 DEBUG_PRINTLNXY(0,"Intergration: 0x%x",_integration);
Alessio_Zaino 4:f693e434d21c 207 DEBUG_PRINTLNXY(0,"Gain: 0x%x",_gain);
Alessio_Zaino 4:f693e434d21c 208 DEBUG_PRINTLNXY(0,"Intergration | Gain: 0x%x",_integration | _gain);
Alessio_Zaino 4:f693e434d21c 209
Alessio_Zaino 4:f693e434d21c 210 _gain = gain;
Alessio_Zaino 4:f693e434d21c 211 write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_TIMING, _integration | _gain);
Alessio_Zaino 4:f693e434d21c 212 //write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_TIMING, _gain);
Alessio_Zaino 4:f693e434d21c 213 disable();
Alessio_Zaino 4:f693e434d21c 214
Alessio_Zaino 4:f693e434d21c 215 DEBUG_PRINTLNX(0,"---------------Complete Set Gain----------------");
Alessio_Zaino 4:f693e434d21c 216 //wait(1);
Alessio_Zaino 4:f693e434d21c 217
Alessio_Zaino 4:f693e434d21c 218 }
Alessio_Zaino 4:f693e434d21c 219
Alessio_Zaino 4:f693e434d21c 220 void TSL2561::enable(void)
Alessio_Zaino 4:f693e434d21c 221 {
Alessio_Zaino 4:f693e434d21c 222 if (!_initialized) begin();
Alessio_Zaino 4:f693e434d21c 223
Alessio_Zaino 4:f693e434d21c 224 // Enable the device by setting the control bit to 0x03
Alessio_Zaino 4:f693e434d21c 225 DEBUG_PRINTLNX(0," Power On");
Alessio_Zaino 4:f693e434d21c 226 write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWERON);
Alessio_Zaino 4:f693e434d21c 227 }
Alessio_Zaino 4:f693e434d21c 228
Alessio_Zaino 4:f693e434d21c 229 void TSL2561::disable(void)
Alessio_Zaino 4:f693e434d21c 230 {
Alessio_Zaino 4:f693e434d21c 231 if (!_initialized) begin();
Alessio_Zaino 4:f693e434d21c 232
Alessio_Zaino 4:f693e434d21c 233 // Disable the device by setting the control bit to 0x03
Alessio_Zaino 4:f693e434d21c 234 DEBUG_PRINTLNX(0," Power Off");
Alessio_Zaino 4:f693e434d21c 235 write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWEROFF);
Alessio_Zaino 4:f693e434d21c 236 }