Vishay UV Sensor I2C library

Committer:
MACRUM
Date:
Sun Nov 10 01:46:31 2019 +0000
Revision:
5:10949e9af82a
Parent:
4:9518befb9fd3
Fixed build error by ARMC6

Who changed what in which revision?

UserRevisionLine numberNew 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) {
MACRUM 5:10949e9af82a 186 char t[1] = {(char)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 }