A Vishay library for devices VEML6040 R+G+B+W and VEML6075 UVA+UVB optical sensors. Data is stored in a dedicated data structure.

Dependents:   vmel60xx_hello_world

This device library is for use with the Vishay VEML6040 and VEML6075 optical sensors. Ambient light conditions are gathered and stored in a user accessible data structure veml60xx_struct. The library has enough intelligence to determine which device is connected and performs the appropriate functions.

The VEML6040 detects Red, Green, Blue and White light data, which is easily converted to relative Lux intensities.

The VEML6075 detects UVA and UVB light which is converted to a UV Index value.

Since both devices use the same I2C address, they cannot be on the same I2C bus at the same time.

Tested on a K64F

Committer:
loopsva
Date:
Fri Apr 22 18:23:07 2016 +0000
Revision:
1:f560bd61b3b3
Parent:
0:92cb496cbbe1
Child:
2:c17b84879a2f
Minor documentation updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:92cb496cbbe1 1 #ifndef VEML60XX_H
loopsva 0:92cb496cbbe1 2 #define VEML60XX_H
loopsva 0:92cb496cbbe1 3
loopsva 0:92cb496cbbe1 4 #include "mbed.h"
loopsva 0:92cb496cbbe1 5
loopsva 0:92cb496cbbe1 6 // I2C address
loopsva 0:92cb496cbbe1 7 #define VEML60_WADDR 0x20 //i2c address write mode
loopsva 0:92cb496cbbe1 8 #define VEML60_RADDR 0x21 //i2c address read mode
loopsva 0:92cb496cbbe1 9
loopsva 0:92cb496cbbe1 10
loopsva 1:f560bd61b3b3 11 // VEML6040 and VEML6075 common register set
loopsva 0:92cb496cbbe1 12 #define VEML60xx_CONF_REG 0x00 //rw Config Register
loopsva 0:92cb496cbbe1 13
loopsva 0:92cb496cbbe1 14 // VEML6075-only register set
loopsva 0:92cb496cbbe1 15 #define VEML6075_UVA_DATA_REG 0x07 //ro 16 bit UVA data Register
loopsva 0:92cb496cbbe1 16 #define VEML6075_DUMMY_REG 0x08 //ro 16 bit dummy Register
loopsva 0:92cb496cbbe1 17 #define VEML6075_UVB_DATA_REG 0x09 //ro 16 bit UVB data Register
loopsva 0:92cb496cbbe1 18 #define VEML6075_UV_COMP1_REG 0x0A //ro 16 bit UV compensation Register 1
loopsva 0:92cb496cbbe1 19 #define VEML6075_UV_COMP2_REG 0x0B //ro 16 bit UV compensation Register 2
loopsva 0:92cb496cbbe1 20 #define VEML6075_CHIP_ID_REG 0x0C //ro 16 bit Chip ID Register
loopsva 0:92cb496cbbe1 21
loopsva 0:92cb496cbbe1 22 // VEML6040-only register set
loopsva 0:92cb496cbbe1 23 #define VEML6040_R_DATA_REG 0x08 //ro 16 bit RED data
loopsva 0:92cb496cbbe1 24 #define VEML6040_G_DATA_REG 0x09 //ro 16 bit GREEN data
loopsva 0:92cb496cbbe1 25 #define VEML6040_B_DATA_REG 0x0A //ro 16 bit BLUE data
loopsva 0:92cb496cbbe1 26 #define VEML6040_W_DATA_REG 0x0B //ro 16 bit WHITE data
loopsva 0:92cb496cbbe1 27
loopsva 0:92cb496cbbe1 28 // VEML6040 and VEML6075 common config register bits
loopsva 0:92cb496cbbe1 29 #define VEML60xx_CONF_BITS_IT 0x70 //VEML6075 -> 0x00 = 50mS, 0x10 = 100mS, 0x20 = 200mS, 0x30 = 400mS, 0x40 = 800mS, 0x50-0x70 = reserved
loopsva 0:92cb496cbbe1 30 //VEML6040 -> 0x00 = 40mS, 0x10 = 80mS, 0x20 = 160mS, 0x30 = 320mS, 0x40 = 640mS, 0x50 = 1280mS, 0x60-0x70 = reserved
loopsva 0:92cb496cbbe1 31 #define VEML60xx_CONF_BITS_IT_50m40m 0x00
loopsva 0:92cb496cbbe1 32 #define VEML60xx_CONF_BITS_IT_100m80m 0x10
loopsva 0:92cb496cbbe1 33 #define VEML60xx_CONF_BITS_IT_200m160m 0x20
loopsva 0:92cb496cbbe1 34 #define VEML60xx_CONF_BITS_IT_400m320m 0x30
loopsva 0:92cb496cbbe1 35 #define VEML60xx_CONF_BITS_IT_800m640m 0x40
loopsva 0:92cb496cbbe1 36
loopsva 0:92cb496cbbe1 37 #define VEML60xx_CONF_BITS_TRIG 0x04 //0x00 = idle, 0x04 = trigger (measurement), auto returns to 0x00 note: AF == 1
loopsva 0:92cb496cbbe1 38 #define VEML60xx_CONF_BITS_AF 0x02 //0x00 = auto, 0x02 = force (mode)
loopsva 0:92cb496cbbe1 39 #define VEML60xx_CONF_BITS_SD 0x01 //0x00 = run, 0x01 = shut down
loopsva 0:92cb496cbbe1 40
loopsva 0:92cb496cbbe1 41 // VEML6075-only config register bits
loopsva 0:92cb496cbbe1 42 #define VEML6075_CONF_BITS_HD 0x08 //0x00 = normal, 0x08 = high (dynamic setting)
loopsva 0:92cb496cbbe1 43
loopsva 0:92cb496cbbe1 44 // VEML6040-only config register bits
loopsva 0:92cb496cbbe1 45 #define VEML6040_CONF_BITS_IT_1280m 0x50
loopsva 0:92cb496cbbe1 46
loopsva 0:92cb496cbbe1 47 // VEML6075-only ID contents
loopsva 0:92cb496cbbe1 48 #define VEML6075_DEVICE_ID 0x0026 //expected device ID
loopsva 0:92cb496cbbe1 49
loopsva 0:92cb496cbbe1 50 // VEML6040-only ID contents
loopsva 0:92cb496cbbe1 51 #define VEML6040_DEVICE_ID 0x0123 //expected device ID
loopsva 0:92cb496cbbe1 52
loopsva 0:92cb496cbbe1 53 // VEML6075-only conversion coefficients
loopsva 0:92cb496cbbe1 54 #define VEML6075_UVA_COEF_A 3.33
loopsva 0:92cb496cbbe1 55 #define VEML6075_UVA_COEF_B 2.50
loopsva 0:92cb496cbbe1 56 #define VEML6075_UVB_COEF_C 3.67
loopsva 0:92cb496cbbe1 57 #define VEML6075_UVB_COEF_D 2.75
loopsva 0:92cb496cbbe1 58
loopsva 0:92cb496cbbe1 59 // VEML6040-only conversion coefficients
loopsva 0:92cb496cbbe1 60 #define VEML6040_LUX_STEP_000 0.18
loopsva 0:92cb496cbbe1 61 #define VEML6040_LUX_STEP_001 0.09
loopsva 0:92cb496cbbe1 62 #define VEML6040_LUX_STEP_010 0.045
loopsva 0:92cb496cbbe1 63 #define VEML6040_LUX_STEP_011 0.0225
loopsva 0:92cb496cbbe1 64 #define VEML6040_LUX_STEP_100 0.01125
loopsva 0:92cb496cbbe1 65 #define VEML6040_LUX_STEP_101 0.005625
loopsva 0:92cb496cbbe1 66
loopsva 0:92cb496cbbe1 67 // VEML6075-only conversion coefficients
loopsva 0:92cb496cbbe1 68 #define VEML6075_UVA_RESP 0.0011
loopsva 0:92cb496cbbe1 69 #define VEML6075_UVB_RESP 0.00125
loopsva 0:92cb496cbbe1 70
loopsva 0:92cb496cbbe1 71
loopsva 0:92cb496cbbe1 72 /**
loopsva 0:92cb496cbbe1 73 * Create VEML60 controller class
loopsva 0:92cb496cbbe1 74 *
loopsva 0:92cb496cbbe1 75 * @param VEML class
loopsva 0:92cb496cbbe1 76 *
loopsva 0:92cb496cbbe1 77 */
loopsva 0:92cb496cbbe1 78 class veml60xx {
loopsva 0:92cb496cbbe1 79
loopsva 0:92cb496cbbe1 80 public:
loopsva 0:92cb496cbbe1 81
loopsva 0:92cb496cbbe1 82 /**
loopsva 0:92cb496cbbe1 83 * Public data structure for VEML60xx data values.
loopsva 0:92cb496cbbe1 84 *
loopsva 0:92cb496cbbe1 85 **/
loopsva 0:92cb496cbbe1 86 typedef struct {
loopsva 0:92cb496cbbe1 87 uint16_t conf_reg; /*!< VEML60xx config register mirror */
loopsva 0:92cb496cbbe1 88
loopsva 0:92cb496cbbe1 89 uint16_t uva_d; /*!< VEML6075 UVA data */
loopsva 0:92cb496cbbe1 90 uint16_t dummy_d; /*!< VEML6075 Dummy data */
loopsva 0:92cb496cbbe1 91 uint16_t uvb_d; /*!< VEML6075 UVB data */
loopsva 0:92cb496cbbe1 92 uint16_t uv_c1; /*!< VEML6075 UV comp1 data */
loopsva 0:92cb496cbbe1 93 uint16_t uv_c2; /*!< VEML6075 UV comp2 data */
loopsva 0:92cb496cbbe1 94 uint16_t id; /*!< VEML6075 Device ID*/
loopsva 0:92cb496cbbe1 95 double uva_comp; /*!< VEML6075 UVA compensated data */
loopsva 0:92cb496cbbe1 96 double uvb_comp; /*!< VEML6075 UVB compensated data */
loopsva 0:92cb496cbbe1 97 double uv_index; /*!< VEML6075 UV Index */
loopsva 0:92cb496cbbe1 98
loopsva 0:92cb496cbbe1 99 uint16_t r_d; /*!< VEML6040 RED data */
loopsva 0:92cb496cbbe1 100 uint16_t g_d; /*!< VEML6040 GREEN data */
loopsva 0:92cb496cbbe1 101 uint16_t b_d; /*!< VEML6040 BLUE data */
loopsva 0:92cb496cbbe1 102 uint16_t w_d; /*!< VEML6040 WHITE data */
loopsva 0:92cb496cbbe1 103 double lux_step; /*!< VEML6040 Lux value per step */
loopsva 0:92cb496cbbe1 104
loopsva 0:92cb496cbbe1 105 bool is6075; /*!< connected device is a VEML6075 */
loopsva 0:92cb496cbbe1 106 bool is6040; /*!< connected device is a VEML6040 */
loopsva 0:92cb496cbbe1 107 } veml60xx_struct;
loopsva 0:92cb496cbbe1 108
loopsva 0:92cb496cbbe1 109 /**
loopsva 0:92cb496cbbe1 110 * Create a VME60xx object using the specified I2C object
loopsva 0:92cb496cbbe1 111 *
loopsva 0:92cb496cbbe1 112 * @param sda - mbed I2C interface pin
loopsva 0:92cb496cbbe1 113 *
loopsva 0:92cb496cbbe1 114 * @param scl - mbed I2C interface pin
loopsva 0:92cb496cbbe1 115 *
loopsva 0:92cb496cbbe1 116 * @param set_I2C_frequency
loopsva 0:92cb496cbbe1 117 */
loopsva 0:92cb496cbbe1 118 veml60xx(PinName sda, PinName scl, int i2cFrequency);
loopsva 0:92cb496cbbe1 119
loopsva 0:92cb496cbbe1 120 /**
loopsva 0:92cb496cbbe1 121 * Destructor
loopsva 0:92cb496cbbe1 122 *
loopsva 0:92cb496cbbe1 123 * @param --none--
loopsva 0:92cb496cbbe1 124 */
loopsva 0:92cb496cbbe1 125 ~veml60xx();
loopsva 0:92cb496cbbe1 126
loopsva 0:92cb496cbbe1 127 /**
loopsva 1:f560bd61b3b3 128 * Get VEML60xx ID Register
loopsva 0:92cb496cbbe1 129 *
loopsva 1:f560bd61b3b3 130 * Note: the VEML6040 seems to have an ID register. However, it's not published
loopsva 0:92cb496cbbe1 131 *
loopsva 0:92cb496cbbe1 132 * @param pointer to struct veml60xx_struct
loopsva 0:92cb496cbbe1 133 *
loopsva 0:92cb496cbbe1 134 * @return ID Register value
loopsva 0:92cb496cbbe1 135 */
loopsva 0:92cb496cbbe1 136 uint16_t getID(veml60xx_struct& Pntr);
loopsva 0:92cb496cbbe1 137
loopsva 0:92cb496cbbe1 138 /**
loopsva 1:f560bd61b3b3 139 * Get VEMLxx Config Register
loopsva 0:92cb496cbbe1 140 *
loopsva 0:92cb496cbbe1 141 * @param pointer to struct veml60xx_struct
loopsva 0:92cb496cbbe1 142 *
loopsva 0:92cb496cbbe1 143 * @return Config Register value
loopsva 0:92cb496cbbe1 144 */
loopsva 0:92cb496cbbe1 145 uint16_t getConfig(veml60xx_struct& Pntr);
loopsva 0:92cb496cbbe1 146
loopsva 0:92cb496cbbe1 147 /**
loopsva 1:f560bd61b3b3 148 * Get VEML60xx Raw Data
loopsva 0:92cb496cbbe1 149 *
loopsva 0:92cb496cbbe1 150 * @param pointer to struct veml60xx_struct
loopsva 0:92cb496cbbe1 151 *
loopsva 1:f560bd61b3b3 152 * @return raw data put into struct VEML60xx_struct
loopsva 0:92cb496cbbe1 153 */
loopsva 0:92cb496cbbe1 154 uint16_t getRawData(veml60xx_struct& Pntr);
loopsva 0:92cb496cbbe1 155
loopsva 0:92cb496cbbe1 156 /**
loopsva 1:f560bd61b3b3 157 * Convert the VEML6075 Raw Data
loopsva 0:92cb496cbbe1 158 *
loopsva 0:92cb496cbbe1 159 * @param pointer to struct veml60xx_struct
loopsva 0:92cb496cbbe1 160 *
loopsva 1:f560bd61b3b3 161 * @return converted data put into struct VEML60xx_struct
loopsva 0:92cb496cbbe1 162 */
loopsva 0:92cb496cbbe1 163 void convertRawData(veml60xx_struct& Pntr);
loopsva 0:92cb496cbbe1 164
loopsva 0:92cb496cbbe1 165 /**
loopsva 1:f560bd61b3b3 166 * Initialize the VEML60xx
loopsva 0:92cb496cbbe1 167 *
loopsva 0:92cb496cbbe1 168 * Sets up the command register to proper operating mode
loopsva 0:92cb496cbbe1 169 *
loopsva 0:92cb496cbbe1 170 * @param pointer to struct veml60xx_struct
loopsva 0:92cb496cbbe1 171 *
loopsva 0:92cb496cbbe1 172 * @param val any value to be or'd into the config register
loopsva 0:92cb496cbbe1 173 *
loopsva 0:92cb496cbbe1 174 * @return 0
loopsva 0:92cb496cbbe1 175 */
loopsva 0:92cb496cbbe1 176 void setConfig(veml60xx_struct& Pntr, uint16_t val);
loopsva 0:92cb496cbbe1 177
loopsva 0:92cb496cbbe1 178 /**
loopsva 1:f560bd61b3b3 179 * Trigger a VEML60xx conversion cycle
loopsva 0:92cb496cbbe1 180 *
loopsva 0:92cb496cbbe1 181 * Must be in manual trigger mode (AF == 1)
loopsva 0:92cb496cbbe1 182 *
loopsva 0:92cb496cbbe1 183 * Example: uv.setConfig(struct_ptr, VEML60xx_CONF_BITS_AF);
loopsva 0:92cb496cbbe1 184 *
loopsva 0:92cb496cbbe1 185 * @param pointer to struct veml60xx_struct
loopsva 0:92cb496cbbe1 186 *
loopsva 0:92cb496cbbe1 187 * @return 0 TRIG properly set
loopsva 0:92cb496cbbe1 188 * @return 1 TRIG has been previously set
loopsva 0:92cb496cbbe1 189 * @return 2 AF bit not set (in AUTO mode)
loopsva 0:92cb496cbbe1 190 */
loopsva 0:92cb496cbbe1 191 uint16_t startAccess(veml60xx_struct& Pntr);
loopsva 0:92cb496cbbe1 192
loopsva 0:92cb496cbbe1 193 /**
loopsva 0:92cb496cbbe1 194 * Automatically adjust Lux scaling level
loopsva 0:92cb496cbbe1 195 *
loopsva 0:92cb496cbbe1 196 * Change CONF_BITS_IT by +-1 if count bits saturated or too low
loopsva 0:92cb496cbbe1 197 *
loopsva 0:92cb496cbbe1 198 * @param pointer to struct veml60xx_struct
loopsva 0:92cb496cbbe1 199 *
loopsva 0:92cb496cbbe1 200 * @return true = IT scale value has changed
loopsva 0:92cb496cbbe1 201 * @return false = IT scale value not changed, could be at its limit
loopsva 0:92cb496cbbe1 202 */
loopsva 0:92cb496cbbe1 203 bool autoAdjustLux(veml60xx_struct& Pntr);
loopsva 0:92cb496cbbe1 204
loopsva 0:92cb496cbbe1 205 private:
loopsva 0:92cb496cbbe1 206 char vemlBuffer[4];
loopsva 0:92cb496cbbe1 207
loopsva 0:92cb496cbbe1 208 protected:
loopsva 0:92cb496cbbe1 209 I2C* _i2c_;
loopsva 0:92cb496cbbe1 210
loopsva 0:92cb496cbbe1 211 };
loopsva 0:92cb496cbbe1 212 #endif