Vishay VEML6040 Color RGB sensor I2C driver library

Dependents:   test_VEML6040 testSensor

Committer:
shockey
Date:
Fri Feb 05 02:21:10 2016 +0000
Revision:
0:e6e6107c659e
Child:
1:5540b216acfc
First working version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shockey 0:e6e6107c659e 1 /*
shockey 0:e6e6107c659e 2 * File description here
shockey 0:e6e6107c659e 3 */
shockey 0:e6e6107c659e 4 #include "VEML6040.h"
shockey 0:e6e6107c659e 5
shockey 0:e6e6107c659e 6 /* VEML6075 SLAVE ADDRESS AND FUNCTION DESCRIPTION */
shockey 0:e6e6107c659e 7 #define REG_COLOR_CONF 0x00
shockey 0:e6e6107c659e 8 #define REG_Reserved1 0x01
shockey 0:e6e6107c659e 9 #define REG_Reserved2 0x02
shockey 0:e6e6107c659e 10 #define REG_Reserved3 0x03
shockey 0:e6e6107c659e 11 #define REG_Reserved4 0x04
shockey 0:e6e6107c659e 12 #define REG_Reserved5 0x05
shockey 0:e6e6107c659e 13 #define REG_Reserved6 0x06
shockey 0:e6e6107c659e 14 #define REG_Reserved7 0x07
shockey 0:e6e6107c659e 15 #define REG_R_Data 0x08
shockey 0:e6e6107c659e 16 #define REG_G_Data 0x09
shockey 0:e6e6107c659e 17 #define REG_B_Data 0x0A
shockey 0:e6e6107c659e 18 #define REG_W_Data 0x0B
shockey 0:e6e6107c659e 19
shockey 0:e6e6107c659e 20 // Following magic numbers are from
shockey 0:e6e6107c659e 21 // VISHAY veml6075 Application Note 84339
shockey 0:e6e6107c659e 22 // Page 6
shockey 0:e6e6107c659e 23 #define LUX_RESOLUTION_0 (0.25168)
shockey 0:e6e6107c659e 24 #define LUX_RESOLUTION_1 (0.12584)
shockey 0:e6e6107c659e 25 #define LUX_RESOLUTION_2 (0.06292)
shockey 0:e6e6107c659e 26 #define LUX_RESOLUTION_3 (0.03146)
shockey 0:e6e6107c659e 27 #define LUX_RESOLUTION_4 (0.01573)
shockey 0:e6e6107c659e 28 #define LUX_RESOLUTION_5 (0.007865)
shockey 0:e6e6107c659e 29
shockey 0:e6e6107c659e 30 VEML6040::VEML6040(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
shockey 0:e6e6107c659e 31 // activate the peripheral
shockey 0:e6e6107c659e 32 }
shockey 0:e6e6107c659e 33
shockey 0:e6e6107c659e 34 VEML6040::~VEML6040() { }
shockey 0:e6e6107c659e 35
shockey 0:e6e6107c659e 36 #if 0
shockey 0:e6e6107c659e 37 //
shockey 0:e6e6107c659e 38 // numdata is supposed to be 2
shockey 0:e6e6107c659e 39 //
shockey 0:e6e6107c659e 40 void VEML6040::cmdWrite(uint8_t cmd, uint8_t *data, uint8_t numdata)
shockey 0:e6e6107c659e 41 {
shockey 0:e6e6107c659e 42 uint8_t buf[3] ;
shockey 0:e6e6107c659e 43
shockey 0:e6e6107c659e 44 buf[0] = cmd ;
shockey 0:e6e6107c659e 45 buf[1] = data[0] ;
shockey 0:e6e6107c659e 46 buf[2] = data[1] ;
shockey 0:e6e6107c659e 47 writeRegs(data, 3) ;
shockey 0:e6e6107c659e 48 }
shockey 0:e6e6107c659e 49
shockey 0:e6e6107c659e 50 //
shockey 0:e6e6107c659e 51 // numdata is supposed to be 2
shockey 0:e6e6107c659e 52 //
shockey 0:e6e6107c659e 53
shockey 0:e6e6107c659e 54 void VEML6040::cmdRead(uint8_t cmd, uint8_t *data, uint8_t numdata)
shockey 0:e6e6107c659e 55 {
shockey 0:e6e6107c659e 56 uint8_t buf[1] ;
shockey 0:e6e6107c659e 57 buf[0] = cmd ;
shockey 0:e6e6107c659e 58 m_i2c.write(m_addr, buf, 1, true) ; // writing command
shockey 0:e6e6107c659e 59 m_i2c.read(m_addr, (char*)data, numdata) ;
shockey 0:e6e6107c659e 60 }
shockey 0:e6e6107c659e 61 #endif
shockey 0:e6e6107c659e 62
shockey 0:e6e6107c659e 63 void VEML6040::getCOLORConf(uint8_t *colorconf)
shockey 0:e6e6107c659e 64 {
shockey 0:e6e6107c659e 65 uint8_t data[2] ;
shockey 0:e6e6107c659e 66 readRegs(REG_COLOR_CONF, data, 2) ;
shockey 0:e6e6107c659e 67 *colorconf = data[1] ;
shockey 0:e6e6107c659e 68 }
shockey 0:e6e6107c659e 69
shockey 0:e6e6107c659e 70 void VEML6040::setCOLORConf(uint8_t colorconf)
shockey 0:e6e6107c659e 71 {
shockey 0:e6e6107c659e 72 uint8_t data[3] ;
shockey 0:e6e6107c659e 73 data[0] = REG_COLOR_CONF ;
shockey 0:e6e6107c659e 74 data[1] = colorconf ;
shockey 0:e6e6107c659e 75 data[2] = 0 ;
shockey 0:e6e6107c659e 76 writeRegs(data, 3) ;
shockey 0:e6e6107c659e 77 }
shockey 0:e6e6107c659e 78
shockey 0:e6e6107c659e 79
shockey 0:e6e6107c659e 80 void VEML6040::getRData(uint16_t *rdata)
shockey 0:e6e6107c659e 81 {
shockey 0:e6e6107c659e 82 uint8_t data[2] ;
shockey 0:e6e6107c659e 83 readRegs(REG_R_Data, data, 2) ;
shockey 0:e6e6107c659e 84 *rdata = (data[1]<<8) | data[0] ;
shockey 0:e6e6107c659e 85 }
shockey 0:e6e6107c659e 86
shockey 0:e6e6107c659e 87 void VEML6040::getGData(uint16_t *gdata)
shockey 0:e6e6107c659e 88 {
shockey 0:e6e6107c659e 89 uint8_t data[2] ;
shockey 0:e6e6107c659e 90 readRegs(REG_G_Data, data, 2) ;
shockey 0:e6e6107c659e 91 *gdata = (data[1]<<8) | data[0] ;
shockey 0:e6e6107c659e 92 }
shockey 0:e6e6107c659e 93
shockey 0:e6e6107c659e 94 void VEML6040::getBData(uint16_t *bdata)
shockey 0:e6e6107c659e 95 {
shockey 0:e6e6107c659e 96 uint8_t data[2] ;
shockey 0:e6e6107c659e 97 readRegs(REG_B_Data, data, 2) ;
shockey 0:e6e6107c659e 98 *bdata = (data[1]<<8) | data[0] ;
shockey 0:e6e6107c659e 99 }
shockey 0:e6e6107c659e 100
shockey 0:e6e6107c659e 101 void VEML6040::getWData(uint16_t *wdata)
shockey 0:e6e6107c659e 102 {
shockey 0:e6e6107c659e 103 uint8_t data[2] ;
shockey 0:e6e6107c659e 104 readRegs(REG_W_Data, data, 2) ;
shockey 0:e6e6107c659e 105 *wdata = (data[1]<<8) | data[0] ;
shockey 0:e6e6107c659e 106 }
shockey 0:e6e6107c659e 107
shockey 0:e6e6107c659e 108 // usage
shockey 0:e6e6107c659e 109 // fvalue = veml->getUVA() ;
shockey 0:e6e6107c659e 110 // printf("%f", fvalue) ;
shockey 0:e6e6107c659e 111 float VEML6040::getR(void)
shockey 0:e6e6107c659e 112 {
shockey 0:e6e6107c659e 113 uint16_t data ;
shockey 0:e6e6107c659e 114 float value ;
shockey 0:e6e6107c659e 115 getRData(&data) ;
shockey 0:e6e6107c659e 116 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 117 return( value ) ;
shockey 0:e6e6107c659e 118 }
shockey 0:e6e6107c659e 119
shockey 0:e6e6107c659e 120 float VEML6040::getG(void)
shockey 0:e6e6107c659e 121 {
shockey 0:e6e6107c659e 122 uint16_t data ;
shockey 0:e6e6107c659e 123 float value ;
shockey 0:e6e6107c659e 124 getGData(&data) ;
shockey 0:e6e6107c659e 125 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 126 return( value ) ;
shockey 0:e6e6107c659e 127 }
shockey 0:e6e6107c659e 128
shockey 0:e6e6107c659e 129 float VEML6040::getB(void)
shockey 0:e6e6107c659e 130 {
shockey 0:e6e6107c659e 131 uint16_t data ;
shockey 0:e6e6107c659e 132 float value ;
shockey 0:e6e6107c659e 133 getBData(&data) ;
shockey 0:e6e6107c659e 134 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 135 return( value ) ;
shockey 0:e6e6107c659e 136 }
shockey 0:e6e6107c659e 137
shockey 0:e6e6107c659e 138 float VEML6040::getW(void)
shockey 0:e6e6107c659e 139 {
shockey 0:e6e6107c659e 140 uint16_t data ;
shockey 0:e6e6107c659e 141 float value ;
shockey 0:e6e6107c659e 142 getWData(&data) ;
shockey 0:e6e6107c659e 143 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 144 return( value ) ;
shockey 0:e6e6107c659e 145 }
shockey 0:e6e6107c659e 146
shockey 0:e6e6107c659e 147 void VEML6040::readRegs(int addr, uint8_t * data, int len) {
shockey 0:e6e6107c659e 148 char t[1] = {addr};
shockey 0:e6e6107c659e 149 m_i2c.write(m_addr, t, 1, true);
shockey 0:e6e6107c659e 150 m_i2c.read(m_addr, (char *)data, len);
shockey 0:e6e6107c659e 151 }
shockey 0:e6e6107c659e 152
shockey 0:e6e6107c659e 153 void VEML6040::writeRegs(uint8_t * data, int len) {
shockey 0:e6e6107c659e 154 m_i2c.write(m_addr, (char *)data, len);
shockey 0:e6e6107c659e 155 }