Vishay VEML6040 Color RGB sensor I2C driver library
Dependents: test_VEML6040 testSensor
Diff: VEML6040.cpp
- Revision:
- 1:5540b216acfc
- Parent:
- 0:e6e6107c659e
- Child:
- 2:239c3561d21a
--- a/VEML6040.cpp Fri Feb 05 02:21:10 2016 +0000 +++ b/VEML6040.cpp Wed Mar 08 04:45:35 2017 +0000 @@ -18,8 +18,8 @@ #define REG_W_Data 0x0B // Following magic numbers are from -// VISHAY veml6075 Application Note 84339 -// Page 6 +// VISHAY veml6040 Application Note 84331 +// Page 4 #define LUX_RESOLUTION_0 (0.25168) #define LUX_RESOLUTION_1 (0.12584) #define LUX_RESOLUTION_2 (0.06292) @@ -27,6 +27,25 @@ #define LUX_RESOLUTION_4 (0.01573) #define LUX_RESOLUTION_5 (0.007865) +// Following magic numbers are from +// VISHAY veml6040 Application Note 84331 +// Page 9 +#define CORR_COEFF_M0 (0.048403) +#define CORR_COEFF_M1 (0.183633) +#define CORR_COEFF_M2 (-0.253589) +#define CORR_COEFF_M3 (0.022916) +#define CORR_COEFF_M4 (0.176388) +#define CORR_COEFF_M5 (-0.183205) +#define CORR_COEFF_M6 (-0.077436) +#define CORR_COEFF_M7 (0.124541) +#define CORR_COEFF_M8 (0.032081) + +// Following magic numbers are from +// VISHAY veml6040 Application Note 84331 +// Page 10 +#define CCT_CONST (4278.6) +#define OFFSET_OPEN_AIR (0.5) + VEML6040::VEML6040(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { // activate the peripheral } @@ -144,6 +163,95 @@ return( value ) ; } +float VEML6040::getX(void) +{ + uint16_t R ; + uint16_t G ; + uint16_t B ; + float value ; + getRData(&R) ; + getGData(&G) ; + getBData(&B) ; + value = (float)CORR_COEFF_M0 * (float)R + (float)CORR_COEFF_M1 * (float)G + (float)CORR_COEFF_M2 * (float)B ; + return( value ) ; +} + +float VEML6040::getY(void) +{ + uint16_t R ; + uint16_t G ; + uint16_t B ; + float value ; + getRData(&R) ; + getGData(&G) ; + getBData(&B) ; + value = (float)CORR_COEFF_M3 * (float)R + (float)CORR_COEFF_M4 * (float)G + (float)CORR_COEFF_M5 * (float)B ; + return( value ) ; +} + +float VEML6040::getZ(void) +{ + uint16_t R ; + uint16_t G ; + uint16_t B ; + float value ; + getRData(&R) ; + getGData(&G) ; + getBData(&B) ; + value = (float)CORR_COEFF_M6 * (float)R + (float)CORR_COEFF_M7 * (float)G + (float)CORR_COEFF_M8 * (float)B ; + return( value ) ; +} + +float VEML6040::getCCTiData(void) +{ + uint16_t rdata ; + uint16_t gdata ; + uint16_t bdata ; + float value ; + getRData(&rdata) ; + getGData(&gdata) ; + getBData(&bdata) ; + value = ((float)rdata - (float)bdata) / (float)gdata + (float)OFFSET_OPEN_AIR ; + return( value ) ; +} + +float VEML6040::getCCTData(void) +{ +// uint16_t cctidata ; + float cctidata ; + float value ; + cctidata = getCCTiData() ; +// getCCTiData(&cctidata) ; + value = (float)CCT_CONST * powf( cctidata, -1.2455 ) ; + return( value ) ; +} + +float VEML6040::getCIEX(void) +{ + float X ; + float Y ; + float Z ; + float value ; + X = getX() ; + Y = getY() ; + Z = getZ() ; + value = (float)X / ((float)X + (float)Y + (float)Z) ; + return( value ) ; +} + +float VEML6040::getCIEY(void) +{ + float X ; + float Y ; + float Z ; + float value ; + X = getX() ; + Y = getY() ; + Z = getZ() ; + value = (float)Y / ((float)X + (float)Y + (float)Z) ; + return( value ) ; +} + void VEML6040::readRegs(int addr, uint8_t * data, int len) { char t[1] = {addr}; m_i2c.write(m_addr, t, 1, true);