POC1.5 prototype 2 x color sensor 2 x LM75B 3 x AnalogIn 1 x accel

Dependencies:   mbed vt100

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers VEML6040.cpp Source File

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 }