Vishay VEML6040 Color RGB sensor I2C driver library

Dependents:   test_VEML6040 testSensor

Committer:
Rhyme
Date:
Mon Nov 06 01:18:56 2017 +0000
Revision:
5:a4dcc19d057e
Parent:
4:f5b142e3fe79
get and set Integration Time (IT) were added

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
Rhyme 5:a4dcc19d057e 49 /* integration time depending on the IT
Rhyme 5:a4dcc19d057e 50 * field in the REG_COLOR_CONF[6:4]
Rhyme 5:a4dcc19d057e 51 * According to Vishay error could be up to 20%
Rhyme 5:a4dcc19d057e 52 */
Rhyme 5:a4dcc19d057e 53 int IT_TIME[] = {
Rhyme 5:a4dcc19d057e 54 50, /* 000: 40ms */
Rhyme 5:a4dcc19d057e 55 100, /* 001: 80ms */
Rhyme 5:a4dcc19d057e 56 200, /* 010: 160ms */
Rhyme 5:a4dcc19d057e 57 400, /* 011: 320ms */
Rhyme 5:a4dcc19d057e 58 800, /* 100: 640ms */
Rhyme 5:a4dcc19d057e 59 1600, /* 101: 1280ms */
Rhyme 5:a4dcc19d057e 60 1600, /* 110: 1280ms <- place holder */
Rhyme 5:a4dcc19d057e 61 1600 /* 111: 1280ms <- place holder */
Rhyme 5:a4dcc19d057e 62 } ;
Rhyme 5:a4dcc19d057e 63
shockey 0:e6e6107c659e 64 VEML6040::VEML6040(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
shockey 0:e6e6107c659e 65 // activate the peripheral
shockey 0:e6e6107c659e 66 }
shockey 0:e6e6107c659e 67
shockey 0:e6e6107c659e 68 VEML6040::~VEML6040() { }
shockey 0:e6e6107c659e 69
shockey 0:e6e6107c659e 70 #if 0
shockey 0:e6e6107c659e 71 //
shockey 0:e6e6107c659e 72 // numdata is supposed to be 2
shockey 0:e6e6107c659e 73 //
shockey 0:e6e6107c659e 74 void VEML6040::cmdWrite(uint8_t cmd, uint8_t *data, uint8_t numdata)
shockey 0:e6e6107c659e 75 {
shockey 0:e6e6107c659e 76 uint8_t buf[3] ;
shockey 0:e6e6107c659e 77
shockey 0:e6e6107c659e 78 buf[0] = cmd ;
shockey 0:e6e6107c659e 79 buf[1] = data[0] ;
shockey 0:e6e6107c659e 80 buf[2] = data[1] ;
Rhyme 2:239c3561d21a 81 writeRegs(buf, 3) ;
shockey 0:e6e6107c659e 82 }
shockey 0:e6e6107c659e 83
shockey 0:e6e6107c659e 84 //
shockey 0:e6e6107c659e 85 // numdata is supposed to be 2
shockey 0:e6e6107c659e 86 //
shockey 0:e6e6107c659e 87
shockey 0:e6e6107c659e 88 void VEML6040::cmdRead(uint8_t cmd, uint8_t *data, uint8_t numdata)
shockey 0:e6e6107c659e 89 {
shockey 0:e6e6107c659e 90 uint8_t buf[1] ;
shockey 0:e6e6107c659e 91 buf[0] = cmd ;
shockey 0:e6e6107c659e 92 m_i2c.write(m_addr, buf, 1, true) ; // writing command
shockey 0:e6e6107c659e 93 m_i2c.read(m_addr, (char*)data, numdata) ;
shockey 0:e6e6107c659e 94 }
shockey 0:e6e6107c659e 95 #endif
shockey 0:e6e6107c659e 96
shockey 0:e6e6107c659e 97 void VEML6040::getCOLORConf(uint8_t *colorconf)
shockey 0:e6e6107c659e 98 {
shockey 0:e6e6107c659e 99 uint8_t data[2] ;
shockey 0:e6e6107c659e 100 readRegs(REG_COLOR_CONF, data, 2) ;
Rhyme 2:239c3561d21a 101 *colorconf = data[0] ;
shockey 0:e6e6107c659e 102 }
shockey 0:e6e6107c659e 103
shockey 0:e6e6107c659e 104 void VEML6040::setCOLORConf(uint8_t colorconf)
shockey 0:e6e6107c659e 105 {
shockey 0:e6e6107c659e 106 uint8_t data[3] ;
shockey 0:e6e6107c659e 107 data[0] = REG_COLOR_CONF ;
shockey 0:e6e6107c659e 108 data[1] = colorconf ;
shockey 0:e6e6107c659e 109 data[2] = 0 ;
shockey 0:e6e6107c659e 110 writeRegs(data, 3) ;
shockey 0:e6e6107c659e 111 }
shockey 0:e6e6107c659e 112
Rhyme 5:a4dcc19d057e 113 int VEML6040::getIT(void)
Rhyme 5:a4dcc19d057e 114 {
Rhyme 5:a4dcc19d057e 115 uint8_t colorconf ;
Rhyme 5:a4dcc19d057e 116 int IntegrationTime ;
Rhyme 5:a4dcc19d057e 117 getCOLORConf(&colorconf) ;
Rhyme 5:a4dcc19d057e 118 IntegrationTime = (colorconf >> 4) & 0x07 ;
Rhyme 5:a4dcc19d057e 119 return( IntegrationTime ) ;
Rhyme 5:a4dcc19d057e 120 }
Rhyme 5:a4dcc19d057e 121
Rhyme 5:a4dcc19d057e 122 /*
Rhyme 5:a4dcc19d057e 123 #define IT_40MS 0x00
Rhyme 5:a4dcc19d057e 124 #define IT_80MS 0x10
Rhyme 5:a4dcc19d057e 125 #define IT_160MS 0x20
Rhyme 5:a4dcc19d057e 126 #define IT_320MS 0x30
Rhyme 5:a4dcc19d057e 127 #define IT_640MS 0x40
Rhyme 5:a4dcc19d057e 128 #define IT_1280MS 0x50
Rhyme 5:a4dcc19d057e 129 */
Rhyme 5:a4dcc19d057e 130 void VEML6040::setIT(uint8_t it_value)
Rhyme 5:a4dcc19d057e 131 {
Rhyme 5:a4dcc19d057e 132 uint8_t colorconf ;
Rhyme 5:a4dcc19d057e 133 getCOLORConf(&colorconf) ;
Rhyme 5:a4dcc19d057e 134 colorconf = it_value | (colorconf & 0x0F) ;
Rhyme 5:a4dcc19d057e 135 setCOLORConf(colorconf) ;
Rhyme 5:a4dcc19d057e 136 }
shockey 0:e6e6107c659e 137
Rhyme 4:f5b142e3fe79 138 int VEML6040::getRData(uint16_t *rdata)
shockey 0:e6e6107c659e 139 {
shockey 0:e6e6107c659e 140 uint8_t data[2] ;
Rhyme 4:f5b142e3fe79 141 int result ;
Rhyme 4:f5b142e3fe79 142 result = readRegs(REG_R_Data, data, 2) ;
shockey 0:e6e6107c659e 143 *rdata = (data[1]<<8) | data[0] ;
Rhyme 4:f5b142e3fe79 144 return( result ) ;
shockey 0:e6e6107c659e 145 }
shockey 0:e6e6107c659e 146
Rhyme 4:f5b142e3fe79 147 int VEML6040::getGData(uint16_t *gdata)
shockey 0:e6e6107c659e 148 {
shockey 0:e6e6107c659e 149 uint8_t data[2] ;
Rhyme 4:f5b142e3fe79 150 int result ;
Rhyme 4:f5b142e3fe79 151 result = readRegs(REG_G_Data, data, 2) ;
shockey 0:e6e6107c659e 152 *gdata = (data[1]<<8) | data[0] ;
Rhyme 4:f5b142e3fe79 153 return( result ) ;
shockey 0:e6e6107c659e 154 }
shockey 0:e6e6107c659e 155
Rhyme 4:f5b142e3fe79 156 int VEML6040::getBData(uint16_t *bdata)
shockey 0:e6e6107c659e 157 {
shockey 0:e6e6107c659e 158 uint8_t data[2] ;
Rhyme 4:f5b142e3fe79 159 int result ;
Rhyme 4:f5b142e3fe79 160 result = readRegs(REG_B_Data, data, 2) ;
shockey 0:e6e6107c659e 161 *bdata = (data[1]<<8) | data[0] ;
Rhyme 4:f5b142e3fe79 162 return( result ) ;
shockey 0:e6e6107c659e 163 }
shockey 0:e6e6107c659e 164
Rhyme 4:f5b142e3fe79 165 int VEML6040::getWData(uint16_t *wdata)
shockey 0:e6e6107c659e 166 {
shockey 0:e6e6107c659e 167 uint8_t data[2] ;
Rhyme 4:f5b142e3fe79 168 int result ;
Rhyme 4:f5b142e3fe79 169 result = readRegs(REG_W_Data, data, 2) ;
shockey 0:e6e6107c659e 170 *wdata = (data[1]<<8) | data[0] ;
Rhyme 4:f5b142e3fe79 171 return( result ) ;
shockey 0:e6e6107c659e 172 }
shockey 0:e6e6107c659e 173
shockey 0:e6e6107c659e 174 // usage
shockey 0:e6e6107c659e 175 // fvalue = veml->getUVA() ;
shockey 0:e6e6107c659e 176 // printf("%f", fvalue) ;
shockey 0:e6e6107c659e 177 float VEML6040::getR(void)
shockey 0:e6e6107c659e 178 {
shockey 0:e6e6107c659e 179 uint16_t data ;
shockey 0:e6e6107c659e 180 float value ;
shockey 0:e6e6107c659e 181 getRData(&data) ;
shockey 0:e6e6107c659e 182 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 183 return( value ) ;
shockey 0:e6e6107c659e 184 }
shockey 0:e6e6107c659e 185
shockey 0:e6e6107c659e 186 float VEML6040::getG(void)
shockey 0:e6e6107c659e 187 {
shockey 0:e6e6107c659e 188 uint16_t data ;
shockey 0:e6e6107c659e 189 float value ;
shockey 0:e6e6107c659e 190 getGData(&data) ;
shockey 0:e6e6107c659e 191 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 192 return( value ) ;
shockey 0:e6e6107c659e 193 }
shockey 0:e6e6107c659e 194
shockey 0:e6e6107c659e 195 float VEML6040::getB(void)
shockey 0:e6e6107c659e 196 {
shockey 0:e6e6107c659e 197 uint16_t data ;
shockey 0:e6e6107c659e 198 float value ;
shockey 0:e6e6107c659e 199 getBData(&data) ;
shockey 0:e6e6107c659e 200 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 201 return( value ) ;
shockey 0:e6e6107c659e 202 }
shockey 0:e6e6107c659e 203
shockey 0:e6e6107c659e 204 float VEML6040::getW(void)
shockey 0:e6e6107c659e 205 {
shockey 0:e6e6107c659e 206 uint16_t data ;
shockey 0:e6e6107c659e 207 float value ;
shockey 0:e6e6107c659e 208 getWData(&data) ;
shockey 0:e6e6107c659e 209 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 210 return( value ) ;
shockey 0:e6e6107c659e 211 }
shockey 0:e6e6107c659e 212
shockey 1:5540b216acfc 213 float VEML6040::getX(void)
shockey 1:5540b216acfc 214 {
shockey 1:5540b216acfc 215 uint16_t R ;
shockey 1:5540b216acfc 216 uint16_t G ;
shockey 1:5540b216acfc 217 uint16_t B ;
shockey 1:5540b216acfc 218 float value ;
shockey 1:5540b216acfc 219 getRData(&R) ;
shockey 1:5540b216acfc 220 getGData(&G) ;
shockey 1:5540b216acfc 221 getBData(&B) ;
shockey 1:5540b216acfc 222 value = (float)CORR_COEFF_M0 * (float)R + (float)CORR_COEFF_M1 * (float)G + (float)CORR_COEFF_M2 * (float)B ;
shockey 1:5540b216acfc 223 return( value ) ;
shockey 1:5540b216acfc 224 }
shockey 1:5540b216acfc 225
shockey 1:5540b216acfc 226 float VEML6040::getY(void)
shockey 1:5540b216acfc 227 {
shockey 1:5540b216acfc 228 uint16_t R ;
shockey 1:5540b216acfc 229 uint16_t G ;
shockey 1:5540b216acfc 230 uint16_t B ;
shockey 1:5540b216acfc 231 float value ;
shockey 1:5540b216acfc 232 getRData(&R) ;
shockey 1:5540b216acfc 233 getGData(&G) ;
shockey 1:5540b216acfc 234 getBData(&B) ;
shockey 1:5540b216acfc 235 value = (float)CORR_COEFF_M3 * (float)R + (float)CORR_COEFF_M4 * (float)G + (float)CORR_COEFF_M5 * (float)B ;
shockey 1:5540b216acfc 236 return( value ) ;
shockey 1:5540b216acfc 237 }
shockey 1:5540b216acfc 238
shockey 1:5540b216acfc 239 float VEML6040::getZ(void)
shockey 1:5540b216acfc 240 {
shockey 1:5540b216acfc 241 uint16_t R ;
shockey 1:5540b216acfc 242 uint16_t G ;
shockey 1:5540b216acfc 243 uint16_t B ;
shockey 1:5540b216acfc 244 float value ;
shockey 1:5540b216acfc 245 getRData(&R) ;
shockey 1:5540b216acfc 246 getGData(&G) ;
shockey 1:5540b216acfc 247 getBData(&B) ;
shockey 1:5540b216acfc 248 value = (float)CORR_COEFF_M6 * (float)R + (float)CORR_COEFF_M7 * (float)G + (float)CORR_COEFF_M8 * (float)B ;
shockey 1:5540b216acfc 249 return( value ) ;
shockey 1:5540b216acfc 250 }
shockey 1:5540b216acfc 251
shockey 1:5540b216acfc 252 float VEML6040::getCCTiData(void)
shockey 1:5540b216acfc 253 {
shockey 1:5540b216acfc 254 uint16_t rdata ;
shockey 1:5540b216acfc 255 uint16_t gdata ;
shockey 1:5540b216acfc 256 uint16_t bdata ;
shockey 1:5540b216acfc 257 float value ;
shockey 1:5540b216acfc 258 getRData(&rdata) ;
shockey 1:5540b216acfc 259 getGData(&gdata) ;
shockey 1:5540b216acfc 260 getBData(&bdata) ;
shockey 1:5540b216acfc 261 value = ((float)rdata - (float)bdata) / (float)gdata + (float)OFFSET_OPEN_AIR ;
shockey 1:5540b216acfc 262 return( value ) ;
shockey 1:5540b216acfc 263 }
shockey 1:5540b216acfc 264
shockey 1:5540b216acfc 265 float VEML6040::getCCTData(void)
shockey 1:5540b216acfc 266 {
shockey 1:5540b216acfc 267 // uint16_t cctidata ;
shockey 1:5540b216acfc 268 float cctidata ;
shockey 1:5540b216acfc 269 float value ;
shockey 1:5540b216acfc 270 cctidata = getCCTiData() ;
shockey 1:5540b216acfc 271 // getCCTiData(&cctidata) ;
shockey 1:5540b216acfc 272 value = (float)CCT_CONST * powf( cctidata, -1.2455 ) ;
shockey 1:5540b216acfc 273 return( value ) ;
shockey 1:5540b216acfc 274 }
shockey 1:5540b216acfc 275
shockey 1:5540b216acfc 276 float VEML6040::getCIEX(void)
shockey 1:5540b216acfc 277 {
shockey 1:5540b216acfc 278 float X ;
shockey 1:5540b216acfc 279 float Y ;
shockey 1:5540b216acfc 280 float Z ;
shockey 1:5540b216acfc 281 float value ;
shockey 1:5540b216acfc 282 X = getX() ;
shockey 1:5540b216acfc 283 Y = getY() ;
shockey 1:5540b216acfc 284 Z = getZ() ;
shockey 1:5540b216acfc 285 value = (float)X / ((float)X + (float)Y + (float)Z) ;
shockey 1:5540b216acfc 286 return( value ) ;
shockey 1:5540b216acfc 287 }
shockey 1:5540b216acfc 288
shockey 1:5540b216acfc 289 float VEML6040::getCIEY(void)
shockey 1:5540b216acfc 290 {
shockey 1:5540b216acfc 291 float X ;
shockey 1:5540b216acfc 292 float Y ;
shockey 1:5540b216acfc 293 float Z ;
shockey 1:5540b216acfc 294 float value ;
shockey 1:5540b216acfc 295 X = getX() ;
shockey 1:5540b216acfc 296 Y = getY() ;
shockey 1:5540b216acfc 297 Z = getZ() ;
shockey 1:5540b216acfc 298 value = (float)Y / ((float)X + (float)Y + (float)Z) ;
shockey 1:5540b216acfc 299 return( value ) ;
shockey 1:5540b216acfc 300 }
shockey 1:5540b216acfc 301
Rhyme 4:f5b142e3fe79 302 int VEML6040::readRegs(int addr, uint8_t * data, int len) {
shockey 0:e6e6107c659e 303 char t[1] = {addr};
Rhyme 4:f5b142e3fe79 304 int result ;
Rhyme 4:f5b142e3fe79 305 result = m_i2c.write(m_addr, t, 1, true);
Rhyme 4:f5b142e3fe79 306 if (result == 0) { // wirte success
Rhyme 4:f5b142e3fe79 307 result = m_i2c.read(m_addr, (char *)data, len);
Rhyme 4:f5b142e3fe79 308 }
Rhyme 4:f5b142e3fe79 309 return(result) ;
shockey 0:e6e6107c659e 310 }
shockey 0:e6e6107c659e 311
Rhyme 4:f5b142e3fe79 312 int VEML6040::writeRegs(uint8_t * data, int len) {
Rhyme 4:f5b142e3fe79 313 int result ;
Rhyme 4:f5b142e3fe79 314 result = m_i2c.write(m_addr, (char *)data, len);
Rhyme 4:f5b142e3fe79 315 return(result) ;
shockey 0:e6e6107c659e 316 }