TSL2561(照度センサ)のライブラリです

Dependents:   HYBRYD2018_IZU_ROCKET Hybrid_IZU2019

TSL2561.cpp

Committer:
Sigma884
Date:
2019-01-12
Revision:
3:f62d7ea19cbb
Parent:
2:276a177de00b
Child:
4:c1e82279b4bb

File content as of revision 3:f62d7ea19cbb:

#include "mbed.h"
#include "math.h"
#include "TSL2561.h"

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;
    }
    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;
}