Vishay VEML6040 Color RGB sensor I2C driver library

Dependents:   test_VEML6040 testSensor

Committer:
Rhyme
Date:
Fri May 19 02:50:57 2017 +0000
Revision:
2:239c3561d21a
Parent:
1:5540b216acfc
Child:
4:f5b142e3fe79
some typos have been corrected

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
shockey 0:e6e6107c659e 99 void VEML6040::getRData(uint16_t *rdata)
shockey 0:e6e6107c659e 100 {
shockey 0:e6e6107c659e 101 uint8_t data[2] ;
shockey 0:e6e6107c659e 102 readRegs(REG_R_Data, data, 2) ;
shockey 0:e6e6107c659e 103 *rdata = (data[1]<<8) | data[0] ;
shockey 0:e6e6107c659e 104 }
shockey 0:e6e6107c659e 105
shockey 0:e6e6107c659e 106 void VEML6040::getGData(uint16_t *gdata)
shockey 0:e6e6107c659e 107 {
shockey 0:e6e6107c659e 108 uint8_t data[2] ;
shockey 0:e6e6107c659e 109 readRegs(REG_G_Data, data, 2) ;
shockey 0:e6e6107c659e 110 *gdata = (data[1]<<8) | data[0] ;
shockey 0:e6e6107c659e 111 }
shockey 0:e6e6107c659e 112
shockey 0:e6e6107c659e 113 void VEML6040::getBData(uint16_t *bdata)
shockey 0:e6e6107c659e 114 {
shockey 0:e6e6107c659e 115 uint8_t data[2] ;
shockey 0:e6e6107c659e 116 readRegs(REG_B_Data, data, 2) ;
shockey 0:e6e6107c659e 117 *bdata = (data[1]<<8) | data[0] ;
shockey 0:e6e6107c659e 118 }
shockey 0:e6e6107c659e 119
shockey 0:e6e6107c659e 120 void VEML6040::getWData(uint16_t *wdata)
shockey 0:e6e6107c659e 121 {
shockey 0:e6e6107c659e 122 uint8_t data[2] ;
shockey 0:e6e6107c659e 123 readRegs(REG_W_Data, data, 2) ;
shockey 0:e6e6107c659e 124 *wdata = (data[1]<<8) | data[0] ;
shockey 0:e6e6107c659e 125 }
shockey 0:e6e6107c659e 126
shockey 0:e6e6107c659e 127 // usage
shockey 0:e6e6107c659e 128 // fvalue = veml->getUVA() ;
shockey 0:e6e6107c659e 129 // printf("%f", fvalue) ;
shockey 0:e6e6107c659e 130 float VEML6040::getR(void)
shockey 0:e6e6107c659e 131 {
shockey 0:e6e6107c659e 132 uint16_t data ;
shockey 0:e6e6107c659e 133 float value ;
shockey 0:e6e6107c659e 134 getRData(&data) ;
shockey 0:e6e6107c659e 135 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 136 return( value ) ;
shockey 0:e6e6107c659e 137 }
shockey 0:e6e6107c659e 138
shockey 0:e6e6107c659e 139 float VEML6040::getG(void)
shockey 0:e6e6107c659e 140 {
shockey 0:e6e6107c659e 141 uint16_t data ;
shockey 0:e6e6107c659e 142 float value ;
shockey 0:e6e6107c659e 143 getGData(&data) ;
shockey 0:e6e6107c659e 144 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 145 return( value ) ;
shockey 0:e6e6107c659e 146 }
shockey 0:e6e6107c659e 147
shockey 0:e6e6107c659e 148 float VEML6040::getB(void)
shockey 0:e6e6107c659e 149 {
shockey 0:e6e6107c659e 150 uint16_t data ;
shockey 0:e6e6107c659e 151 float value ;
shockey 0:e6e6107c659e 152 getBData(&data) ;
shockey 0:e6e6107c659e 153 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 154 return( value ) ;
shockey 0:e6e6107c659e 155 }
shockey 0:e6e6107c659e 156
shockey 0:e6e6107c659e 157 float VEML6040::getW(void)
shockey 0:e6e6107c659e 158 {
shockey 0:e6e6107c659e 159 uint16_t data ;
shockey 0:e6e6107c659e 160 float value ;
shockey 0:e6e6107c659e 161 getWData(&data) ;
shockey 0:e6e6107c659e 162 value = (float)LUX_RESOLUTION_0 * (float)data ;
shockey 0:e6e6107c659e 163 return( value ) ;
shockey 0:e6e6107c659e 164 }
shockey 0:e6e6107c659e 165
shockey 1:5540b216acfc 166 float VEML6040::getX(void)
shockey 1:5540b216acfc 167 {
shockey 1:5540b216acfc 168 uint16_t R ;
shockey 1:5540b216acfc 169 uint16_t G ;
shockey 1:5540b216acfc 170 uint16_t B ;
shockey 1:5540b216acfc 171 float value ;
shockey 1:5540b216acfc 172 getRData(&R) ;
shockey 1:5540b216acfc 173 getGData(&G) ;
shockey 1:5540b216acfc 174 getBData(&B) ;
shockey 1:5540b216acfc 175 value = (float)CORR_COEFF_M0 * (float)R + (float)CORR_COEFF_M1 * (float)G + (float)CORR_COEFF_M2 * (float)B ;
shockey 1:5540b216acfc 176 return( value ) ;
shockey 1:5540b216acfc 177 }
shockey 1:5540b216acfc 178
shockey 1:5540b216acfc 179 float VEML6040::getY(void)
shockey 1:5540b216acfc 180 {
shockey 1:5540b216acfc 181 uint16_t R ;
shockey 1:5540b216acfc 182 uint16_t G ;
shockey 1:5540b216acfc 183 uint16_t B ;
shockey 1:5540b216acfc 184 float value ;
shockey 1:5540b216acfc 185 getRData(&R) ;
shockey 1:5540b216acfc 186 getGData(&G) ;
shockey 1:5540b216acfc 187 getBData(&B) ;
shockey 1:5540b216acfc 188 value = (float)CORR_COEFF_M3 * (float)R + (float)CORR_COEFF_M4 * (float)G + (float)CORR_COEFF_M5 * (float)B ;
shockey 1:5540b216acfc 189 return( value ) ;
shockey 1:5540b216acfc 190 }
shockey 1:5540b216acfc 191
shockey 1:5540b216acfc 192 float VEML6040::getZ(void)
shockey 1:5540b216acfc 193 {
shockey 1:5540b216acfc 194 uint16_t R ;
shockey 1:5540b216acfc 195 uint16_t G ;
shockey 1:5540b216acfc 196 uint16_t B ;
shockey 1:5540b216acfc 197 float value ;
shockey 1:5540b216acfc 198 getRData(&R) ;
shockey 1:5540b216acfc 199 getGData(&G) ;
shockey 1:5540b216acfc 200 getBData(&B) ;
shockey 1:5540b216acfc 201 value = (float)CORR_COEFF_M6 * (float)R + (float)CORR_COEFF_M7 * (float)G + (float)CORR_COEFF_M8 * (float)B ;
shockey 1:5540b216acfc 202 return( value ) ;
shockey 1:5540b216acfc 203 }
shockey 1:5540b216acfc 204
shockey 1:5540b216acfc 205 float VEML6040::getCCTiData(void)
shockey 1:5540b216acfc 206 {
shockey 1:5540b216acfc 207 uint16_t rdata ;
shockey 1:5540b216acfc 208 uint16_t gdata ;
shockey 1:5540b216acfc 209 uint16_t bdata ;
shockey 1:5540b216acfc 210 float value ;
shockey 1:5540b216acfc 211 getRData(&rdata) ;
shockey 1:5540b216acfc 212 getGData(&gdata) ;
shockey 1:5540b216acfc 213 getBData(&bdata) ;
shockey 1:5540b216acfc 214 value = ((float)rdata - (float)bdata) / (float)gdata + (float)OFFSET_OPEN_AIR ;
shockey 1:5540b216acfc 215 return( value ) ;
shockey 1:5540b216acfc 216 }
shockey 1:5540b216acfc 217
shockey 1:5540b216acfc 218 float VEML6040::getCCTData(void)
shockey 1:5540b216acfc 219 {
shockey 1:5540b216acfc 220 // uint16_t cctidata ;
shockey 1:5540b216acfc 221 float cctidata ;
shockey 1:5540b216acfc 222 float value ;
shockey 1:5540b216acfc 223 cctidata = getCCTiData() ;
shockey 1:5540b216acfc 224 // getCCTiData(&cctidata) ;
shockey 1:5540b216acfc 225 value = (float)CCT_CONST * powf( cctidata, -1.2455 ) ;
shockey 1:5540b216acfc 226 return( value ) ;
shockey 1:5540b216acfc 227 }
shockey 1:5540b216acfc 228
shockey 1:5540b216acfc 229 float VEML6040::getCIEX(void)
shockey 1:5540b216acfc 230 {
shockey 1:5540b216acfc 231 float X ;
shockey 1:5540b216acfc 232 float Y ;
shockey 1:5540b216acfc 233 float Z ;
shockey 1:5540b216acfc 234 float value ;
shockey 1:5540b216acfc 235 X = getX() ;
shockey 1:5540b216acfc 236 Y = getY() ;
shockey 1:5540b216acfc 237 Z = getZ() ;
shockey 1:5540b216acfc 238 value = (float)X / ((float)X + (float)Y + (float)Z) ;
shockey 1:5540b216acfc 239 return( value ) ;
shockey 1:5540b216acfc 240 }
shockey 1:5540b216acfc 241
shockey 1:5540b216acfc 242 float VEML6040::getCIEY(void)
shockey 1:5540b216acfc 243 {
shockey 1:5540b216acfc 244 float X ;
shockey 1:5540b216acfc 245 float Y ;
shockey 1:5540b216acfc 246 float Z ;
shockey 1:5540b216acfc 247 float value ;
shockey 1:5540b216acfc 248 X = getX() ;
shockey 1:5540b216acfc 249 Y = getY() ;
shockey 1:5540b216acfc 250 Z = getZ() ;
shockey 1:5540b216acfc 251 value = (float)Y / ((float)X + (float)Y + (float)Z) ;
shockey 1:5540b216acfc 252 return( value ) ;
shockey 1:5540b216acfc 253 }
shockey 1:5540b216acfc 254
shockey 0:e6e6107c659e 255 void VEML6040::readRegs(int addr, uint8_t * data, int len) {
shockey 0:e6e6107c659e 256 char t[1] = {addr};
shockey 0:e6e6107c659e 257 m_i2c.write(m_addr, t, 1, true);
shockey 0:e6e6107c659e 258 m_i2c.read(m_addr, (char *)data, len);
shockey 0:e6e6107c659e 259 }
shockey 0:e6e6107c659e 260
shockey 0:e6e6107c659e 261 void VEML6040::writeRegs(uint8_t * data, int len) {
shockey 0:e6e6107c659e 262 m_i2c.write(m_addr, (char *)data, len);
shockey 0:e6e6107c659e 263 }