pwm period is now 200us instead of the default 20ms veml6040 config is now AF_BIT | TRIG_BIT
Dependencies: mbed MMA8451Q USBDevice WakeUp vt100
Fork of afero_node_suntory_2017_06_15 by
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(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { 00050 m_i2c.frequency(I2C_FREQ_100KHZ); 00051 // activate the peripheral 00052 } 00053 00054 VEML6040::~VEML6040() { } 00055 00056 #if 0 00057 // 00058 // numdata is supposed to be 2 00059 // 00060 void VEML6040::cmdWrite(uint8_t cmd, uint8_t *data, uint8_t numdata) 00061 { 00062 uint8_t buf[3] ; 00063 00064 buf[0] = cmd ; 00065 buf[1] = data[0] ; 00066 buf[2] = data[1] ; 00067 writeRegs(buf, 3) ; 00068 } 00069 00070 // 00071 // numdata is supposed to be 2 00072 // 00073 00074 void VEML6040::cmdRead(uint8_t cmd, uint8_t *data, uint8_t numdata) 00075 { 00076 uint8_t buf[1] ; 00077 buf[0] = cmd ; 00078 m_i2c.write(m_addr, buf, 1, true) ; // writing command 00079 m_i2c.read(m_addr, (char*)data, numdata) ; 00080 } 00081 #endif 00082 00083 void VEML6040::getCOLORConf(uint8_t *colorconf) 00084 { 00085 uint8_t data[2] ; 00086 readRegs(REG_COLOR_CONF, data, 2) ; 00087 *colorconf = data[0] ; 00088 } 00089 00090 void VEML6040::setCOLORConf(uint8_t colorconf) 00091 { 00092 uint8_t data[3] ; 00093 data[0] = REG_COLOR_CONF ; 00094 data[1] = colorconf ; 00095 data[2] = 0 ; 00096 writeRegs(data, 3) ; 00097 } 00098 00099 00100 int VEML6040::getRData(uint16_t *rdata) 00101 { 00102 uint8_t data[2] ; 00103 int result ; 00104 result = readRegs(REG_R_Data, data, 2) ; 00105 *rdata = (data[1]<<8) | data[0] ; 00106 return( result ) ; 00107 } 00108 00109 int VEML6040::getGData(uint16_t *gdata) 00110 { 00111 uint8_t data[2] ; 00112 int result ; 00113 result = readRegs(REG_G_Data, data, 2) ; 00114 *gdata = (data[1]<<8) | data[0] ; 00115 return( result ) ; 00116 } 00117 00118 int VEML6040::getBData(uint16_t *bdata) 00119 { 00120 uint8_t data[2] ; 00121 int result ; 00122 result = readRegs(REG_B_Data, data, 2) ; 00123 *bdata = (data[1]<<8) | data[0] ; 00124 return( result ) ; 00125 } 00126 00127 int VEML6040::getWData(uint16_t *wdata) 00128 { 00129 uint8_t data[2] ; 00130 int result ; 00131 result = readRegs(REG_W_Data, data, 2) ; 00132 *wdata = (data[1]<<8) | data[0] ; 00133 return( result ) ; 00134 } 00135 00136 // usage 00137 // fvalue = veml->getUVA() ; 00138 // printf("%f", fvalue) ; 00139 float VEML6040::getR(void) 00140 { 00141 uint16_t data ; 00142 float value ; 00143 getRData(&data) ; 00144 value = (float)LUX_RESOLUTION_0 * (float)data ; 00145 return( value ) ; 00146 } 00147 00148 float VEML6040::getG(void) 00149 { 00150 uint16_t data ; 00151 float value ; 00152 getGData(&data) ; 00153 value = (float)LUX_RESOLUTION_0 * (float)data ; 00154 return( value ) ; 00155 } 00156 00157 float VEML6040::getB(void) 00158 { 00159 uint16_t data ; 00160 float value ; 00161 getBData(&data) ; 00162 value = (float)LUX_RESOLUTION_0 * (float)data ; 00163 return( value ) ; 00164 } 00165 00166 float VEML6040::getW(void) 00167 { 00168 uint16_t data ; 00169 float value ; 00170 getWData(&data) ; 00171 value = (float)LUX_RESOLUTION_0 * (float)data ; 00172 return( value ) ; 00173 } 00174 00175 float VEML6040::getX(void) 00176 { 00177 uint16_t R ; 00178 uint16_t G ; 00179 uint16_t B ; 00180 float value ; 00181 getRData(&R) ; 00182 getGData(&G) ; 00183 getBData(&B) ; 00184 value = (float)CORR_COEFF_M0 * (float)R + (float)CORR_COEFF_M1 * (float)G + (float)CORR_COEFF_M2 * (float)B ; 00185 return( value ) ; 00186 } 00187 00188 float VEML6040::getY(void) 00189 { 00190 uint16_t R ; 00191 uint16_t G ; 00192 uint16_t B ; 00193 float value ; 00194 getRData(&R) ; 00195 getGData(&G) ; 00196 getBData(&B) ; 00197 value = (float)CORR_COEFF_M3 * (float)R + (float)CORR_COEFF_M4 * (float)G + (float)CORR_COEFF_M5 * (float)B ; 00198 return( value ) ; 00199 } 00200 00201 float VEML6040::getZ(void) 00202 { 00203 uint16_t R ; 00204 uint16_t G ; 00205 uint16_t B ; 00206 float value ; 00207 getRData(&R) ; 00208 getGData(&G) ; 00209 getBData(&B) ; 00210 value = (float)CORR_COEFF_M6 * (float)R + (float)CORR_COEFF_M7 * (float)G + (float)CORR_COEFF_M8 * (float)B ; 00211 return( value ) ; 00212 } 00213 00214 float VEML6040::getCCTiData(void) 00215 { 00216 uint16_t rdata ; 00217 uint16_t gdata ; 00218 uint16_t bdata ; 00219 float value ; 00220 getRData(&rdata) ; 00221 getGData(&gdata) ; 00222 getBData(&bdata) ; 00223 value = ((float)rdata - (float)bdata) / (float)gdata + (float)OFFSET_OPEN_AIR ; 00224 return( value ) ; 00225 } 00226 00227 float VEML6040::getCCTData(void) 00228 { 00229 // uint16_t cctidata ; 00230 float cctidata ; 00231 float value ; 00232 cctidata = getCCTiData() ; 00233 // getCCTiData(&cctidata) ; 00234 value = (float)CCT_CONST * powf( cctidata, -1.2455 ) ; 00235 return( value ) ; 00236 } 00237 00238 float VEML6040::getCIEX(void) 00239 { 00240 float X ; 00241 float Y ; 00242 float Z ; 00243 float value ; 00244 X = getX() ; 00245 Y = getY() ; 00246 Z = getZ() ; 00247 value = (float)X / ((float)X + (float)Y + (float)Z) ; 00248 return( value ) ; 00249 } 00250 00251 float VEML6040::getCIEY(void) 00252 { 00253 float X ; 00254 float Y ; 00255 float Z ; 00256 float value ; 00257 X = getX() ; 00258 Y = getY() ; 00259 Z = getZ() ; 00260 value = (float)Y / ((float)X + (float)Y + (float)Z) ; 00261 return( value ) ; 00262 } 00263 00264 int VEML6040::readRegs(int addr, uint8_t * data, int len) { 00265 char t[1] = {addr}; 00266 int result ; 00267 result = m_i2c.write(m_addr, t, 1, true); 00268 if (result == 0) { // wirte success 00269 result = m_i2c.read(m_addr, (char *)data, len); 00270 } 00271 return(result) ; 00272 } 00273 00274 int VEML6040::writeRegs(uint8_t * data, int len) { 00275 int result ; 00276 result = m_i2c.write(m_addr, (char *)data, len); 00277 return(result) ; 00278 }
Generated on Thu Jul 14 2022 06:24:36 by 1.7.2