esphome/esphome/components/ms8607/ms8607.h

110 lines
4.1 KiB
C++

#pragma once
#include "esphome/core/component.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/i2c/i2c.h"
namespace esphome {
namespace ms8607 {
/**
Class for I2CDevice used to communicate with the Humidity sensor
on the chip. See MS8607Component instead
*/
class MS8607HumidityDevice : public i2c::I2CDevice {
public:
uint8_t get_address() { return address_; }
};
/**
Temperature, pressure, and humidity sensor.
By default, the MS8607 measures sensors at the highest resolution.
A potential enhancement would be to expose the resolution as a configurable
setting. A lower resolution speeds up ADC conversion time & uses less power.
Datasheet:
https://www.te.com/commerce/DocumentDelivery/DDEController?Action=showdoc&DocId=Data+Sheet%7FMS8607-02BA01%7FB3%7Fpdf%7FEnglish%7FENG_DS_MS8607-02BA01_B3.pdf%7FCAT-BLPS0018
Other implementations:
- https://github.com/TEConnectivity/MS8607_Generic_C_Driver
- https://github.com/adafruit/Adafruit_MS8607
- https://github.com/sparkfun/SparkFun_PHT_MS8607_Arduino_Library
*/
class MS8607Component : public PollingComponent, public i2c::I2CDevice {
public:
virtual ~MS8607Component() = default;
void setup() override;
void update() override;
void dump_config() override;
float get_setup_priority() const override { return setup_priority::DATA; };
void set_temperature_sensor(sensor::Sensor *temperature_sensor) { temperature_sensor_ = temperature_sensor; }
void set_pressure_sensor(sensor::Sensor *pressure_sensor) { pressure_sensor_ = pressure_sensor; }
void set_humidity_sensor(sensor::Sensor *humidity_sensor) { humidity_sensor_ = humidity_sensor; }
void set_humidity_device(MS8607HumidityDevice *humidity_device) { humidity_device_ = humidity_device; }
protected:
/**
Read and store the Pressure & Temperature calibration settings from the PROM.
Intended to be called during setup(), this will set the `failure_reason_`
*/
bool read_calibration_values_from_prom_();
/// Start async temperature read
void request_read_temperature_();
/// Process async temperature read
void read_temperature_();
/// start async pressure read
void request_read_pressure_(uint32_t raw_temperature);
/// process async pressure read
void read_pressure_(uint32_t raw_temperature);
/// start async humidity read
void request_read_humidity_(float temperature_float);
/// process async humidity read
void read_humidity_(float temperature_float);
/// use raw temperature & pressure to calculate & publish values
void calculate_values_(uint32_t raw_temperature, uint32_t raw_pressure);
sensor::Sensor *temperature_sensor_;
sensor::Sensor *pressure_sensor_;
sensor::Sensor *humidity_sensor_;
/** I2CDevice object to communicate with secondary I2C address for the humidity sensor
*
* The MS8607 only has one set of I2C pins, despite using two different addresses.
*
* Default address for humidity is 0x40
*/
MS8607HumidityDevice *humidity_device_;
/// This device's pressure & temperature calibration values, read from PROM
struct CalibrationValues {
/// Pressure sensitivity | SENS-T1. [C1]
uint16_t pressure_sensitivity;
/// Temperature coefficient of pressure sensitivity | TCS. [C3]
uint16_t pressure_sensitivity_temperature_coefficient;
/// Pressure offset | OFF-T1. [C2]
uint16_t pressure_offset;
/// Temperature coefficient of pressure offset | TCO. [C4]
uint16_t pressure_offset_temperature_coefficient;
/// Reference temperature | T-REF. [C5]
uint16_t reference_temperature;
/// Temperature coefficient of the temperature | TEMPSENS. [C6]
uint16_t temperature_coefficient_of_temperature;
} calibration_values_;
/// Possible failure reasons of this component
enum class ErrorCode;
/// Keep track of the reason why this component failed, to augment the dumped config
ErrorCode error_code_;
/// Current progress through required component setup
enum class SetupStatus;
/// Current step in the multi-step & possibly delayed setup() process
SetupStatus setup_status_;
};
} // namespace ms8607
} // namespace esphome