mirror of
https://github.com/esphome/esphome.git
synced 2025-04-10 04:40:30 +01:00
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Co-authored-by: Keith Burzinski <kbx81x@gmail.com> Co-authored-by: Mat931 <49403702+Mat931@users.noreply.github.com>
67 lines
1.9 KiB
C++
67 lines
1.9 KiB
C++
// Based on this datasheet:
|
|
// https://www.mouser.ca/datasheet/2/678/AVGO_S_A0002854364_1-2574547.pdf
|
|
|
|
#pragma once
|
|
|
|
#include "esphome/components/i2c/i2c.h"
|
|
#include "esphome/components/sensor/sensor.h"
|
|
#include "esphome/core/component.h"
|
|
|
|
namespace esphome {
|
|
namespace apds9306 {
|
|
|
|
enum MeasurementBitWidth : uint8_t {
|
|
MEASUREMENT_BIT_WIDTH_20 = 0,
|
|
MEASUREMENT_BIT_WIDTH_19 = 1,
|
|
MEASUREMENT_BIT_WIDTH_18 = 2,
|
|
MEASUREMENT_BIT_WIDTH_17 = 3,
|
|
MEASUREMENT_BIT_WIDTH_16 = 4,
|
|
MEASUREMENT_BIT_WIDTH_13 = 5,
|
|
};
|
|
static const uint8_t MEASUREMENT_BIT_WIDTH_VALUES[] = {20, 19, 18, 17, 16, 13};
|
|
|
|
enum MeasurementRate : uint8_t {
|
|
MEASUREMENT_RATE_25 = 0,
|
|
MEASUREMENT_RATE_50 = 1,
|
|
MEASUREMENT_RATE_100 = 2,
|
|
MEASUREMENT_RATE_200 = 3,
|
|
MEASUREMENT_RATE_500 = 4,
|
|
MEASUREMENT_RATE_1000 = 5,
|
|
MEASUREMENT_RATE_2000 = 6,
|
|
};
|
|
static const uint16_t MEASUREMENT_RATE_VALUES[] = {25, 50, 100, 200, 500, 1000, 2000};
|
|
|
|
enum AmbientLightGain : uint8_t {
|
|
AMBIENT_LIGHT_GAIN_1 = 0,
|
|
AMBIENT_LIGHT_GAIN_3 = 1,
|
|
AMBIENT_LIGHT_GAIN_6 = 2,
|
|
AMBIENT_LIGHT_GAIN_9 = 3,
|
|
AMBIENT_LIGHT_GAIN_18 = 4,
|
|
};
|
|
static const uint8_t AMBIENT_LIGHT_GAIN_VALUES[] = {1, 3, 6, 9, 18};
|
|
|
|
class APDS9306 : public sensor::Sensor, public PollingComponent, public i2c::I2CDevice {
|
|
public:
|
|
void setup() override;
|
|
float get_setup_priority() const override { return setup_priority::BUS; }
|
|
void dump_config() override;
|
|
void update() override;
|
|
void set_bit_width(MeasurementBitWidth bit_width) { this->bit_width_ = bit_width; }
|
|
void set_measurement_rate(MeasurementRate measurement_rate) { this->measurement_rate_ = measurement_rate; }
|
|
void set_ambient_light_gain(AmbientLightGain gain) { this->gain_ = gain; }
|
|
|
|
protected:
|
|
enum ErrorCode {
|
|
NONE = 0,
|
|
COMMUNICATION_FAILED,
|
|
WRONG_ID,
|
|
} error_code_{NONE};
|
|
|
|
MeasurementBitWidth bit_width_;
|
|
MeasurementRate measurement_rate_;
|
|
AmbientLightGain gain_;
|
|
};
|
|
|
|
} // namespace apds9306
|
|
} // namespace esphome
|