Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: UniGraphic mbed vt100
VEML6040.cpp
00001 /* 00002 * File description here 00003 */ 00004 #include "VEML6040.h" 00005 #include "af_mgr.h" 00006 00007 /* VEML6075 SLAVE ADDRESS AND FUNCTION DESCRIPTION */ 00008 #define REG_COLOR_CONF 0x00 00009 #define REG_Reserved1 0x01 00010 #define REG_Reserved2 0x02 00011 #define REG_Reserved3 0x03 00012 #define REG_Reserved4 0x04 00013 #define REG_Reserved5 0x05 00014 #define REG_Reserved6 0x06 00015 #define REG_Reserved7 0x07 00016 #define REG_R_Data 0x08 00017 #define REG_G_Data 0x09 00018 #define REG_B_Data 0x0A 00019 #define REG_W_Data 0x0B 00020 00021 // Following magic numbers are from 00022 // VISHAY VEML6040 Application Note 84331 00023 // Page 4 00024 #define LUX_RESOLUTION_0 (0.25168) 00025 #define LUX_RESOLUTION_1 (0.12584) 00026 #define LUX_RESOLUTION_2 (0.06292) 00027 #define LUX_RESOLUTION_3 (0.03146) 00028 #define LUX_RESOLUTION_4 (0.01573) 00029 #define LUX_RESOLUTION_5 (0.007865) 00030 00031 // Following magic numbers are from 00032 // VISHAY VEML6040 Application Note 84331 00033 // Page 9 00034 #define CORR_COEFF_M0 (0.048403) 00035 #define CORR_COEFF_M1 (0.183633) 00036 #define CORR_COEFF_M2 (-0.253589) 00037 #define CORR_COEFF_M3 (0.022916) 00038 #define CORR_COEFF_M4 (0.176388) 00039 #define CORR_COEFF_M5 (-0.183205) 00040 #define CORR_COEFF_M6 (-0.077436) 00041 #define CORR_COEFF_M7 (0.124541) 00042 #define CORR_COEFF_M8 (0.032081) 00043 00044 // Following magic numbers are from 00045 // VISHAY VEML6040 Application Note 84331 00046 // Page 10 00047 #define CCT_CONST (4278.6) 00048 #define OFFSET_OPEN_AIR (0.5) 00049 00050 VEML6040::VEML6040(I2C *i2c, int addr) : m_addr(addr<<1) { 00051 p_i2c = i2c ; 00052 p_i2c->frequency(100000); /* 100kHz */ 00053 // activate the peripheral 00054 } 00055 00056 VEML6040::~VEML6040() { } 00057 00058 /** 00059 * set COLOR Config 00060 * @param colorconf uint8_t 8bit register value 00061 * @returns 0: success non-0: failure 00062 * @note Command Code 0x00 is used to access CONF register 00063 * @note bit[7] (reserved) 00064 * @note bit[6:4] = IT[2:0] Integration Time Selector 00065 * @note bit[3] (reserved) 00066 * @note bit[2] TRIG Proceed one detcting cycle at manual force mode 00067 * @note bit[1] AF 0: Auto mode 1: manual force mode 00068 * @note bit[0] SD 0: normal 1: chip shutdown setting 00069 * 00070 * @note IT[2:0] 0=40ms, 1=80ms, 2=160ms, 3=320ms, 4=640ms, 5=1280ms 00071 * @note as our WatchDog is set to 1sec, 1280ms is invalid 00072 * @note and 640ms may not be practical 00073 */ 00074 int VEML6040::setCOLORConf(uint8_t colorconf) 00075 { 00076 int result ; 00077 uint8_t data[3] ; 00078 data[0] = REG_COLOR_CONF ; 00079 data[1] = colorconf ; 00080 data[2] = 0 ; 00081 result = writeRegs(data, 3) ; 00082 return( result ) ; 00083 } 00084 00085 /** 00086 * get COLOR Config 00087 * @param *colorconf uint8_t refer to setCOLORConf for the value 00088 * @returns 0: success non-0: failure 00089 */ 00090 int VEML6040::getCOLORConf(uint8_t *colorconf) 00091 { 00092 int result ; 00093 uint8_t data[2] ; 00094 result = readRegs(REG_COLOR_CONF, data, 2) ; 00095 if (result == 0) { 00096 *colorconf = data[0] ; 00097 } 00098 return( result ) ; 00099 } 00100 00101 00102 00103 int VEML6040::getRData(uint16_t *rdata) 00104 { 00105 uint8_t data[2] ; 00106 int result ; 00107 result = readRegs(REG_R_Data, data, 2) ; 00108 *rdata = (data[1]<<8) | data[0] ; 00109 return( result ) ; 00110 } 00111 00112 int VEML6040::getGData(uint16_t *gdata) 00113 { 00114 uint8_t data[2] ; 00115 int result ; 00116 result = readRegs(REG_G_Data, data, 2) ; 00117 *gdata = (data[1]<<8) | data[0] ; 00118 return( result ) ; 00119 } 00120 00121 int VEML6040::getBData(uint16_t *bdata) 00122 { 00123 uint8_t data[2] ; 00124 int result ; 00125 result = readRegs(REG_B_Data, data, 2) ; 00126 *bdata = (data[1]<<8) | data[0] ; 00127 return( result ) ; 00128 } 00129 00130 int VEML6040::getWData(uint16_t *wdata) 00131 { 00132 uint8_t data[2] ; 00133 int result ; 00134 result = readRegs(REG_W_Data, data, 2) ; 00135 *wdata = (data[1]<<8) | data[0] ; 00136 return( result ) ; 00137 } 00138 00139 // usage 00140 // fvalue = veml->getUVA() ; 00141 // printf("%f", fvalue) ; 00142 float VEML6040::getR(void) 00143 { 00144 uint16_t data ; 00145 float value ; 00146 getRData(&data) ; 00147 value = (float)LUX_RESOLUTION_0 * (float)data ; 00148 return( value ) ; 00149 } 00150 00151 float VEML6040::getG(void) 00152 { 00153 uint16_t data ; 00154 float value ; 00155 getGData(&data) ; 00156 value = (float)LUX_RESOLUTION_0 * (float)data ; 00157 return( value ) ; 00158 } 00159 00160 float VEML6040::getB(void) 00161 { 00162 uint16_t data ; 00163 float value ; 00164 getBData(&data) ; 00165 value = (float)LUX_RESOLUTION_0 * (float)data ; 00166 return( value ) ; 00167 } 00168 00169 float VEML6040::getW(void) 00170 { 00171 uint16_t data ; 00172 float value ; 00173 getWData(&data) ; 00174 value = (float)LUX_RESOLUTION_0 * (float)data ; 00175 return( value ) ; 00176 } 00177 00178 float VEML6040::getX(void) 00179 { 00180 uint16_t R ; 00181 uint16_t G ; 00182 uint16_t B ; 00183 float value ; 00184 getRData(&R) ; 00185 getGData(&G) ; 00186 getBData(&B) ; 00187 value = (float)CORR_COEFF_M0 * (float)R + (float)CORR_COEFF_M1 * (float)G + (float)CORR_COEFF_M2 * (float)B ; 00188 return( value ) ; 00189 } 00190 00191 float VEML6040::getY(void) 00192 { 00193 uint16_t R ; 00194 uint16_t G ; 00195 uint16_t B ; 00196 float value ; 00197 getRData(&R) ; 00198 getGData(&G) ; 00199 getBData(&B) ; 00200 value = (float)CORR_COEFF_M3 * (float)R + (float)CORR_COEFF_M4 * (float)G + (float)CORR_COEFF_M5 * (float)B ; 00201 return( value ) ; 00202 } 00203 00204 float VEML6040::getZ(void) 00205 { 00206 uint16_t R ; 00207 uint16_t G ; 00208 uint16_t B ; 00209 float value ; 00210 getRData(&R) ; 00211 getGData(&G) ; 00212 getBData(&B) ; 00213 value = (float)CORR_COEFF_M6 * (float)R + (float)CORR_COEFF_M7 * (float)G + (float)CORR_COEFF_M8 * (float)B ; 00214 return( value ) ; 00215 } 00216 00217 float VEML6040::getCCTiData(void) 00218 { 00219 uint16_t rdata ; 00220 uint16_t gdata ; 00221 uint16_t bdata ; 00222 float value ; 00223 getRData(&rdata) ; 00224 getGData(&gdata) ; 00225 getBData(&bdata) ; 00226 value = ((float)rdata - (float)bdata) / (float)gdata + (float)OFFSET_OPEN_AIR ; 00227 return( value ) ; 00228 } 00229 00230 float VEML6040::getCCTData(void) 00231 { 00232 // uint16_t cctidata ; 00233 float cctidata ; 00234 float value ; 00235 cctidata = getCCTiData() ; 00236 // getCCTiData(&cctidata) ; 00237 value = (float)CCT_CONST * powf( cctidata, -1.2455 ) ; 00238 return( value ) ; 00239 } 00240 00241 float VEML6040::getCIEX(void) 00242 { 00243 float X ; 00244 float Y ; 00245 float Z ; 00246 float value ; 00247 X = getX() ; 00248 Y = getY() ; 00249 Z = getZ() ; 00250 value = (float)X / ((float)X + (float)Y + (float)Z) ; 00251 return( value ) ; 00252 } 00253 00254 float VEML6040::getCIEY(void) 00255 { 00256 float X ; 00257 float Y ; 00258 float Z ; 00259 float value ; 00260 X = getX() ; 00261 Y = getY() ; 00262 Z = getZ() ; 00263 value = (float)Y / ((float)X + (float)Y + (float)Z) ; 00264 return( value ) ; 00265 } 00266 00267 int VEML6040::readRegs(int addr, uint8_t * data, int len) { 00268 char t[1] = {addr}; 00269 int result ; 00270 __disable_irq() ; // Disable Interrupts 00271 result = p_i2c->write(m_addr, t, 1, true); 00272 if (result == 0) { // write success 00273 result = p_i2c->read(m_addr, (char *)data, len, false); 00274 } 00275 __enable_irq() ; // Enable Interrupts 00276 return(result) ; 00277 } 00278 00279 int VEML6040::writeRegs(uint8_t * data, int len) { 00280 int result ; 00281 __disable_irq() ; // Disable Interrupts 00282 result = p_i2c->write(m_addr, (char *)data, len); 00283 __enable_irq() ; // Enable Interrupts 00284 return(result) ; 00285 }
Generated on Fri Jul 15 2022 06:01:06 by
1.7.2