Vishay VEML6040 Color RGB sensor I2C driver library
Dependents: test_VEML6040 testSensor
VEML6040.cpp@0:e6e6107c659e, 2016-02-05 (annotated)
- 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?
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 | 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 | } |