cogito/esphome_dev/esphome/components/nau7802/nau7802.h

119 lines
3.3 KiB
C++

#pragma once
#include "esphome/core/component.h"
#include "esphome/core/automation.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/i2c/i2c.h"
#include <cinttypes>
namespace esphome {
namespace nau7802 {
enum NAU7802Gain {
NAU7802_GAIN_128 = 0b111,
NAU7802_GAIN_64 = 0b110,
NAU7802_GAIN_32 = 0b101,
NAU7802_GAIN_16 = 0b100,
NAU7802_GAIN_8 = 0b011,
NAU7802_GAIN_4 = 0b010,
NAU7802_GAIN_2 = 0b001,
NAU7802_GAIN_1 = 0b000,
};
enum NAU7802SPS {
NAU7802_SPS_320 = 0b111,
NAU7802_SPS_80 = 0b011,
NAU7802_SPS_40 = 0b010,
NAU7802_SPS_20 = 0b001,
NAU7802_SPS_10 = 0b000,
};
enum NAU7802LDO {
NAU7802_LDO_2V4 = 0b111,
NAU7802_LDO_2V7 = 0b110,
NAU7802_LDO_3V0 = 0b101,
NAU7802_LDO_3V3 = 0b100,
NAU7802_LDO_3V6 = 0b011,
NAU7802_LDO_3V9 = 0b010,
NAU7802_LDO_4V2 = 0b001,
NAU7802_LDO_4V5 = 0b000,
// Never write this to a register
NAU7802_LDO_EXTERNAL = 0b1000,
};
enum NAU7802CalibrationModes {
NAU7802_CALIBRATE_EXTERNAL_OFFSET = 0b10,
NAU7802_CALIBRATE_INTERNAL_OFFSET = 0b00,
NAU7802_CALIBRATE_GAIN = 0b11,
};
class NAU7802Sensor : public sensor::Sensor, public PollingComponent, public i2c::I2CDevice {
public:
void set_samples_per_second(NAU7802SPS sps) { this->sps_ = sps; }
void set_ldo_voltage(NAU7802LDO ldo) { this->ldo_ = ldo; }
void set_gain(NAU7802Gain gain) { this->gain_ = gain; }
void set_gain_calibration(float gain_calibration) { this->gain_calibration_ = gain_calibration; }
void set_offset_calibration(int32_t offset_calibration) { this->offset_calibration_ = offset_calibration; }
bool calibrate_external_offset() { return this->calibrate_(NAU7802_CALIBRATE_EXTERNAL_OFFSET); }
bool calibrate_internal_offset() { return this->calibrate_(NAU7802_CALIBRATE_INTERNAL_OFFSET); }
bool calibrate_gain() { return this->calibrate_(NAU7802_CALIBRATE_GAIN); }
void setup() override;
void loop() override;
void dump_config() override;
float get_setup_priority() const override;
void update() override;
protected:
//
// Internal state
//
enum class CalibrationState : uint8_t {
INACTIVE,
OFFSET,
GAIN,
} state_{CalibrationState::INACTIVE};
float gain_calibration_;
int32_t offset_calibration_;
bool offset_calibration_failed_ = false;
bool gain_calibration_failed_ = false;
//
// Config values
//
NAU7802LDO ldo_;
NAU7802SPS sps_;
NAU7802Gain gain_;
//
// Internal Methods
//
bool calibrate_(enum NAU7802CalibrationModes mode);
void complete_setup_();
void write_value_(uint8_t start_reg, size_t size, int32_t value);
int32_t read_value_(uint8_t start_reg, size_t size);
bool is_data_ready_();
void set_calibration_failure_(bool failed);
};
template<typename... Ts>
class NAU7802CalbrateExternalOffsetAction : public Action<Ts...>, public Parented<NAU7802Sensor> {
public:
void play(Ts... x) override { this->parent_->calibrate_external_offset(); }
};
template<typename... Ts>
class NAU7802CalbrateInternalOffsetAction : public Action<Ts...>, public Parented<NAU7802Sensor> {
public:
void play(Ts... x) override { this->parent_->calibrate_internal_offset(); }
};
template<typename... Ts> class NAU7802CalbrateGainAction : public Action<Ts...>, public Parented<NAU7802Sensor> {
public:
void play(Ts... x) override { this->parent_->calibrate_gain(); }
};
} // namespace nau7802
} // namespace esphome