Vishay VEML6040 Color RGB sensor I2C driver library
Dependents: test_VEML6040 testSensor
VEML6040.cpp@4:f5b142e3fe79, 2017-06-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |