TSL2561(照度センサ)のライブラリです
Dependents: HYBRYD2018_IZU_ROCKET Hybrid_IZU2019
Diff: TSL2561.cpp
- Revision:
- 3:f62d7ea19cbb
- Parent:
- 2:276a177de00b
- Child:
- 4:c1e82279b4bb
diff -r 276a177de00b -r f62d7ea19cbb TSL2561.cpp --- a/TSL2561.cpp Wed Nov 14 09:13:55 2018 +0000 +++ b/TSL2561.cpp Sat Jan 12 17:05:34 2019 +0000 @@ -1,85 +1,158 @@ #include "mbed.h" +#include "math.h" #include "TSL2561.h" -//Serial DEBUG(USBTX,USBRX); - -myTSL2561::myTSL2561(I2C &i2cBus,AD0 celect) -{ +myTSL2561::myTSL2561(I2C &i2cBus, AD0 celect){ i2c = &i2cBus; - if(celect == AD0_LOW) _addr = SLV_ADDR_LOW; - else if(celect == AD0_HIGH) _addr = SLV_ADDR_HIGH; - else _addr = SLV_ADDR_OPEN; + if(celect == AD0_LOW){ + _addr = SLV_ADDR_LOW; + } + else if(celect == AD0_HIGH){ + _addr = SLV_ADDR_HIGH; + } + else{ + _addr = SLV_ADDR_OPEN; + } SLV_WRITE_TSL = _addr; SLV_READ_TSL = _addr | 1; - i2c->frequency(400000); + i2c -> frequency(400000); } -void myTSL2561::begin() -{ - power_up_cmd[0] = COMMAND | CONTROL_REG; - power_up_cmd[1] = POWER_UP; +void myTSL2561::begin(){ + //power_up_cmd[0] = COMMAND | CONTROL_REG; + //power_up_cmd[1] = POWER_UP; + cmd[0] = COMMAND | CONTROL_REG; + cmd[1] = POWER_UP; - i2c->write(SLV_WRITE_TSL, power_up_cmd, 2); - - read_cmd = COMMAND | CHECK_REG; + //i2c -> write(SLV_WRITE_TSL, power_up_cmd, 2); + i2c -> write(SLV_WRITE_TSL, cmd, 2); - i2c->write(SLV_WRITE_TSL, &read_cmd, 1); - i2c->read(SLV_READ_TSL, &check_read, 1); + //read_cmd = COMMAND | CHECK_REG; + cmd[0] = COMMAND | CHECK_REG; + //i2c->write(SLV_WRITE_TSL, &read_cmd, 1); + //i2c->read(SLV_READ_TSL, &check_read, 1); + i2c -> write(SLV_WRITE_TSL, cmd, 1); + i2c -> read(SLV_READ_TSL, buff, 1); } -int myTSL2561::connect_check() -{ - check_cmd = COMMAND | CHECK_REG; +int myTSL2561::connectCheck(){ + //check_cmd = COMMAND | CHECK_REG; + cmd[0] = COMMAND | CHECK_REG; - i2c->write(SLV_WRITE_TSL, &check_cmd, 1); - i2c->read(SLV_READ_TSL, &check_read, 1); + //i2c->write(SLV_WRITE_TSL, &check_cmd, 1); + //i2c->read(SLV_READ_TSL, &check_read, 1); + i2c -> write(SLV_WRITE_TSL, cmd, 1); + i2c -> read(SLV_READ_TSL, buff, 1); //DEBUG.printf("CHECK_REG read = %x\r\n",check_read); - if(check_read == ID_NUMBER){ return 1;} - else{ return 0;} + //if(check_read == ID_NUMBER){ return 1;} + if(buff[0] == ID_NUMBER){ + return 1; + } + else{ + return 0; + } } -float myTSL2561::get_luminosity(unsigned int wait_time) -{ - read_cmd = COMMAND | RAW_DATA_LOW; +//float myTSL2561::getLuminous0(unsigned int wait_time){ +//int myTSL2561::getLuminous0(unsigned int wait_time){ +int myTSL2561::getLuminous0(){ + cmd[0] = COMMAND | RAW_DATA_LOW; - i2c->write(SLV_WRITE_TSL, &read_cmd, 1); - //wait_ms(wait_time); - i2c->read(SLV_READ_TSL, buff, 2); + //i2c->write(SLV_WRITE_TSL, &read_cmd, 1); + i2c -> write(SLV_WRITE_TSL, cmd, 1); + //i2c->read(SLV_READ_TSL, buff, 2); + i2c -> read(SLV_READ_TSL, buff, 2); val[0] = (int)buff[0]; val[1] = (int)buff[1] << 8; - lux = (float)(val[1] | val[0]); + //lux = (float)(val[1] | val[0]); + //lux0 = (int)(val[1] | val[0]); + lux0 = (float)(val[1] | val[0]) / scale; + + //return lux; + return (int)lux0; +} + +int myTSL2561::getLuminous1(){ + cmd[0] = COMMAND | RAW_DATA_R_LOW; - return lux; + i2c -> write(SLV_WRITE_TSL, cmd, 1); + i2c -> read(SLV_READ_TSL, buff, 2); + + val[0] = (int)buff[0]; + val[1] = (int)buff[1] << 8; + + //lux = (int)(val[1] | val[0]); + //lux1 = (int)(val[1] | val[0]); + lux1 = (float)(val[1] | val[0]) / scale; + + //return lux; + return (int)lux1; } -unsigned int myTSL2561::set_rate(int channel) -{ - timing_cmd[0] = COMMAND | TIMING_REG; +int myTSL2561::getLuminous(){ + lux0 = getLuminous0(); + lux1 = getLuminous1(); + + ration = lux1 / lux0; + if(ration <= 0.50){ + //lux = (int)(0.0304 * (float)lux0 - 0.062 * (float)lux0 * powf(ration, 1.4)); + lux = 0.0304 * lux0 - 0.062 * lux0 * powf(ration, 1.4); + } + else if(ration <= 0.61){ + //lux = (int)(0.0224 * (float)lux0 - 0.031 * (float)lux1); + lux = 0.0224 * lux0 - 0.031 * lux1; + } + else if(ration <= 0.80){ + //lux = (int)(0.0128 * (float)lux0 - 0.0153 * (float)lux1); + lux = 0.0128 * lux0 - 0.0153 * lux1; + } + else if(ration <= 1.30){ + //lux = (int)(0.00146 * (float)lux0 - 0.00112 * (float)lux1); + lux = 0.00146 * lux0 - 0.00112 * lux1; + } + else{ + lux = 0; + } + + return (int)lux; +} + +//unsigned int myTSL2561::setRate(int channel){ +void myTSL2561::setRate(int channel){ + //timing_cmd[0] = COMMAND | TIMING_REG; + cmd[0] = COMMAND | TIMING_REG; if(channel == 0){ - time = 14; - timing_cmd[1] = TIMING | 0x00; - i2c->write(SLV_WRITE_TSL, timing_cmd, 2); + //time = 14; + //timing_cmd[1] = TIMING | 0x00; + cmd[1] = TIMING | 0x00; + scale = 0.034; + //i2c->write(SLV_WRITE_TSL, timing_cmd, 2); + //i2c -> write(SLV_WRITE_TSL, cmd, 2); } else if(channel == 1){ - time = 105; - timing_cmd[1] = TIMING | 0x01; - i2c->write(SLV_WRITE_TSL, timing_cmd, 2); + //time = 105; + //timing_cmd[1] = TIMING | 0x01; + cmd[1] = TIMING | 0x01; + scale = 0.252; + //i2c->write(SLV_WRITE_TSL, timing_cmd, 2); + //i2c -> write(SLV_WRITE_TSL, cmd, 2); } else if(channel == 2){ - time = 405; - timing_cmd[1] = TIMING | 0x02; - i2c->write(SLV_WRITE_TSL, timing_cmd, 2); + //time = 405; + //timing_cmd[1] = TIMING | 0x02; + cmd[1] = TIMING | 0x02; + scale = 1; + //i2c->write(SLV_WRITE_TSL, timing_cmd, 2); + //i2c -> write(SLV_WRITE_TSL, cmd, 2); } + i2c -> write(SLV_WRITE_TSL, cmd, 2); - return time; + //return time; } - - - \ No newline at end of file