Adafruit TSL2591 sensor

Dependencies:   mbed

TSL2591.cpp

Committer:
12104404
Date:
2016-04-04
Revision:
4:66ce66d4c07c
Parent:
3:fecb1929cbef

File content as of revision 4:66ce66d4c07c:

#include "TSL2591.h"

TSL2591::TSL2591 (I2C& tsl2591_i2c, uint8_t tsl2591_addr):
    _i2c(tsl2591_i2c), _addr(tsl2591_addr<<1)
{
    _init = false;
    _integ = TSL2591_INTT_100MS;
    _gain = TSL2591_GAIN_LOW;
}
/*
 *  Initialize TSL2591
 *  Checks ID and sets gain and integration time
 */
bool TSL2591::init(void)
{
    char write[] = {(TSL2591_CMD_BIT|TSL2591_REG_ID)};
    if(_i2c.write(_addr, write, 1, 0) == 0) {
        char read[1];
        _i2c.read(_addr, read, 1, 0);
        if(read[0] == TSL2591_ID) {
            _init = true;
            setGain(TSL2591_GAIN_LOW);
            setTime(TSL2591_INTT_100MS);
            disable();
            return true;
        }
    }
    return false;
}
/*
 *  Power On TSL2591
 */
void TSL2591::enable(void)
{
    char write[] = {(TSL2591_CMD_BIT|TSL2591_REG_ENABLE), (TSL2591_EN_PON|TSL2591_EN_AEN|TSL2591_EN_AIEN|TSL2591_EN_NPIEN)};
    _i2c.write(_addr, write, 2, 0);
}
/*
 *  Power Off TSL2591
 */
void TSL2591::disable(void)
{
    char write[] = {(TSL2591_CMD_BIT|TSL2591_REG_ENABLE), (TSL2591_EN_POFF)};
    _i2c.write(_addr, write, 2, 0);
}
/*
 *  Set Gain and Write
 *  Set gain and write time and gain
 */
void TSL2591::setGain(tsl2591Gain_t gain)
{
    enable();
    _gain = gain;
    char write[] = {(TSL2591_CMD_BIT|TSL2591_REG_CONTROL), (_integ|_gain)};
    _i2c.write(_addr, write, 2, 0);
    disable();
}
/*
 *  Set Integration Time and Write
 *  Set gain and write time and gain
 */
void TSL2591::setTime(tsl2591IntegrationTime_t integ)
{
    enable();
    _integ = integ;
    char write[] = {(TSL2591_CMD_BIT|TSL2591_REG_CONTROL), (_integ|_gain)};
    _i2c.write(_addr, write, 2, 0);
    disable();
}
/*
 *  Read ALS
 *  Read full spectrum, infrared, and visible
 */
void TSL2591::getALS(void)
{
    enable();
    for(uint8_t t=0; t<=_integ+1; t++) {
        wait(0.12);
    }
    char write1[] = {(TSL2591_CMD_BIT|TSL2591_REG_CHAN1_L)};
    _i2c.write(_addr, write1, 1, 0);
    char read1[2];
    _i2c.read(_addr, read1, 2, 0);
    char write2[] = {(TSL2591_CMD_BIT|TSL2591_REG_CHAN0_L)};
    _i2c.write(_addr, write2, 1, 0);
    char read2[2];
    _i2c.read(_addr, read2, 2, 0);
    rawALS = (((read1[1]<<8)|read1[0])<<16)|((read2[1]<<8)|read2[0]);
    disable();
    full = rawALS & 0xFFFF;
    ir = rawALS >> 16;
    visible = full - ir;
}
/*
 *  Calculate Lux
 */
void TSL2591::calcLux(void)
{
    float atime, again, cpl, lux1, lux2, lux3;
    if((full == 0xFFFF)|(ir == 0xFFFF)) {
        lux3 = 0;
        return;
    }
    switch(_integ) {
        case TSL2591_INTT_100MS:
            atime = 100.0F;
            break;
        case TSL2591_INTT_200MS:
            atime = 200.0F;
            break;
        case TSL2591_INTT_300MS:
            atime = 300.0F;
            break;
        case TSL2591_INTT_400MS:
            atime = 400.0F;
            break;
        case TSL2591_INTT_500MS:
            atime = 500.0F;
            break;
        case TSL2591_INTT_600MS:
            atime = 600.0F;
            break;
        default:
            atime = 100.0F;
            break;
    }
    switch(_gain) {
        case TSL2591_GAIN_LOW:
            again = 1.0F;
            break;
        case TSL2591_GAIN_MED:
            again = 25.0F;
            break;
        case TSL2591_GAIN_HIGH:
            again = 428.0F;
            break;
        case TSL2591_GAIN_MAX:
            again = 9876.0F;
            break;
        default:
            again = 1.0F;
            break;
    }
    cpl = (atime * again) / TSL2591_LUX_DF;
    lux1 = ((float)full - (TSL2591_LUX_COEFB * (float)ir)) / cpl;
    lux2 = (( TSL2591_LUX_COEFC * (float)full ) - ( TSL2591_LUX_COEFD * (float)ir)) / cpl;
    lux3 = lux1 > lux2 ? lux1 : lux2;
    lux = (uint32_t)lux3;
}