Vishay VEML6040 Color RGB sensor I2C driver library

Dependents:   test_VEML6040 testSensor

Committer:
Rhyme
Date:
Mon Jun 05 02:02:20 2017 +0000
Revision:
4:f5b142e3fe79
Parent:
2:239c3561d21a
Child:
5:a4dcc19d057e
readRegs/writeRegs now return I2C result

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 1:5540b216acfc 21 // VISHAY veml6040 Application Note 84331
shockey 1:5540b216acfc 22 // Page 4
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 1:5540b216acfc 30 // Following magic numbers are from
shockey 1:5540b216acfc 31 // VISHAY veml6040 Application Note 84331
shockey 1:5540b216acfc 32 // Page 9
shockey 1:5540b216acfc 33 #define CORR_COEFF_M0 (0.048403)
shockey 1:5540b216acfc 34 #define CORR_COEFF_M1 (0.183633)
shockey 1:5540b216acfc 35 #define CORR_COEFF_M2 (-0.253589)
shockey 1:5540b216acfc 36 #define CORR_COEFF_M3 (0.022916)
shockey 1:5540b216acfc 37 #define CORR_COEFF_M4 (0.176388)
shockey 1:5540b216acfc 38 #define CORR_COEFF_M5 (-0.183205)
shockey 1:5540b216acfc 39 #define CORR_COEFF_M6 (-0.077436)
shockey 1:5540b216acfc 40 #define CORR_COEFF_M7 (0.124541)
shockey 1:5540b216acfc 41 #define CORR_COEFF_M8 (0.032081)
shockey 1:5540b216acfc 42
shockey 1:5540b216acfc 43 // Following magic numbers are from
shockey 1:5540b216acfc 44 // VISHAY veml6040 Application Note 84331
shockey 1:5540b216acfc 45 // Page 10
shockey 1:5540b216acfc 46 #define CCT_CONST (4278.6)
shockey 1:5540b216acfc 47 #define OFFSET_OPEN_AIR (0.5)
shockey 1:5540b216acfc 48
shockey 0:e6e6107c659e 49 VEML6040::VEML6040(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
shockey 0:e6e6107c659e 50 // activate the peripheral
shockey 0:e6e6107c659e 51 }
shockey 0:e6e6107c659e 52
shockey 0:e6e6107c659e 53 VEML6040::~VEML6040() { }
shockey 0:e6e6107c659e 54
shockey 0:e6e6107c659e 55 #if 0
shockey 0:e6e6107c659e 56 //
shockey 0:e6e6107c659e 57 // numdata is supposed to be 2
shockey 0:e6e6107c659e 58 //
shockey 0:e6e6107c659e 59 void VEML6040::cmdWrite(uint8_t cmd, uint8_t *data, uint8_t numdata)
shockey 0:e6e6107c659e 60 {
shockey 0:e6e6107c659e 61 uint8_t buf[3] ;
shockey 0:e6e6107c659e 62
shockey 0:e6e6107c659e 63 buf[0] = cmd ;
shockey 0:e6e6107c659e 64 buf[1] = data[0] ;
shockey 0:e6e6107c659e 65 buf[2] = data[1] ;
Rhyme 2:239c3561d21a 66 writeRegs(buf, 3) ;
shockey 0:e6e6107c659e 67 }
shockey 0:e6e6107c659e 68
shockey 0:e6e6107c659e 69 //
shockey 0:e6e6107c659e 70 // numdata is supposed to be 2
shockey 0:e6e6107c659e 71 //
shockey 0:e6e6107c659e 72
shockey 0:e6e6107c659e 73 void VEML6040::cmdRead(uint8_t cmd, uint8_t *data, uint8_t numdata)
shockey 0:e6e6107c659e 74 {
shockey 0:e6e6107c659e 75 uint8_t buf[1] ;
shockey 0:e6e6107c659e 76 buf[0] = cmd ;
shockey 0:e6e6107c659e 77 m_i2c.write(m_addr, buf, 1, true) ; // writing command
shockey 0:e6e6107c659e 78 m_i2c.read(m_addr, (char*)data, numdata) ;
shockey 0:e6e6107c659e 79 }
shockey 0:e6e6107c659e 80 #endif
shockey 0:e6e6107c659e 81
shockey 0:e6e6107c659e 82 void VEML6040::getCOLORConf(uint8_t *colorconf)
shockey 0:e6e6107c659e 83 {
shockey 0:e6e6107c659e 84 uint8_t data[2] ;
shockey 0:e6e6107c659e 85 readRegs(REG_COLOR_CONF, data, 2) ;
Rhyme 2:239c3561d21a 86 *colorconf = data[0] ;
shockey 0:e6e6107c659e 87 }
shockey 0:e6e6107c659e 88
shockey 0:e6e6107c659e 89 void VEML6040::setCOLORConf(uint8_t colorconf)
shockey 0:e6e6107c659e 90 {
shockey 0:e6e6107c659e 91 uint8_t data[3] ;
shockey 0:e6e6107c659e 92 data[0] = REG_COLOR_CONF ;
shockey 0:e6e6107c659e 93 data[1] = colorconf ;
shockey 0:e6e6107c659e 94 data[2] = 0 ;
shockey 0:e6e6107c659e 95 writeRegs(data, 3) ;
shockey 0:e6e6107c659e 96 }
shockey 0:e6e6107c659e 97
shockey 0:e6e6107c659e 98
Rhyme 4:f5b142e3fe79 99 int VEML6040::getRData(uint16_t *rdata)
shockey 0:e6e6107c659e 100 {
shockey 0:e6e6107c659e 101 uint8_t data[2] ;
Rhyme 4:f5b142e3fe79 102 int result ;
Rhyme 4:f5b142e3fe79 103 result = readRegs(REG_R_Data, data, 2) ;
shockey 0:e6e6107c659e 104 *rdata = (data[1]<<8) | data[0] ;
Rhyme 4:f5b142e3fe79 105 return( result ) ;
shockey 0:e6e6107c659e 106 }
shockey 0:e6e6107c659e 107
Rhyme 4:f5b142e3fe79 108 int VEML6040::getGData(uint16_t *gdata)
shockey 0:e6e6107c659e 109 {
shockey 0:e6e6107c659e 110 uint8_t data[2] ;
Rhyme 4:f5b142e3fe79 111 int result ;
Rhyme 4:f5b142e3fe79 112 result = readRegs(REG_G_Data, data, 2) ;
shockey 0:e6e6107c659e 113 *gdata = (data[1]<<8) | data[0] ;
Rhyme 4:f5b142e3fe79 114 return( result ) ;
shockey 0:e6e6107c659e 115 }
shockey 0:e6e6107c659e 116
Rhyme 4:f5b142e3fe79 117 int VEML6040::getBData(uint16_t *bdata)
shockey 0:e6e6107c659e 118 {
shockey 0:e6e6107c659e 119 uint8_t data[2] ;
Rhyme 4:f5b142e3fe79 120 int result ;
Rhyme 4:f5b142e3fe79 121 result = readRegs(REG_B_Data, data, 2) ;
shockey 0:e6e6107c659e 122 *bdata = (data[1]<<8) | data[0] ;
Rhyme 4:f5b142e3fe79 123 return( result ) ;
shockey 0:e6e6107c659e 124 }
shockey 0:e6e6107c659e 125
Rhyme 4:f5b142e3fe79 126 int VEML6040::getWData(uint16_t *wdata)
shockey 0:e6e6107c659e 127 {
shockey 0:e6e6107c659e 128 uint8_t data[2] ;
Rhyme 4:f5b142e3fe79 129 int result ;
Rhyme 4:f5b142e3fe79 130 result = readRegs(REG_W_Data, data, 2) ;
shockey 0:e6e6107c659e 131 *wdata = (data[1]<<8) | data[0] ;
Rhyme 4:f5b142e3fe79 132 return( result ) ;
shockey 0:e6e6107c659e 133 }
shockey 0:e6e6107c659e 134
shockey 0:e6e6107c659e 135 // usage
shockey 0:e6e6107c659e 136 // fvalue = veml->getUVA() ;
shockey 0:e6e6107c659e 137 // printf("%f", fvalue) ;
shockey 0:e6e6107c659e 138 float VEML6040::getR(void)
shockey 0:e6e6107c659e 139 {
shockey 0:e6e6107c659e 140 uint16_t data ;
shockey 0:e6e6107c659e 141 float value ;
shockey 0:e6e6107c659e 142 getRData(&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 float VEML6040::getG(void)
shockey 0:e6e6107c659e 148 {
shockey 0:e6e6107c659e 149 uint16_t data ;
shockey 0:e6e6107c659e 150 float value ;
shockey 0:e6e6107c659e 151 getGData(&data) ;
shockey 0:e6e6107c659e 152 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 153 return( value ) ;
shockey 0:e6e6107c659e 154 }
shockey 0:e6e6107c659e 155
shockey 0:e6e6107c659e 156 float VEML6040::getB(void)
shockey 0:e6e6107c659e 157 {
shockey 0:e6e6107c659e 158 uint16_t data ;
shockey 0:e6e6107c659e 159 float value ;
shockey 0:e6e6107c659e 160 getBData(&data) ;
shockey 0:e6e6107c659e 161 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 162 return( value ) ;
shockey 0:e6e6107c659e 163 }
shockey 0:e6e6107c659e 164
shockey 0:e6e6107c659e 165 float VEML6040::getW(void)
shockey 0:e6e6107c659e 166 {
shockey 0:e6e6107c659e 167 uint16_t data ;
shockey 0:e6e6107c659e 168 float value ;
shockey 0:e6e6107c659e 169 getWData(&data) ;
shockey 0:e6e6107c659e 170 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 171 return( value ) ;
shockey 0:e6e6107c659e 172 }
shockey 0:e6e6107c659e 173
shockey 1:5540b216acfc 174 float VEML6040::getX(void)
shockey 1:5540b216acfc 175 {
shockey 1:5540b216acfc 176 uint16_t R ;
shockey 1:5540b216acfc 177 uint16_t G ;
shockey 1:5540b216acfc 178 uint16_t B ;
shockey 1:5540b216acfc 179 float value ;
shockey 1:5540b216acfc 180 getRData(&R) ;
shockey 1:5540b216acfc 181 getGData(&G) ;
shockey 1:5540b216acfc 182 getBData(&B) ;
shockey 1:5540b216acfc 183 value = (float)CORR_COEFF_M0 * (float)R + (float)CORR_COEFF_M1 * (float)G + (float)CORR_COEFF_M2 * (float)B ;
shockey 1:5540b216acfc 184 return( value ) ;
shockey 1:5540b216acfc 185 }
shockey 1:5540b216acfc 186
shockey 1:5540b216acfc 187 float VEML6040::getY(void)
shockey 1:5540b216acfc 188 {
shockey 1:5540b216acfc 189 uint16_t R ;
shockey 1:5540b216acfc 190 uint16_t G ;
shockey 1:5540b216acfc 191 uint16_t B ;
shockey 1:5540b216acfc 192 float value ;
shockey 1:5540b216acfc 193 getRData(&R) ;
shockey 1:5540b216acfc 194 getGData(&G) ;
shockey 1:5540b216acfc 195 getBData(&B) ;
shockey 1:5540b216acfc 196 value = (float)CORR_COEFF_M3 * (float)R + (float)CORR_COEFF_M4 * (float)G + (float)CORR_COEFF_M5 * (float)B ;
shockey 1:5540b216acfc 197 return( value ) ;
shockey 1:5540b216acfc 198 }
shockey 1:5540b216acfc 199
shockey 1:5540b216acfc 200 float VEML6040::getZ(void)
shockey 1:5540b216acfc 201 {
shockey 1:5540b216acfc 202 uint16_t R ;
shockey 1:5540b216acfc 203 uint16_t G ;
shockey 1:5540b216acfc 204 uint16_t B ;
shockey 1:5540b216acfc 205 float value ;
shockey 1:5540b216acfc 206 getRData(&R) ;
shockey 1:5540b216acfc 207 getGData(&G) ;
shockey 1:5540b216acfc 208 getBData(&B) ;
shockey 1:5540b216acfc 209 value = (float)CORR_COEFF_M6 * (float)R + (float)CORR_COEFF_M7 * (float)G + (float)CORR_COEFF_M8 * (float)B ;
shockey 1:5540b216acfc 210 return( value ) ;
shockey 1:5540b216acfc 211 }
shockey 1:5540b216acfc 212
shockey 1:5540b216acfc 213 float VEML6040::getCCTiData(void)
shockey 1:5540b216acfc 214 {
shockey 1:5540b216acfc 215 uint16_t rdata ;
shockey 1:5540b216acfc 216 uint16_t gdata ;
shockey 1:5540b216acfc 217 uint16_t bdata ;
shockey 1:5540b216acfc 218 float value ;
shockey 1:5540b216acfc 219 getRData(&rdata) ;
shockey 1:5540b216acfc 220 getGData(&gdata) ;
shockey 1:5540b216acfc 221 getBData(&bdata) ;
shockey 1:5540b216acfc 222 value = ((float)rdata - (float)bdata) / (float)gdata + (float)OFFSET_OPEN_AIR ;
shockey 1:5540b216acfc 223 return( value ) ;
shockey 1:5540b216acfc 224 }
shockey 1:5540b216acfc 225
shockey 1:5540b216acfc 226 float VEML6040::getCCTData(void)
shockey 1:5540b216acfc 227 {
shockey 1:5540b216acfc 228 // uint16_t cctidata ;
shockey 1:5540b216acfc 229 float cctidata ;
shockey 1:5540b216acfc 230 float value ;
shockey 1:5540b216acfc 231 cctidata = getCCTiData() ;
shockey 1:5540b216acfc 232 // getCCTiData(&cctidata) ;
shockey 1:5540b216acfc 233 value = (float)CCT_CONST * powf( cctidata, -1.2455 ) ;
shockey 1:5540b216acfc 234 return( value ) ;
shockey 1:5540b216acfc 235 }
shockey 1:5540b216acfc 236
shockey 1:5540b216acfc 237 float VEML6040::getCIEX(void)
shockey 1:5540b216acfc 238 {
shockey 1:5540b216acfc 239 float X ;
shockey 1:5540b216acfc 240 float Y ;
shockey 1:5540b216acfc 241 float Z ;
shockey 1:5540b216acfc 242 float value ;
shockey 1:5540b216acfc 243 X = getX() ;
shockey 1:5540b216acfc 244 Y = getY() ;
shockey 1:5540b216acfc 245 Z = getZ() ;
shockey 1:5540b216acfc 246 value = (float)X / ((float)X + (float)Y + (float)Z) ;
shockey 1:5540b216acfc 247 return( value ) ;
shockey 1:5540b216acfc 248 }
shockey 1:5540b216acfc 249
shockey 1:5540b216acfc 250 float VEML6040::getCIEY(void)
shockey 1:5540b216acfc 251 {
shockey 1:5540b216acfc 252 float X ;
shockey 1:5540b216acfc 253 float Y ;
shockey 1:5540b216acfc 254 float Z ;
shockey 1:5540b216acfc 255 float value ;
shockey 1:5540b216acfc 256 X = getX() ;
shockey 1:5540b216acfc 257 Y = getY() ;
shockey 1:5540b216acfc 258 Z = getZ() ;
shockey 1:5540b216acfc 259 value = (float)Y / ((float)X + (float)Y + (float)Z) ;
shockey 1:5540b216acfc 260 return( value ) ;
shockey 1:5540b216acfc 261 }
shockey 1:5540b216acfc 262
Rhyme 4:f5b142e3fe79 263 int VEML6040::readRegs(int addr, uint8_t * data, int len) {
shockey 0:e6e6107c659e 264 char t[1] = {addr};
Rhyme 4:f5b142e3fe79 265 int result ;
Rhyme 4:f5b142e3fe79 266 result = m_i2c.write(m_addr, t, 1, true);
Rhyme 4:f5b142e3fe79 267 if (result == 0) { // wirte success
Rhyme 4:f5b142e3fe79 268 result = m_i2c.read(m_addr, (char *)data, len);
Rhyme 4:f5b142e3fe79 269 }
Rhyme 4:f5b142e3fe79 270 return(result) ;
shockey 0:e6e6107c659e 271 }
shockey 0:e6e6107c659e 272
Rhyme 4:f5b142e3fe79 273 int VEML6040::writeRegs(uint8_t * data, int len) {
Rhyme 4:f5b142e3fe79 274 int result ;
Rhyme 4:f5b142e3fe79 275 result = m_i2c.write(m_addr, (char *)data, len);
Rhyme 4:f5b142e3fe79 276 return(result) ;
shockey 0:e6e6107c659e 277 }