22#include "px_veml6075.h"
31#define PX_VEML6075_REG_UV_CFG 0x00
32#define PX_VEML6075_REG_UVA_DATA 0x07
33#define PX_VEML6075_REG_UVB_DATA 0x09
34#define PX_VEML6075_REG_UVCOMP1_DATA 0x0A
35#define PX_VEML6075_REG_UVCOMP2_DATA 0x0B
36#define PX_VEML6075_REG_ID 0x0C
41#define PX_VEML6075_REG_CFG_UV_IT_50MS 0x00
42#define PX_VEML6075_REG_CFG_UV_IT_100MS 0x10
43#define PX_VEML6075_REG_CFG_UV_IT_200MS 0x20
44#define PX_VEML6075_REG_CFG_UV_IT_400MS 0x30
45#define PX_VEML6075_REG_CFG_UV_IT_800MS 0x40
46#define PX_VEML6075_REG_CFG_HD 0x08
47#define PX_VEML6075_REG_CFG_UV_TRIG_NO 0x00
48#define PX_VEML6075_REG_CFG_UV_TRIG_ONCE 0x04
49#define PX_VEML6075_REG_CFG_UV_AF_NORMAL 0x00
50#define PX_VEML6075_REG_CFG_UV_AF_FORCE 0x02
51#define PX_VEML6075_REG_CFG_SD 0x01
55#define PX_VEML6075_REG_ID_VAL 0x26
71static const float px_veml6075_uva_a_coef = 2.22;
72static const float px_veml6075_uva_b_coef = 1.33;
73static const float px_veml6075_uva_c_coef = 2.95;
74static const float px_veml6075_uva_d_coef = 1.74;
75static const float px_veml6075_uva_resp = 0.001461;
76static const float px_veml6075_uvb_resp = 0.002591;
125 px_veml6075_i2c_handle = handle;
128 if(!px_veml6075_reg_rd(PX_VEML6075_REG_ID, ®_data))
134 if(reg_data.
lsb != PX_VEML6075_REG_ID_VAL)
137 PX_LOG_E(
"Chip ID does not match. Received %02X, but expected %02X",
138 reg_data.
lsb, PX_VEML6075_REG_ID_VAL);
143 reg_data.
lsb = PX_VEML6075_REG_CFG_UV_IT_100MS
144 | PX_VEML6075_REG_CFG_UV_TRIG_NO
145 | PX_VEML6075_REG_CFG_UV_AF_NORMAL;
147 if(!px_veml6075_reg_wr(PX_VEML6075_REG_UV_CFG, ®_data))
150 PX_LOG_E(
"Unable to configure sensor");
153 if(!px_veml6075_reg_rd(PX_VEML6075_REG_UV_CFG, ®_data))
170 if(!px_veml6075_reg_rd(PX_VEML6075_REG_UVA_DATA, ®_data))
178 if(!px_veml6075_reg_rd(PX_VEML6075_REG_UVB_DATA, ®_data))
186 if(!px_veml6075_reg_rd(PX_VEML6075_REG_UVCOMP1_DATA, ®_data))
194 if(!px_veml6075_reg_rd(PX_VEML6075_REG_UVCOMP2_DATA, ®_data))
202 PX_LOG_D(
"UVA=0x%04X, UVB=%04X, UVCOMP1=0x%04X, UVCOMP2=0x%04X",
203 data->uva, data->uvb, data->uvcomp1, data->uvcomp2);
212 - (px_veml6075_uva_a_coef * data->uvcomp1)
213 - (px_veml6075_uva_b_coef * data->uvcomp2);
223 - (px_veml6075_uva_c_coef * data->uvcomp1)
224 - (px_veml6075_uva_d_coef * data->uvcomp2);
238 uva = uva * px_veml6075_uva_resp;
239 uvb = uvb * px_veml6075_uvb_resp;
240 uvi = (uva + uvb) / 2.0;
#define PX_U16_CONCAT_U8(hi8, lo8)
Concatenate 2 x 8 bits to form 16-bit value.
#define PX_LOG_D(format,...)
Macro to display a formatted DEBUG message.
#define PX_LOG_NAME(name)
Macro to declare a log name string once for each file to reduce code size.
#define PX_LOG_E(format,...)
Macro to display a formatted ERROR message.
bool px_veml6075_init(px_i2c_handle_t *handle)
Initialise driver.
float px_veml6075_uvi(const px_veml6075_data_t *data)
Calculate UVI from raw sensor data.
float px_veml6075_uva(const px_veml6075_data_t *data)
Calculate UVA from raw sensor data.
float px_veml6075_uvb(const px_veml6075_data_t *data)
Calculate UVB from raw sensor data.
bool px_veml6075_meas(px_veml6075_data_t *data)
Take UVA & UVB measurement.
#define PX_I2C_FLAG_START_AND_STOP
Begin and finish an I2C transaction with a START and STOP condition.
bool px_i2c_rd(px_i2c_handle_t *handle, void *data, size_t nr_of_bytes, uint8_t flags)
Perform an I2C read transaction with an I2C slave.
#define PX_I2C_FLAG_REP_START_AND_STOP
Begin and finish an I2C transaction with a REP START and STOP condition.
#define PX_I2C_FLAG_START_AND_END
Begin and finish an I2C transaction with a START and END condition.
bool px_i2c_wr(px_i2c_handle_t *handle, const void *data, size_t nr_of_bytes, uint8_t flags)
Perform an I2C write transaction with an I2C slave.
Define I2C handle for a slave.
Register data definition.
uint8_t lsb
Least Significant Byte.
uint8_t msb
Most Significant Byte.