esphome/esphome/components/bme680/bme680.h

142 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 bme680 {
/// Enum listing all IIR Filter options for the BME680.
enum BME680IIRFilter {
BME680_IIR_FILTER_OFF = 0b000,
BME680_IIR_FILTER_1X = 0b001,
BME680_IIR_FILTER_3X = 0b010,
BME680_IIR_FILTER_7X = 0b011,
BME680_IIR_FILTER_15X = 0b100,
BME680_IIR_FILTER_31X = 0b101,
BME680_IIR_FILTER_63X = 0b110,
BME680_IIR_FILTER_127X = 0b111,
};
/// Enum listing all oversampling options for the BME680.
enum BME680Oversampling {
BME680_OVERSAMPLING_NONE = 0b000,
BME680_OVERSAMPLING_1X = 0b001,
BME680_OVERSAMPLING_2X = 0b010,
BME680_OVERSAMPLING_4X = 0b011,
BME680_OVERSAMPLING_8X = 0b100,
BME680_OVERSAMPLING_16X = 0b101,
};
/// Struct for storing calibration data for the BME680.
struct BME680CalibrationData {
uint16_t t1;
uint16_t t2;
uint8_t t3;
uint16_t p1;
int16_t p2;
int8_t p3;
int16_t p4;
int16_t p5;
int8_t p6;
int8_t p7;
int16_t p8;
int16_t p9;
int8_t p10;
uint16_t h1;
uint16_t h2;
int8_t h3;
int8_t h4;
int8_t h5;
uint8_t h6;
int8_t h7;
int8_t gh1;
int16_t gh2;
int8_t gh3;
uint8_t res_heat_range;
uint8_t res_heat_val;
uint8_t range_sw_err;
float tfine;
uint8_t ambient_temperature;
};
class BME680Component : public PollingComponent, public i2c::I2CDevice {
public:
BME680Component(uint32_t update_interval) : PollingComponent(update_interval) {}
/// Set the temperature oversampling value. Defaults to 16X.
void set_temperature_oversampling(BME680Oversampling temperature_oversampling);
/// Set the pressure oversampling value. Defaults to 16X.
void set_pressure_oversampling(BME680Oversampling pressure_oversampling);
/// Set the humidity oversampling value. Defaults to 16X.
void set_humidity_oversampling(BME680Oversampling humidity_oversampling);
/// Set the IIR Filter value. Defaults to no IIR Filter.
void set_iir_filter(BME680IIRFilter iir_filter);
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_gas_resistance_sensor(sensor::Sensor *gas_resistance_sensor) {
gas_resistance_sensor_ = gas_resistance_sensor;
}
/** Set how the internal heater should operate.
*
* By default, the heater is off. If you want to to have more reliable
* humidity and Gas Resistance values, you can however setup the heater
* with this method.
*
* @param heater_temperature The temperature of the heater in °C.
* @param heater_duration The duration in ms that the heater should turn on for when measuring.
*/
void set_heater(uint16_t heater_temperature, uint16_t heater_duration);
// ========== INTERNAL METHODS ==========
// (In most use cases you won't need these)
void setup() override;
void dump_config() override;
float get_setup_priority() const override;
void update() override;
protected:
/// Calculate the heater resistance value to send to the BME680 register.
uint8_t calc_heater_resistance_(uint16_t temperature);
/// Calculate the heater duration value to send to the BME680 register.
uint8_t calc_heater_duration_(uint16_t duration);
/// Read data from the BME680 and publish results.
void read_data_();
/// Calculate the temperature in °C using the provided raw ADC value.
float calc_temperature_(uint32_t raw_temperature);
/// Calculate the pressure in hPa using the provided raw ADC value.
float calc_pressure_(uint32_t raw_pressure);
/// Calculate the relative humidity in % using the provided raw ADC value.
float calc_humidity_(uint16_t raw_humidity);
/// Calculate the gas resistance in Ω using the provided raw ADC value.
uint32_t calc_gas_resistance_(uint16_t raw_gas, uint8_t range);
/// Calculate how long the sensor will take until we can retrieve data.
uint32_t calc_meas_duration_();
BME680CalibrationData calibration_;
BME680Oversampling temperature_oversampling_{BME680_OVERSAMPLING_16X};
BME680Oversampling pressure_oversampling_{BME680_OVERSAMPLING_16X};
BME680Oversampling humidity_oversampling_{BME680_OVERSAMPLING_16X};
BME680IIRFilter iir_filter_{BME680_IIR_FILTER_OFF};
uint16_t heater_temperature_{320};
uint16_t heater_duration_{150};
sensor::Sensor *temperature_sensor_;
sensor::Sensor *pressure_sensor_;
sensor::Sensor *humidity_sensor_;
sensor::Sensor *gas_resistance_sensor_;
};
} // namespace bme680
} // namespace esphome