Complete library for whole scientific pre-final
Dependencies: BOX_1
ENVIROMENTAL/TSL2561.cpp@5:b0fa65791218, 2019-09-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |