Vishay VEML6040 Color RGB sensor I2C driver library
Dependents: test_VEML6040 testSensor
VEML6040.cpp
- Committer:
- shockey
- Date:
- 2016-02-05
- Revision:
- 0:e6e6107c659e
- Child:
- 1:5540b216acfc
File content as of revision 0:e6e6107c659e:
/* * 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); }