Vishay VEML6040 Color RGB sensor I2C driver library
Dependents: test_VEML6040 testSensor
Diff: VEML6040.cpp
- Revision:
- 0:e6e6107c659e
- Child:
- 1:5540b216acfc
diff -r 000000000000 -r e6e6107c659e VEML6040.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VEML6040.cpp Fri Feb 05 02:21:10 2016 +0000 @@ -0,0 +1,155 @@ +/* + * File description here + */ +#include "VEML6040.h" + +/* VEML6075 SLAVE ADDRESS AND FUNCTION DESCRIPTION */ +#define REG_COLOR_CONF 0x00 +#define REG_Reserved1 0x01 +#define REG_Reserved2 0x02 +#define REG_Reserved3 0x03 +#define REG_Reserved4 0x04 +#define REG_Reserved5 0x05 +#define REG_Reserved6 0x06 +#define REG_Reserved7 0x07 +#define REG_R_Data 0x08 +#define REG_G_Data 0x09 +#define REG_B_Data 0x0A +#define REG_W_Data 0x0B + +// Following magic numbers are from +// VISHAY veml6075 Application Note 84339 +// Page 6 +#define LUX_RESOLUTION_0 (0.25168) +#define LUX_RESOLUTION_1 (0.12584) +#define LUX_RESOLUTION_2 (0.06292) +#define LUX_RESOLUTION_3 (0.03146) +#define LUX_RESOLUTION_4 (0.01573) +#define LUX_RESOLUTION_5 (0.007865) + +VEML6040::VEML6040(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { + // activate the peripheral +} + +VEML6040::~VEML6040() { } + +#if 0 +// +// numdata is supposed to be 2 +// +void VEML6040::cmdWrite(uint8_t cmd, uint8_t *data, uint8_t numdata) +{ + uint8_t buf[3] ; + + buf[0] = cmd ; + buf[1] = data[0] ; + buf[2] = data[1] ; + writeRegs(data, 3) ; +} + +// +// numdata is supposed to be 2 +// + +void VEML6040::cmdRead(uint8_t cmd, uint8_t *data, uint8_t numdata) +{ + uint8_t buf[1] ; + buf[0] = cmd ; + m_i2c.write(m_addr, buf, 1, true) ; // writing command + m_i2c.read(m_addr, (char*)data, numdata) ; +} +#endif + +void VEML6040::getCOLORConf(uint8_t *colorconf) +{ + uint8_t data[2] ; + readRegs(REG_COLOR_CONF, data, 2) ; + *colorconf = data[1] ; +} + +void VEML6040::setCOLORConf(uint8_t colorconf) +{ + uint8_t data[3] ; + data[0] = REG_COLOR_CONF ; + data[1] = colorconf ; + data[2] = 0 ; + writeRegs(data, 3) ; +} + + +void VEML6040::getRData(uint16_t *rdata) +{ + uint8_t data[2] ; + readRegs(REG_R_Data, data, 2) ; + *rdata = (data[1]<<8) | data[0] ; +} + +void VEML6040::getGData(uint16_t *gdata) +{ + uint8_t data[2] ; + readRegs(REG_G_Data, data, 2) ; + *gdata = (data[1]<<8) | data[0] ; +} + +void VEML6040::getBData(uint16_t *bdata) +{ + uint8_t data[2] ; + readRegs(REG_B_Data, data, 2) ; + *bdata = (data[1]<<8) | data[0] ; +} + +void VEML6040::getWData(uint16_t *wdata) +{ + uint8_t data[2] ; + readRegs(REG_W_Data, data, 2) ; + *wdata = (data[1]<<8) | data[0] ; +} + +// usage +// fvalue = veml->getUVA() ; +// printf("%f", fvalue) ; +float VEML6040::getR(void) +{ + uint16_t data ; + float value ; + getRData(&data) ; + value = (float)LUX_RESOLUTION_0 * (float)data ; + return( value ) ; +} + +float VEML6040::getG(void) +{ + uint16_t data ; + float value ; + getGData(&data) ; + value = (float)LUX_RESOLUTION_0 * (float)data ; + return( value ) ; +} + +float VEML6040::getB(void) +{ + uint16_t data ; + float value ; + getBData(&data) ; + value = (float)LUX_RESOLUTION_0 * (float)data ; + return( value ) ; +} + +float VEML6040::getW(void) +{ + uint16_t data ; + float value ; + getWData(&data) ; + value = (float)LUX_RESOLUTION_0 * (float)data ; + return( value ) ; +} + +void VEML6040::readRegs(int addr, uint8_t * data, int len) { + char t[1] = {addr}; + m_i2c.write(m_addr, t, 1, true); + m_i2c.read(m_addr, (char *)data, len); +} + +void VEML6040::writeRegs(uint8_t * data, int len) { + m_i2c.write(m_addr, (char *)data, len); +} \ No newline at end of file