109 lines
3.8 KiB
C++
109 lines
3.8 KiB
C++
#pragma once
|
|
|
|
#include "esphome/core/component.h"
|
|
#include "esphome/core/hal.h"
|
|
#include "esphome/components/sensor/sensor.h"
|
|
#include "esphome/components/i2c/i2c.h"
|
|
|
|
namespace esphome {
|
|
namespace veml3235 {
|
|
|
|
// Register IDs/locations
|
|
//
|
|
static const uint8_t CONFIG_REG = 0x00;
|
|
static const uint8_t W_REG = 0x04;
|
|
static const uint8_t ALS_REG = 0x05;
|
|
static const uint8_t ID_REG = 0x09;
|
|
|
|
// Bit offsets within CONFIG_REG
|
|
//
|
|
static const uint8_t CONFIG_REG_IT_BIT = 12;
|
|
static const uint8_t CONFIG_REG_DG_BIT = 5;
|
|
static const uint8_t CONFIG_REG_G_BIT = 3;
|
|
|
|
// Other important constants
|
|
//
|
|
static const uint8_t DEVICE_ID = 0x35;
|
|
static const uint16_t SHUTDOWN_BITS = 0x0018;
|
|
|
|
// Base multiplier value for lux computation
|
|
//
|
|
static const float LUX_MULTIPLIER_BASE = 0.00213;
|
|
|
|
// Enum for conversion/integration time settings for the VEML3235.
|
|
//
|
|
// Specific values of the enum constants are register values taken from the VEML3235 datasheet.
|
|
// Longer times mean more accurate results, but will take more energy/more time.
|
|
//
|
|
enum VEML3235ComponentIntegrationTime {
|
|
VEML3235_INTEGRATION_TIME_50MS = 0b000,
|
|
VEML3235_INTEGRATION_TIME_100MS = 0b001,
|
|
VEML3235_INTEGRATION_TIME_200MS = 0b010,
|
|
VEML3235_INTEGRATION_TIME_400MS = 0b011,
|
|
VEML3235_INTEGRATION_TIME_800MS = 0b100,
|
|
};
|
|
|
|
// Enum for digital gain settings for the VEML3235.
|
|
// Higher values are better for low light situations, but can increase noise.
|
|
//
|
|
enum VEML3235ComponentDigitalGain {
|
|
VEML3235_DIGITAL_GAIN_1X = 0b0,
|
|
VEML3235_DIGITAL_GAIN_2X = 0b1,
|
|
};
|
|
|
|
// Enum for gain settings for the VEML3235.
|
|
// Higher values are better for low light situations, but can increase noise.
|
|
//
|
|
enum VEML3235ComponentGain {
|
|
VEML3235_GAIN_1X = 0b00,
|
|
VEML3235_GAIN_2X = 0b01,
|
|
VEML3235_GAIN_4X = 0b11,
|
|
};
|
|
|
|
class VEML3235Sensor : public sensor::Sensor, public PollingComponent, public i2c::I2CDevice {
|
|
public:
|
|
void setup() override;
|
|
void dump_config() override;
|
|
void update() override { this->publish_state(this->read_lx_()); }
|
|
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
|
|
// Used by ESPHome framework. Does NOT actually set the value on the device.
|
|
void set_auto_gain(bool auto_gain) { this->auto_gain_ = auto_gain; }
|
|
void set_auto_gain_threshold_high(float auto_gain_threshold_high) {
|
|
this->auto_gain_threshold_high_ = auto_gain_threshold_high;
|
|
}
|
|
void set_auto_gain_threshold_low(float auto_gain_threshold_low) {
|
|
this->auto_gain_threshold_low_ = auto_gain_threshold_low;
|
|
}
|
|
void set_power_on(bool power_on) { this->power_on_ = power_on; }
|
|
void set_digital_gain(VEML3235ComponentDigitalGain digital_gain) { this->digital_gain_ = digital_gain; }
|
|
void set_gain(VEML3235ComponentGain gain) { this->gain_ = gain; }
|
|
void set_integration_time(VEML3235ComponentIntegrationTime integration_time) {
|
|
this->integration_time_ = integration_time;
|
|
}
|
|
|
|
bool auto_gain() { return this->auto_gain_; }
|
|
float auto_gain_threshold_high() { return this->auto_gain_threshold_high_; }
|
|
float auto_gain_threshold_low() { return this->auto_gain_threshold_low_; }
|
|
VEML3235ComponentDigitalGain digital_gain() { return this->digital_gain_; }
|
|
VEML3235ComponentGain gain() { return this->gain_; }
|
|
VEML3235ComponentIntegrationTime integration_time() { return this->integration_time_; }
|
|
|
|
// Updates the configuration register on the device
|
|
bool refresh_config_reg(bool force_on = false);
|
|
|
|
protected:
|
|
float read_lx_();
|
|
void adjust_gain_(uint16_t als_raw_value);
|
|
|
|
bool auto_gain_{true};
|
|
bool power_on_{true};
|
|
float auto_gain_threshold_high_{0.9};
|
|
float auto_gain_threshold_low_{0.2};
|
|
VEML3235ComponentDigitalGain digital_gain_{VEML3235_DIGITAL_GAIN_1X};
|
|
VEML3235ComponentGain gain_{VEML3235_GAIN_1X};
|
|
VEML3235ComponentIntegrationTime integration_time_{VEML3235_INTEGRATION_TIME_50MS};
|
|
};
|
|
|
|
} // namespace veml3235
|
|
} // namespace esphome
|