Orefatoi
/
afero_poc15_171201
POC1.5 prototype 2 x color sensor 2 x LM75B 3 x AnalogIn 1 x accel
Embed:
(wiki syntax)
Show/hide line numbers
VEML6040.cpp
00001 /* 00002 * File description here 00003 */ 00004 #include "VEML6040.h" 00005 00006 /* VEML6075 SLAVE ADDRESS AND FUNCTION DESCRIPTION */ 00007 #define REG_COLOR_CONF 0x00 00008 #define REG_Reserved1 0x01 00009 #define REG_Reserved2 0x02 00010 #define REG_Reserved3 0x03 00011 #define REG_Reserved4 0x04 00012 #define REG_Reserved5 0x05 00013 #define REG_Reserved6 0x06 00014 #define REG_Reserved7 0x07 00015 #define REG_R_Data 0x08 00016 #define REG_G_Data 0x09 00017 #define REG_B_Data 0x0A 00018 #define REG_W_Data 0x0B 00019 00020 // Following magic numbers are from 00021 // VISHAY VEML6040 Application Note 84331 00022 // Page 4 00023 #define LUX_RESOLUTION_0 (0.25168) 00024 #define LUX_RESOLUTION_1 (0.12584) 00025 #define LUX_RESOLUTION_2 (0.06292) 00026 #define LUX_RESOLUTION_3 (0.03146) 00027 #define LUX_RESOLUTION_4 (0.01573) 00028 #define LUX_RESOLUTION_5 (0.007865) 00029 00030 // Following magic numbers are from 00031 // VISHAY VEML6040 Application Note 84331 00032 // Page 9 00033 #define CORR_COEFF_M0 (0.048403) 00034 #define CORR_COEFF_M1 (0.183633) 00035 #define CORR_COEFF_M2 (-0.253589) 00036 #define CORR_COEFF_M3 (0.022916) 00037 #define CORR_COEFF_M4 (0.176388) 00038 #define CORR_COEFF_M5 (-0.183205) 00039 #define CORR_COEFF_M6 (-0.077436) 00040 #define CORR_COEFF_M7 (0.124541) 00041 #define CORR_COEFF_M8 (0.032081) 00042 00043 // Following magic numbers are from 00044 // VISHAY VEML6040 Application Note 84331 00045 // Page 10 00046 #define CCT_CONST (4278.6) 00047 #define OFFSET_OPEN_AIR (0.5) 00048 00049 VEML6040::VEML6040(I2C *i2c, int addr) : m_addr(addr<<1) { 00050 p_i2c = i2c ; 00051 p_i2c->frequency(100000); /* 100kHz */ 00052 // activate the peripheral 00053 } 00054 00055 VEML6040::~VEML6040() { } 00056 00057 #if 0 00058 // 00059 // numdata is supposed to be 2 00060 // 00061 void VEML6040::cmdWrite(uint8_t cmd, uint8_t *data, uint8_t numdata) 00062 { 00063 uint8_t buf[3] ; 00064 00065 buf[0] = cmd ; 00066 buf[1] = data[0] ; 00067 buf[2] = data[1] ; 00068 writeRegs(buf, 3) ; 00069 } 00070 00071 // 00072 // numdata is supposed to be 2 00073 // 00074 00075 void VEML6040::cmdRead(uint8_t cmd, uint8_t *data, uint8_t numdata) 00076 { 00077 uint8_t buf[1] ; 00078 buf[0] = cmd ; 00079 p_i2c->write(m_addr, buf, 1, true) ; // writing command 00080 p_i2c->read(m_addr, (char*)data, numdata) ; 00081 } 00082 #endif 00083 00084 void VEML6040::getCOLORConf(uint8_t *colorconf) 00085 { 00086 uint8_t data[2] ; 00087 readRegs(REG_COLOR_CONF, data, 2) ; 00088 *colorconf = data[0] ; 00089 } 00090 00091 void VEML6040::setCOLORConf(uint8_t colorconf) 00092 { 00093 uint8_t data[3] ; 00094 data[0] = REG_COLOR_CONF ; 00095 data[1] = colorconf ; 00096 data[2] = 0 ; 00097 writeRegs(data, 3) ; 00098 } 00099 00100 00101 int VEML6040::getRData(uint16_t *rdata) 00102 { 00103 uint8_t data[2] ; 00104 int result ; 00105 result = readRegs(REG_R_Data, data, 2) ; 00106 *rdata = (data[1]<<8) | data[0] ; 00107 return( result ) ; 00108 } 00109 00110 int VEML6040::getGData(uint16_t *gdata) 00111 { 00112 uint8_t data[2] ; 00113 int result ; 00114 result = readRegs(REG_G_Data, data, 2) ; 00115 *gdata = (data[1]<<8) | data[0] ; 00116 return( result ) ; 00117 } 00118 00119 int VEML6040::getBData(uint16_t *bdata) 00120 { 00121 uint8_t data[2] ; 00122 int result ; 00123 result = readRegs(REG_B_Data, data, 2) ; 00124 *bdata = (data[1]<<8) | data[0] ; 00125 return( result ) ; 00126 } 00127 00128 int VEML6040::getWData(uint16_t *wdata) 00129 { 00130 uint8_t data[2] ; 00131 int result ; 00132 result = readRegs(REG_W_Data, data, 2) ; 00133 *wdata = (data[1]<<8) | data[0] ; 00134 return( result ) ; 00135 } 00136 00137 // usage 00138 // fvalue = veml->getUVA() ; 00139 // printf("%f", fvalue) ; 00140 float VEML6040::getR(void) 00141 { 00142 uint16_t data ; 00143 float value ; 00144 getRData(&data) ; 00145 value = (float)LUX_RESOLUTION_0 * (float)data ; 00146 return( value ) ; 00147 } 00148 00149 float VEML6040::getG(void) 00150 { 00151 uint16_t data ; 00152 float value ; 00153 getGData(&data) ; 00154 value = (float)LUX_RESOLUTION_0 * (float)data ; 00155 return( value ) ; 00156 } 00157 00158 float VEML6040::getB(void) 00159 { 00160 uint16_t data ; 00161 float value ; 00162 getBData(&data) ; 00163 value = (float)LUX_RESOLUTION_0 * (float)data ; 00164 return( value ) ; 00165 } 00166 00167 float VEML6040::getW(void) 00168 { 00169 uint16_t data ; 00170 float value ; 00171 getWData(&data) ; 00172 value = (float)LUX_RESOLUTION_0 * (float)data ; 00173 return( value ) ; 00174 } 00175 00176 float VEML6040::getX(void) 00177 { 00178 uint16_t R ; 00179 uint16_t G ; 00180 uint16_t B ; 00181 float value ; 00182 getRData(&R) ; 00183 getGData(&G) ; 00184 getBData(&B) ; 00185 value = (float)CORR_COEFF_M0 * (float)R + (float)CORR_COEFF_M1 * (float)G + (float)CORR_COEFF_M2 * (float)B ; 00186 return( value ) ; 00187 } 00188 00189 float VEML6040::getY(void) 00190 { 00191 uint16_t R ; 00192 uint16_t G ; 00193 uint16_t B ; 00194 float value ; 00195 getRData(&R) ; 00196 getGData(&G) ; 00197 getBData(&B) ; 00198 value = (float)CORR_COEFF_M3 * (float)R + (float)CORR_COEFF_M4 * (float)G + (float)CORR_COEFF_M5 * (float)B ; 00199 return( value ) ; 00200 } 00201 00202 float VEML6040::getZ(void) 00203 { 00204 uint16_t R ; 00205 uint16_t G ; 00206 uint16_t B ; 00207 float value ; 00208 getRData(&R) ; 00209 getGData(&G) ; 00210 getBData(&B) ; 00211 value = (float)CORR_COEFF_M6 * (float)R + (float)CORR_COEFF_M7 * (float)G + (float)CORR_COEFF_M8 * (float)B ; 00212 return( value ) ; 00213 } 00214 00215 float VEML6040::getCCTiData(void) 00216 { 00217 uint16_t rdata ; 00218 uint16_t gdata ; 00219 uint16_t bdata ; 00220 float value ; 00221 getRData(&rdata) ; 00222 getGData(&gdata) ; 00223 getBData(&bdata) ; 00224 value = ((float)rdata - (float)bdata) / (float)gdata + (float)OFFSET_OPEN_AIR ; 00225 return( value ) ; 00226 } 00227 00228 float VEML6040::getCCTData(void) 00229 { 00230 // uint16_t cctidata ; 00231 float cctidata ; 00232 float value ; 00233 cctidata = getCCTiData() ; 00234 // getCCTiData(&cctidata) ; 00235 value = (float)CCT_CONST * powf( cctidata, -1.2455 ) ; 00236 return( value ) ; 00237 } 00238 00239 float VEML6040::getCIEX(void) 00240 { 00241 float X ; 00242 float Y ; 00243 float Z ; 00244 float value ; 00245 X = getX() ; 00246 Y = getY() ; 00247 Z = getZ() ; 00248 value = (float)X / ((float)X + (float)Y + (float)Z) ; 00249 return( value ) ; 00250 } 00251 00252 float VEML6040::getCIEY(void) 00253 { 00254 float X ; 00255 float Y ; 00256 float Z ; 00257 float value ; 00258 X = getX() ; 00259 Y = getY() ; 00260 Z = getZ() ; 00261 value = (float)Y / ((float)X + (float)Y + (float)Z) ; 00262 return( value ) ; 00263 } 00264 00265 int VEML6040::readRegs(int addr, uint8_t * data, int len) { 00266 char t[1] = {addr}; 00267 int result ; 00268 result = p_i2c->write(m_addr, t, 1, true); 00269 if (result == 0) { // wirte success 00270 result = p_i2c->read(m_addr, (char *)data, len); 00271 } 00272 return(result) ; 00273 } 00274 00275 int VEML6040::writeRegs(uint8_t * data, int len) { 00276 int result ; 00277 result = p_i2c->write(m_addr, (char *)data, len); 00278 return(result) ; 00279 }
Generated on Tue Jul 12 2022 21:13:41 by 1.7.2