ESPHome 2025.5.0
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 float get_setup_priority() const override { return setup_priority::DATA; }
106 void setup() override;
107 void dump_config() override;
108 void update() override;
109 void loop() override;
110
111 //
112 // Configuration setters
113 //
114 void set_gain(Gain gain) { this->gain_ = gain; }
116 void set_enable_automatic_mode(bool enable) { this->automatic_mode_enabled_ = enable; }
117 void set_enable_lux_compensation(bool enable) { this->lux_compensation_enabled_ = enable; }
118 void set_glass_attenuation_factor(float factor) { this->glass_attenuation_factor_ = factor; }
119
122 void set_white_sensor(sensor::Sensor *sensor) { this->white_sensor_ = sensor; }
127
128 protected:
129 //
130 // Internal state machine, used to split all the actions into
131 // small steps in loop() to make sure we are not blocking execution
132 //
147
148 //
149 // Current measurements data
150 //
161
162 //
163 // Device interaction
164 //
167 ErrorCode read_sensor_output_(Readings &data);
168
169 //
170 // Working with the data
171 //
172 bool are_adjustments_required_(Readings &data);
173 void apply_lux_calculation_(Readings &data);
174 void apply_lux_compensation_(Readings &data);
175 void apply_glass_attenuation_(Readings &data);
176 void publish_data_part_1_(Readings &data);
177 void publish_data_part_2_(Readings &data);
178 void publish_data_part_3_(Readings &data);
179
180 //
181 // Component configuration
182 //
188
189 //
190 // Sensors for publishing data
191 //
192 sensor::Sensor *ambient_light_sensor_{nullptr}; // Human eye range 500-600 nm, lx
194 sensor::Sensor *white_sensor_{nullptr}; // Wide range 450-950 nm, lx
195 sensor::Sensor *white_counts_sensor_{nullptr}; // Raw counts
196 sensor::Sensor *fake_infrared_sensor_{nullptr}; // Artificial. = WHITE lx - ALS lx.
197 sensor::Sensor *actual_gain_sensor_{nullptr}; // Actual gain multiplier for the measurement
198 sensor::Sensor *actual_integration_time_sensor_{nullptr}; // Actual integration time for the measurement
199};
200
201} // namespace veml7700
202} // namespace esphome
This class simplifies creating components that periodically check a state.
Definition component.h:301
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:57
void publish_data_part_1_(Readings &data)
Definition veml7700.cpp:407
void set_enable_automatic_mode(bool enable)
Definition veml7700.h:116
void set_enable_lux_compensation(bool enable)
Definition veml7700.h:117
void publish_data_part_2_(Readings &data)
Definition veml7700.cpp:416
void publish_data_part_3_(Readings &data)
Definition veml7700.cpp:428
sensor::Sensor * white_counts_sensor_
Definition veml7700.h:195
enum esphome::veml7700::VEML7700Component::State NOT_INITIALIZED
void apply_glass_attenuation_(Readings &data)
Definition veml7700.cpp:399
sensor::Sensor * ambient_light_counts_sensor_
Definition veml7700.h:193
void set_ambient_light_counts_sensor(sensor::Sensor *sensor)
Definition veml7700.h:121
void set_actual_integration_time_sensor(sensor::Sensor *sensor)
Definition veml7700.h:126
bool are_adjustments_required_(Readings &data)
Definition veml7700.cpp:305
void set_actual_gain_sensor(sensor::Sensor *sensor)
Definition veml7700.h:125
ErrorCode reconfigure_time_and_gain_(IntegrationTime time, Gain gain, bool shutdown)
Definition veml7700.cpp:258
sensor::Sensor * actual_integration_time_sensor_
Definition veml7700.h:198
void set_white_counts_sensor(sensor::Sensor *sensor)
Definition veml7700.h:123
void set_white_sensor(sensor::Sensor *sensor)
Definition veml7700.h:122
void set_integration_time(IntegrationTime time)
Definition veml7700.h:115
float get_setup_priority() const override
Definition veml7700.h:105
void apply_lux_calculation_(Readings &data)
Definition veml7700.cpp:352
void set_glass_attenuation_factor(float factor)
Definition veml7700.h:118
struct esphome::veml7700::VEML7700Component::Readings readings_
sensor::Sensor * fake_infrared_sensor_
Definition veml7700.h:196
void set_ambient_light_sensor(sensor::Sensor *sensor)
Definition veml7700.h:120
void apply_lux_compensation_(Readings &data)
Definition veml7700.cpp:370
sensor::Sensor * ambient_light_sensor_
Definition veml7700.h:192
ErrorCode read_sensor_output_(Readings &data)
Definition veml7700.cpp:279
void set_infrared_sensor(sensor::Sensor *sensor)
Definition veml7700.h:124
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 float DATA
For components that import data from directly connected sensors like DHT.
Definition component.cpp:19
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