TSL2561(照度センサ)のライブラリです
Dependents: HYBRYD2018_IZU_ROCKET Hybrid_IZU2019
TSL2561.cpp
- Committer:
- Okamoto009
- Date:
- 2019-02-26
- Revision:
- 4:c1e82279b4bb
- Parent:
- 3:f62d7ea19cbb
File content as of revision 4:c1e82279b4bb:
#include "mbed.h" #include "math.h" #include "TSL2561.h" myTSL2561::myTSL2561(I2C &i2cBus, AD0 celect){ i2c = &i2cBus; if(celect == AD0_LOW){ _addr = TSL_SLV_ADDR_LOW; } else if(celect == AD0_HIGH){ _addr = TSL_SLV_ADDR_HIGH; } else{ _addr = TSL_SLV_ADDR_OPEN; } SLV_WRITE_TSL = _addr; SLV_READ_TSL = _addr | 1; i2c -> frequency(400000); } 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); i2c -> write(SLV_WRITE_TSL, cmd, 2); //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::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, 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;} if(buff[0] == ID_NUMBER){ return 1; } else{ return 0; } } //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); 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]); //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; 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; } 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; 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; 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; 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; }