Vishay UV Sensor I2C library
Dependents: test_VEML6075 quattro_vishay_6075_171018 testSensor
VEML6075.cpp@4:9518befb9fd3, 2017-10-27 (annotated)
- Committer:
- Rhyme
- Date:
- Fri Oct 27 04:56:45 2017 +0000
- Revision:
- 4:9518befb9fd3
- Parent:
- 3:d0d23d5abf34
coefficients updated to reflect the values in the AN
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shockey | 0:14ccc7ed49fa | 1 | /* |
shockey | 0:14ccc7ed49fa | 2 | * File description here |
shockey | 0:14ccc7ed49fa | 3 | */ |
shockey | 0:14ccc7ed49fa | 4 | #include "VEML6075.h" |
shockey | 0:14ccc7ed49fa | 5 | |
shockey | 0:14ccc7ed49fa | 6 | /* VEML6075 SLAVE ADDRESS AND FUNCTION DESCRIPTION */ |
shockey | 0:14ccc7ed49fa | 7 | #define REG_UV_CONF 0x00 |
Rhyme | 1:8bc12629d49b | 8 | #define REG_Reserved01 0x01 |
Rhyme | 1:8bc12629d49b | 9 | #define REG_Reserved02 0x02 |
Rhyme | 1:8bc12629d49b | 10 | #define REG_Reserved03 0x03 |
Rhyme | 1:8bc12629d49b | 11 | #define REG_Reserved04 0x04 |
Rhyme | 1:8bc12629d49b | 12 | #define REG_Reserved05 0x05 |
Rhyme | 1:8bc12629d49b | 13 | #define REG_Reserved06 0x06 |
Rhyme | 2:0f3bb80aba40 | 14 | #define REG_UVA_Data 0x07 |
Rhyme | 3:d0d23d5abf34 | 15 | #define REG_UVD_Data 0x08 |
Rhyme | 2:0f3bb80aba40 | 16 | #define REG_UVB_Data 0x09 |
shockey | 0:14ccc7ed49fa | 17 | #define REG_UVCOMP1_Data 0x0A |
shockey | 0:14ccc7ed49fa | 18 | #define REG_UVCOMP2_Data 0x0B |
shockey | 0:14ccc7ed49fa | 19 | #define REG_ID 0x0C |
shockey | 0:14ccc7ed49fa | 20 | |
shockey | 0:14ccc7ed49fa | 21 | // Following magic numbers are from |
shockey | 0:14ccc7ed49fa | 22 | // VISHAY veml6075 Application Note 84339 |
shockey | 0:14ccc7ed49fa | 23 | // Page 6 |
Rhyme | 4:9518befb9fd3 | 24 | #define UVA_A_COEF (2.22) |
Rhyme | 4:9518befb9fd3 | 25 | #define UVA_B_COEF (1.33) |
Rhyme | 4:9518befb9fd3 | 26 | #define UVB_C_COEF (2.95) |
Rhyme | 4:9518befb9fd3 | 27 | #define UVB_D_COEF (1.74) |
shockey | 0:14ccc7ed49fa | 28 | #define UVA_sensitivity (0.93) |
shockey | 0:14ccc7ed49fa | 29 | #define UVA_CIE_sensitivity (0.093) |
shockey | 0:14ccc7ed49fa | 30 | #define UVB_sensitivity (2.1) |
shockey | 0:14ccc7ed49fa | 31 | #define UVB_CIE_sensitivity (0.21) |
Rhyme | 4:9518befb9fd3 | 32 | // from page 15 |
Rhyme | 4:9518befb9fd3 | 33 | #define UVA_RESPONSIVITY (0.001461) |
Rhyme | 4:9518befb9fd3 | 34 | #define UVB_RESPONSIVITY (0.002591) |
shockey | 0:14ccc7ed49fa | 35 | |
shockey | 0:14ccc7ed49fa | 36 | VEML6075::VEML6075(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { |
shockey | 0:14ccc7ed49fa | 37 | // activate the peripheral |
shockey | 0:14ccc7ed49fa | 38 | } |
shockey | 0:14ccc7ed49fa | 39 | |
shockey | 0:14ccc7ed49fa | 40 | VEML6075::~VEML6075() { } |
shockey | 0:14ccc7ed49fa | 41 | |
shockey | 0:14ccc7ed49fa | 42 | #if 0 |
shockey | 0:14ccc7ed49fa | 43 | // |
shockey | 0:14ccc7ed49fa | 44 | // numdata is supposed to be 2 |
shockey | 0:14ccc7ed49fa | 45 | // |
shockey | 0:14ccc7ed49fa | 46 | void VEML6075::cmdWrite(uint8_t cmd, uint8_t *data, uint8_t numdata) |
shockey | 0:14ccc7ed49fa | 47 | { |
shockey | 0:14ccc7ed49fa | 48 | uint8_t buf[3] ; |
shockey | 0:14ccc7ed49fa | 49 | |
shockey | 0:14ccc7ed49fa | 50 | buf[0] = cmd ; |
shockey | 0:14ccc7ed49fa | 51 | buf[1] = data[0] ; |
shockey | 0:14ccc7ed49fa | 52 | buf[2] = data[1] ; |
Rhyme | 2:0f3bb80aba40 | 53 | writeRegs(buf, 3) ; |
shockey | 0:14ccc7ed49fa | 54 | } |
shockey | 0:14ccc7ed49fa | 55 | |
shockey | 0:14ccc7ed49fa | 56 | // |
shockey | 0:14ccc7ed49fa | 57 | // numdata is supposed to be 2 |
shockey | 0:14ccc7ed49fa | 58 | // |
shockey | 0:14ccc7ed49fa | 59 | |
shockey | 0:14ccc7ed49fa | 60 | void VEML6075::cmdRead(uint8_t cmd, uint8_t *data, uint8_t numdata) |
shockey | 0:14ccc7ed49fa | 61 | { |
shockey | 0:14ccc7ed49fa | 62 | uint8_t buf[1] ; |
shockey | 0:14ccc7ed49fa | 63 | buf[0] = cmd ; |
shockey | 0:14ccc7ed49fa | 64 | m_i2c.write(m_addr, buf, 1, true) ; // writing command |
shockey | 0:14ccc7ed49fa | 65 | m_i2c.read(m_addr, (char*)data, numdata) ; |
shockey | 0:14ccc7ed49fa | 66 | } |
shockey | 0:14ccc7ed49fa | 67 | #endif |
shockey | 0:14ccc7ed49fa | 68 | |
shockey | 0:14ccc7ed49fa | 69 | void VEML6075::getUVConf(uint8_t *uvconf) |
shockey | 0:14ccc7ed49fa | 70 | { |
shockey | 0:14ccc7ed49fa | 71 | uint8_t data[2] ; |
shockey | 0:14ccc7ed49fa | 72 | readRegs(REG_UV_CONF, data, 2) ; |
shockey | 0:14ccc7ed49fa | 73 | *uvconf = data[0] ; |
shockey | 0:14ccc7ed49fa | 74 | } |
shockey | 0:14ccc7ed49fa | 75 | |
shockey | 0:14ccc7ed49fa | 76 | void VEML6075::setUVConf(uint8_t uvconf) |
shockey | 0:14ccc7ed49fa | 77 | { |
shockey | 0:14ccc7ed49fa | 78 | uint8_t data[3] ; |
shockey | 0:14ccc7ed49fa | 79 | data[0] = REG_UV_CONF ; |
shockey | 0:14ccc7ed49fa | 80 | data[1] = uvconf ; |
shockey | 0:14ccc7ed49fa | 81 | data[2] = 0 ; |
shockey | 0:14ccc7ed49fa | 82 | writeRegs(data, 3) ; |
shockey | 0:14ccc7ed49fa | 83 | } |
shockey | 0:14ccc7ed49fa | 84 | |
shockey | 0:14ccc7ed49fa | 85 | |
shockey | 0:14ccc7ed49fa | 86 | void VEML6075::getUVAData(uint16_t *uvadata) |
shockey | 0:14ccc7ed49fa | 87 | { |
shockey | 0:14ccc7ed49fa | 88 | uint8_t data[2] ; |
shockey | 0:14ccc7ed49fa | 89 | readRegs(REG_UVA_Data, data, 2) ; |
shockey | 0:14ccc7ed49fa | 90 | *uvadata = (data[1]<<8) | data[0] ; |
shockey | 0:14ccc7ed49fa | 91 | } |
shockey | 0:14ccc7ed49fa | 92 | |
shockey | 0:14ccc7ed49fa | 93 | void VEML6075::getUVBData(uint16_t *uvbdata) |
shockey | 0:14ccc7ed49fa | 94 | { |
shockey | 0:14ccc7ed49fa | 95 | uint8_t data[2] ; |
shockey | 0:14ccc7ed49fa | 96 | readRegs(REG_UVB_Data, data, 2) ; |
shockey | 0:14ccc7ed49fa | 97 | *uvbdata = (data[1]<<8) | data[0] ; |
shockey | 0:14ccc7ed49fa | 98 | } |
shockey | 0:14ccc7ed49fa | 99 | |
shockey | 0:14ccc7ed49fa | 100 | void VEML6075::getUVDData(uint16_t *uvddata) |
shockey | 0:14ccc7ed49fa | 101 | { |
shockey | 0:14ccc7ed49fa | 102 | uint8_t data[2] ; |
shockey | 0:14ccc7ed49fa | 103 | readRegs(REG_UVD_Data, data, 2) ; |
shockey | 0:14ccc7ed49fa | 104 | *uvddata = (data[1]<<8) | data[0] ; |
shockey | 0:14ccc7ed49fa | 105 | } |
shockey | 0:14ccc7ed49fa | 106 | |
shockey | 0:14ccc7ed49fa | 107 | float VEML6075::UVI(void) |
shockey | 0:14ccc7ed49fa | 108 | { |
shockey | 0:14ccc7ed49fa | 109 | float uvi = 0.0 ; |
shockey | 0:14ccc7ed49fa | 110 | uint16_t uvacomp = 0.0 ; |
shockey | 0:14ccc7ed49fa | 111 | uint16_t uvbcomp = 0.0 ; |
shockey | 0:14ccc7ed49fa | 112 | uint16_t uva, uvb, uvd, uvcomp1, uvcomp2 ; |
shockey | 0:14ccc7ed49fa | 113 | getUVAData(&uva) ; |
shockey | 0:14ccc7ed49fa | 114 | getUVBData(&uvb) ; |
shockey | 0:14ccc7ed49fa | 115 | getUVDData(&uvd) ; |
shockey | 0:14ccc7ed49fa | 116 | getUVCOMP1Data(&uvcomp1) ; |
shockey | 0:14ccc7ed49fa | 117 | getUVCOMP2Data(&uvcomp2) ; |
shockey | 0:14ccc7ed49fa | 118 | uvacomp = (uva - uvd) - UVA_A_COEF * (uvcomp1 - uvd) - UVA_B_COEF * (uvcomp2 - uvd) ; |
shockey | 0:14ccc7ed49fa | 119 | uvbcomp = (uvb - uvd) - UVB_C_COEF * (uvcomp1 - uvd) - UVB_D_COEF * (uvcomp2 - uvd) ; |
shockey | 0:14ccc7ed49fa | 120 | // uvi = (((float)uvbcomp * (float)UVB_RESPONSIVITY) + ((float)uvacomp * (float)UVA_RESPONSIVITY)) / 2.0 * 15 ; // For demo |
shockey | 0:14ccc7ed49fa | 121 | uvi = (((float)uvbcomp * (float)UVB_RESPONSIVITY) + ((float)uvacomp * (float)UVA_RESPONSIVITY)) / 2.0 ; |
shockey | 0:14ccc7ed49fa | 122 | return( uvi ) ; |
shockey | 0:14ccc7ed49fa | 123 | } |
shockey | 0:14ccc7ed49fa | 124 | |
shockey | 0:14ccc7ed49fa | 125 | // usage |
shockey | 0:14ccc7ed49fa | 126 | // fvalue = veml->getUVA() ; |
shockey | 0:14ccc7ed49fa | 127 | // printf("%f", fvalue) ; |
shockey | 0:14ccc7ed49fa | 128 | float VEML6075::getUVA(void) |
shockey | 0:14ccc7ed49fa | 129 | { |
shockey | 0:14ccc7ed49fa | 130 | uint16_t data ; |
shockey | 0:14ccc7ed49fa | 131 | float value ; |
shockey | 0:14ccc7ed49fa | 132 | getUVAData(&data) ; |
shockey | 0:14ccc7ed49fa | 133 | value = (float)data / (float)UVA_sensitivity ; |
shockey | 0:14ccc7ed49fa | 134 | return( value ) ; |
shockey | 0:14ccc7ed49fa | 135 | } |
shockey | 0:14ccc7ed49fa | 136 | |
shockey | 0:14ccc7ed49fa | 137 | float VEML6075::getUVA_CIE(void) |
shockey | 0:14ccc7ed49fa | 138 | { |
shockey | 0:14ccc7ed49fa | 139 | uint16_t data ; |
shockey | 0:14ccc7ed49fa | 140 | float value ; |
shockey | 0:14ccc7ed49fa | 141 | getUVAData(&data) ; |
shockey | 0:14ccc7ed49fa | 142 | value = (float)data / (float)UVA_CIE_sensitivity ; |
shockey | 0:14ccc7ed49fa | 143 | return( value ) ; |
shockey | 0:14ccc7ed49fa | 144 | } |
shockey | 0:14ccc7ed49fa | 145 | |
shockey | 0:14ccc7ed49fa | 146 | float VEML6075::getUVB(void) |
shockey | 0:14ccc7ed49fa | 147 | { |
shockey | 0:14ccc7ed49fa | 148 | uint16_t data ; |
shockey | 0:14ccc7ed49fa | 149 | float value ; |
shockey | 0:14ccc7ed49fa | 150 | getUVBData(&data) ; |
shockey | 0:14ccc7ed49fa | 151 | value = (float)data / (float)UVB_sensitivity ; |
shockey | 0:14ccc7ed49fa | 152 | return( value ) ; |
shockey | 0:14ccc7ed49fa | 153 | } |
shockey | 0:14ccc7ed49fa | 154 | |
shockey | 0:14ccc7ed49fa | 155 | float VEML6075::getUVB_CIE(void) |
shockey | 0:14ccc7ed49fa | 156 | { |
shockey | 0:14ccc7ed49fa | 157 | uint16_t data ; |
shockey | 0:14ccc7ed49fa | 158 | float value ; |
shockey | 0:14ccc7ed49fa | 159 | getUVBData(&data) ; |
shockey | 0:14ccc7ed49fa | 160 | value = (float)data / (float)UVB_CIE_sensitivity ; |
shockey | 0:14ccc7ed49fa | 161 | return( value ) ; |
shockey | 0:14ccc7ed49fa | 162 | } |
shockey | 0:14ccc7ed49fa | 163 | |
shockey | 0:14ccc7ed49fa | 164 | void VEML6075::getUVCOMP1Data(uint16_t *uvcomp1data) |
shockey | 0:14ccc7ed49fa | 165 | { |
shockey | 0:14ccc7ed49fa | 166 | uint8_t data[2] ; |
shockey | 0:14ccc7ed49fa | 167 | readRegs(REG_UVCOMP1_Data, data, 2) ; |
shockey | 0:14ccc7ed49fa | 168 | *uvcomp1data = (data[1]<<8) | data[0] ; |
shockey | 0:14ccc7ed49fa | 169 | } |
shockey | 0:14ccc7ed49fa | 170 | |
shockey | 0:14ccc7ed49fa | 171 | void VEML6075::getUVCOMP2Data(uint16_t *uvcomp2data) |
shockey | 0:14ccc7ed49fa | 172 | { |
shockey | 0:14ccc7ed49fa | 173 | uint8_t data[2] ; |
shockey | 0:14ccc7ed49fa | 174 | readRegs(REG_UVCOMP2_Data, data, 2) ; |
shockey | 0:14ccc7ed49fa | 175 | *uvcomp2data = (data[1]<<8) | data[0] ; |
shockey | 0:14ccc7ed49fa | 176 | } |
shockey | 0:14ccc7ed49fa | 177 | |
shockey | 0:14ccc7ed49fa | 178 | void VEML6075::getID(uint16_t *id) |
shockey | 0:14ccc7ed49fa | 179 | { |
shockey | 0:14ccc7ed49fa | 180 | uint8_t data[2] ; |
shockey | 0:14ccc7ed49fa | 181 | readRegs(REG_ID, data, 2) ; |
shockey | 0:14ccc7ed49fa | 182 | *id = (data[1]<<8) | data[0] ; |
shockey | 0:14ccc7ed49fa | 183 | } |
shockey | 0:14ccc7ed49fa | 184 | |
shockey | 0:14ccc7ed49fa | 185 | void VEML6075::readRegs(int addr, uint8_t * data, int len) { |
shockey | 0:14ccc7ed49fa | 186 | char t[1] = {addr}; |
shockey | 0:14ccc7ed49fa | 187 | m_i2c.write(m_addr, t, 1, true); |
shockey | 0:14ccc7ed49fa | 188 | m_i2c.read(m_addr, (char *)data, len); |
shockey | 0:14ccc7ed49fa | 189 | } |
shockey | 0:14ccc7ed49fa | 190 | |
shockey | 0:14ccc7ed49fa | 191 | void VEML6075::writeRegs(uint8_t * data, int len) { |
shockey | 0:14ccc7ed49fa | 192 | m_i2c.write(m_addr, (char *)data, len); |
shockey | 0:14ccc7ed49fa | 193 | } |