ESPHome 2025.9.0-dev
Loading...
Searching...
No Matches
veml7700.h
Go to the documentation of this file.
1#pragma once
8namespace esphome {
9namespace veml7700 {
13//
14// Datasheet: https://www.vishay.com/docs/84286/veml7700.pdf
15//
16
17enum class CommandRegisters : uint8_t {
18 ALS_CONF_0 = 0x00, // W: ALS gain, integration time, interrupt, and shutdown
19 ALS_WH = 0x01, // W: ALS high threshold window setting
20 ALS_WL = 0x02, // W: ALS low threshold window setting
21 PWR_SAVING = 0x03, // W: Set (15 : 3) 0000 0000 0000 0b
22 ALS = 0x04, // R: MSB, LSB data of whole ALS 16 bits
23 WHITE = 0x05, // R: MSB, LSB data of whole WHITE 16 bits
24 ALS_INT = 0x06 // R: ALS INT trigger event
25};
26
27enum Gain : uint16_t {
28 X_1 = 0,
29 X_2 = 1,
30 X_1_8 = 2,
31 X_1_4 = 3,
32};
33const uint8_t GAINS_COUNT = 4;
34
43const uint8_t INTEGRATION_TIMES_COUNT = 6;
44
51
52enum PSMMode : uint16_t {
57};
58
59// The following section with bit-fields brings GCC compilation 'notes' about padding bytes due to bug in older GCC back
60// in 2009 "Packed bit-fields of type char were not properly bit-packed on many targets prior to GCC 4.4" Even more to
61// this - this message can't be disabled with "#pragma GCC diagnostic ignored" due to another bug which was only fixed
62// in GCC 13 in 2022 :) No actions required, it is just a note. The code is correct.
63
64//
65// VEML7700_CR_ALS_CONF_0 Register (0x00)
66//
68 uint16_t raw;
69 uint8_t raw_bytes[2];
70 struct {
71 bool ALS_SD : 1; // ALS shut down setting: 0 = ALS power on, 1 = ALS shut
72 // down
73 bool ALS_INT_EN : 1; // ALS interrupt enable setting: 0 = ALS INT disable, 1
74 // = ALS INT enable
75 bool reserved_2 : 1; // 0
76 bool reserved_3 : 1; // 0
77 Persistence ALS_PERS : 2; // 00 - 1, 01- 2, 10 - 4, 11 - 8
78 IntegrationTime ALS_IT : 4; // ALS integration time setting
79 bool reserved_10 : 1; // 0
80 Gain ALS_GAIN : 2; // Gain selection
81 bool reserved_13 : 1; // 0
82 bool reserved_14 : 1; // 0
83 bool reserved_15 : 1; // 0
84 } __attribute__((packed));
85};
86
87//
88// Power Saving Mode: PSM Register (0x03)
89//
91 uint16_t raw;
92 uint8_t raw_bytes[2];
93 struct {
94 bool PSM_EN : 1;
96 uint16_t reserved : 13;
97 } __attribute__((packed));
98};
99
101 public:
102 //
103 // EspHome framework functions
104 //
105 void setup() override;
106 void dump_config() override;
107 void update() override;
108 void loop() override;
109
110 //
111 // Configuration setters
112 //
113 void set_gain(Gain gain) { this->gain_ = gain; }
115 void set_enable_automatic_mode(bool enable) { this->automatic_mode_enabled_ = enable; }
116 void set_enable_lux_compensation(bool enable) { this->lux_compensation_enabled_ = enable; }
117 void set_glass_attenuation_factor(float factor) { this->glass_attenuation_factor_ = factor; }
118
121 void set_white_sensor(sensor::Sensor *sensor) { this->white_sensor_ = sensor; }
126
127 protected:
128 //
129 // Internal state machine, used to split all the actions into
130 // small steps in loop() to make sure we are not blocking execution
131 //
146
147 //
148 // Current measurements data
149 //
160
161 //
162 // Device interaction
163 //
166 ErrorCode read_sensor_output_(Readings &data);
167
168 //
169 // Working with the data
170 //
171 bool are_adjustments_required_(Readings &data);
172 void apply_lux_calculation_(Readings &data);
173 void apply_lux_compensation_(Readings &data);
174 void apply_glass_attenuation_(Readings &data);
175 void publish_data_part_1_(Readings &data);
176 void publish_data_part_2_(Readings &data);
177 void publish_data_part_3_(Readings &data);
178
179 //
180 // Component configuration
181 //
187
188 //
189 // Sensors for publishing data
190 //
191 sensor::Sensor *ambient_light_sensor_{nullptr}; // Human eye range 500-600 nm, lx
193 sensor::Sensor *white_sensor_{nullptr}; // Wide range 450-950 nm, lx
194 sensor::Sensor *white_counts_sensor_{nullptr}; // Raw counts
195 sensor::Sensor *fake_infrared_sensor_{nullptr}; // Artificial. = WHITE lx - ALS lx.
196 sensor::Sensor *actual_gain_sensor_{nullptr}; // Actual gain multiplier for the measurement
197 sensor::Sensor *actual_integration_time_sensor_{nullptr}; // Actual integration time for the measurement
198};
199
200} // namespace veml7700
201} // namespace esphome
This class simplifies creating components that periodically check a state.
Definition component.h:425
This Class provides the methods to read/write bytes from/to an i2c device.
Definition i2c.h:133
Base-class for all sensors.
Definition sensor.h:59
void publish_data_part_1_(Readings &data)
Definition veml7700.cpp:409
void set_enable_automatic_mode(bool enable)
Definition veml7700.h:115
void set_enable_lux_compensation(bool enable)
Definition veml7700.h:116
void publish_data_part_2_(Readings &data)
Definition veml7700.cpp:418
void publish_data_part_3_(Readings &data)
Definition veml7700.cpp:430
sensor::Sensor * white_counts_sensor_
Definition veml7700.h:194
enum esphome::veml7700::VEML7700Component::State NOT_INITIALIZED
void apply_glass_attenuation_(Readings &data)
Definition veml7700.cpp:401
sensor::Sensor * ambient_light_counts_sensor_
Definition veml7700.h:192
void set_ambient_light_counts_sensor(sensor::Sensor *sensor)
Definition veml7700.h:120
void set_actual_integration_time_sensor(sensor::Sensor *sensor)
Definition veml7700.h:125
bool are_adjustments_required_(Readings &data)
Definition veml7700.cpp:307
void set_actual_gain_sensor(sensor::Sensor *sensor)
Definition veml7700.h:124
ErrorCode reconfigure_time_and_gain_(IntegrationTime time, Gain gain, bool shutdown)
Definition veml7700.cpp:260
sensor::Sensor * actual_integration_time_sensor_
Definition veml7700.h:197
void set_white_counts_sensor(sensor::Sensor *sensor)
Definition veml7700.h:122
void set_white_sensor(sensor::Sensor *sensor)
Definition veml7700.h:121
void set_integration_time(IntegrationTime time)
Definition veml7700.h:114
void apply_lux_calculation_(Readings &data)
Definition veml7700.cpp:354
void set_glass_attenuation_factor(float factor)
Definition veml7700.h:117
struct esphome::veml7700::VEML7700Component::Readings readings_
sensor::Sensor * fake_infrared_sensor_
Definition veml7700.h:195
void set_ambient_light_sensor(sensor::Sensor *sensor)
Definition veml7700.h:119
void apply_lux_compensation_(Readings &data)
Definition veml7700.cpp:372
sensor::Sensor * ambient_light_sensor_
Definition veml7700.h:191
ErrorCode read_sensor_output_(Readings &data)
Definition veml7700.cpp:281
void set_infrared_sensor(sensor::Sensor *sensor)
Definition veml7700.h:123
struct @67::@68 __attribute__
AlsGain501 gain
ErrorCode
Error codes returned by I2CBus and I2CDevice methods.
Definition i2c_bus.h:11
@ ERROR_OK
No error found during execution of method.
Definition i2c_bus.h:13
const uint8_t INTEGRATION_TIMES_COUNT
Definition veml7700.h:43
const uint8_t GAINS_COUNT
Definition veml7700.h:33
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7