mirror of
https://github.com/esphome/esphome.git
synced 2025-04-10 04:40:30 +01:00
* Add support for AS7341 spectral color sensor. * Run clang-format and clang-tidy. * Post-review changes. * Apply suggestions from code review --------- Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
145 lines
4.6 KiB
C++
145 lines
4.6 KiB
C++
#pragma once
|
|
|
|
#include "esphome/core/component.h"
|
|
#include "esphome/components/sensor/sensor.h"
|
|
#include "esphome/components/i2c/i2c.h"
|
|
|
|
namespace esphome {
|
|
namespace as7341 {
|
|
|
|
static const uint8_t AS7341_CHIP_ID = 0X09;
|
|
|
|
static const uint8_t AS7341_CONFIG = 0x70;
|
|
static const uint8_t AS7341_LED = 0x74;
|
|
|
|
static const uint8_t AS7341_ENABLE = 0x80;
|
|
static const uint8_t AS7341_ATIME = 0x81;
|
|
|
|
static const uint8_t AS7341_WTIME = 0x83;
|
|
|
|
static const uint8_t AS7341_AUXID = 0x90;
|
|
static const uint8_t AS7341_REVID = 0x91;
|
|
static const uint8_t AS7341_ID = 0x92;
|
|
static const uint8_t AS7341_STATUS = 0x93;
|
|
|
|
static const uint8_t AS7341_CH0_DATA_L = 0x95;
|
|
static const uint8_t AS7341_CH0_DATA_H = 0x96;
|
|
static const uint8_t AS7341_CH1_DATA_L = 0x97;
|
|
static const uint8_t AS7341_CH1_DATA_H = 0x98;
|
|
static const uint8_t AS7341_CH2_DATA_L = 0x99;
|
|
static const uint8_t AS7341_CH2_DATA_H = 0x9A;
|
|
static const uint8_t AS7341_CH3_DATA_L = 0x9B;
|
|
static const uint8_t AS7341_CH3_DATA_H = 0x9C;
|
|
static const uint8_t AS7341_CH4_DATA_L = 0x9D;
|
|
static const uint8_t AS7341_CH4_DATA_H = 0x9E;
|
|
static const uint8_t AS7341_CH5_DATA_L = 0x9F;
|
|
static const uint8_t AS7341_CH5_DATA_H = 0xA0;
|
|
|
|
static const uint8_t AS7341_STATUS2 = 0xA3;
|
|
|
|
static const uint8_t AS7341_CFG1 = 0xAA; ///< Controls ADC Gain
|
|
|
|
static const uint8_t AS7341_CFG6 = 0xAF; // Stores SMUX command
|
|
static const uint8_t AS7341_CFG9 = 0xB2; // Config for system interrupts (SMUX, Flicker detection)
|
|
|
|
static const uint8_t AS7341_ASTEP = 0xCA; // LSB
|
|
static const uint8_t AS7341_ASTEP_MSB = 0xCB; // MSB
|
|
|
|
enum AS7341AdcChannel {
|
|
AS7341_ADC_CHANNEL_0,
|
|
AS7341_ADC_CHANNEL_1,
|
|
AS7341_ADC_CHANNEL_2,
|
|
AS7341_ADC_CHANNEL_3,
|
|
AS7341_ADC_CHANNEL_4,
|
|
AS7341_ADC_CHANNEL_5,
|
|
};
|
|
|
|
enum AS7341SmuxCommand {
|
|
AS7341_SMUX_CMD_ROM_RESET, ///< ROM code initialization of SMUX
|
|
AS7341_SMUX_CMD_READ, ///< Read SMUX configuration to RAM from SMUX chain
|
|
AS7341_SMUX_CMD_WRITE, ///< Write SMUX configuration from RAM to SMUX chain
|
|
};
|
|
|
|
enum AS7341Gain {
|
|
AS7341_GAIN_0_5X,
|
|
AS7341_GAIN_1X,
|
|
AS7341_GAIN_2X,
|
|
AS7341_GAIN_4X,
|
|
AS7341_GAIN_8X,
|
|
AS7341_GAIN_16X,
|
|
AS7341_GAIN_32X,
|
|
AS7341_GAIN_64X,
|
|
AS7341_GAIN_128X,
|
|
AS7341_GAIN_256X,
|
|
AS7341_GAIN_512X,
|
|
};
|
|
|
|
class AS7341Component : public PollingComponent, public i2c::I2CDevice {
|
|
public:
|
|
void setup() override;
|
|
void dump_config() override;
|
|
float get_setup_priority() const override;
|
|
void update() override;
|
|
|
|
void set_f1_sensor(sensor::Sensor *f1_sensor) { this->f1_ = f1_sensor; }
|
|
void set_f2_sensor(sensor::Sensor *f2_sensor) { f2_ = f2_sensor; }
|
|
void set_f3_sensor(sensor::Sensor *f3_sensor) { f3_ = f3_sensor; }
|
|
void set_f4_sensor(sensor::Sensor *f4_sensor) { f4_ = f4_sensor; }
|
|
void set_f5_sensor(sensor::Sensor *f5_sensor) { f5_ = f5_sensor; }
|
|
void set_f6_sensor(sensor::Sensor *f6_sensor) { f6_ = f6_sensor; }
|
|
void set_f7_sensor(sensor::Sensor *f7_sensor) { f7_ = f7_sensor; }
|
|
void set_f8_sensor(sensor::Sensor *f8_sensor) { f8_ = f8_sensor; }
|
|
void set_clear_sensor(sensor::Sensor *clear_sensor) { clear_ = clear_sensor; }
|
|
void set_nir_sensor(sensor::Sensor *nir_sensor) { nir_ = nir_sensor; }
|
|
|
|
void set_gain(AS7341Gain gain) { gain_ = gain; }
|
|
void set_atime(uint8_t atime) { atime_ = atime; }
|
|
void set_astep(uint16_t astep) { astep_ = astep; }
|
|
|
|
AS7341Gain get_gain();
|
|
uint8_t get_atime();
|
|
uint16_t get_astep();
|
|
bool setup_gain(AS7341Gain gain);
|
|
bool setup_atime(uint8_t atime);
|
|
bool setup_astep(uint16_t astep);
|
|
|
|
uint16_t read_channel(AS7341AdcChannel channel);
|
|
bool read_channels(uint16_t *data);
|
|
void set_smux_low_channels(bool enable);
|
|
bool set_smux_command(AS7341SmuxCommand command);
|
|
void configure_smux_low_channels();
|
|
void configure_smux_high_channels();
|
|
bool enable_smux();
|
|
|
|
bool wait_for_data();
|
|
bool is_data_ready();
|
|
bool enable_power(bool enable);
|
|
bool enable_spectral_measurement(bool enable);
|
|
|
|
bool read_register_bit(uint8_t address, uint8_t bit_position);
|
|
bool write_register_bit(uint8_t address, bool value, uint8_t bit_position);
|
|
bool set_register_bit(uint8_t address, uint8_t bit_position);
|
|
bool clear_register_bit(uint8_t address, uint8_t bit_position);
|
|
uint16_t swap_bytes(uint16_t data);
|
|
|
|
protected:
|
|
sensor::Sensor *f1_{nullptr};
|
|
sensor::Sensor *f2_{nullptr};
|
|
sensor::Sensor *f3_{nullptr};
|
|
sensor::Sensor *f4_{nullptr};
|
|
sensor::Sensor *f5_{nullptr};
|
|
sensor::Sensor *f6_{nullptr};
|
|
sensor::Sensor *f7_{nullptr};
|
|
sensor::Sensor *f8_{nullptr};
|
|
sensor::Sensor *clear_{nullptr};
|
|
sensor::Sensor *nir_{nullptr};
|
|
|
|
uint16_t astep_;
|
|
AS7341Gain gain_;
|
|
uint8_t atime_;
|
|
uint16_t channel_readings_[12];
|
|
};
|
|
|
|
} // namespace as7341
|
|
} // namespace esphome
|