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 Orefatoi

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(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 }