metesp/src/sensor/dev/bme280.h
2022-04-07 17:28:56 +02:00

124 lines
3.0 KiB
C++

#ifndef TG_BME_280_H
#define TG_BME_280_H
#include <Wire.h>
#define BME280_ADDRESS (0x76)
#define BME280_ADDRESS_ALTERNATE (0x77)
//////////////////////////////////////////////////////////////////
/// BME280 - Driver class for Bosch Bme280 sensor
///
/// Based on the data sheet provided by Bosch for
/// the Bme280 environmental sensor.
///
class BME280{
public:
enum PresUnit{
PresUnit_Pa,
PresUnit_hPa,
PresUnit_atm,
PresUnit_bar,
};
enum OSR{
OSR_Off = 0,
OSR_X1 = 1,
OSR_X2 = 2,
OSR_X4 = 3,
OSR_X8 = 4,
OSR_X16 = 5
};
enum Mode{
Mode_Sleep = 0,
Mode_Forced = 1,
Mode_Normal = 3
};
enum StandbyTime{
StandbyTime_500us = 0,
StandbyTime_62500us = 1,
StandbyTime_125ms = 2,
StandbyTime_250ms = 3,
StandbyTime_50ms = 4,
StandbyTime_1000ms = 5,
StandbyTime_10ms = 6,
StandbyTime_20ms = 7
};
enum Filter{
Filter_Off = 0,
Filter_2 = 1,
Filter_4 = 2,
Filter_8 = 3,
Filter_16 = 4
};
enum ChipModel{
ChipModel_UNKNOWN = 0,
ChipModel_BMP280 = 0x58,
ChipModel_BME280 = 0x60
};
BME280(TwoWire* i2c): m_initialized(false), i2c(i2c){}
ChipModel chipModel();
bool begin();
bool reset();
float temp();
float pres(PresUnit unit = PresUnit_hPa);
float hum();
void read(float& pressure,float& temperature,float& humidity, PresUnit presUnit = PresUnit_hPa);
protected:
bool Initialize();
private:
TwoWire* i2c;
uint8_t m_dig[32];
ChipModel m_chip_model;
bool m_initialized;
static const uint8_t CTRL_HUM_ADDR = 0xF2;
static const uint8_t CTRL_MEAS_ADDR = 0xF4;
static const uint8_t CONFIG_ADDR = 0xF5;
static const uint8_t PRESS_ADDR = 0xF7;
static const uint8_t TEMP_ADDR = 0xFA;
static const uint8_t HUM_ADDR = 0xFD;
static const uint8_t TEMP_DIG_ADDR = 0x88;
static const uint8_t PRESS_DIG_ADDR = 0x8E;
static const uint8_t HUM_DIG_ADDR1 = 0xA1;
static const uint8_t HUM_DIG_ADDR2 = 0xE1;
static const uint8_t ID_ADDR = 0xD0;
static const uint8_t RESET_ADDR = 0xE0;
static const uint8_t RESET_VALUE = 0xB6;
static const uint8_t TEMP_DIG_LENGTH = 6;
static const uint8_t PRESS_DIG_LENGTH = 18;
static const uint8_t HUM_DIG_ADDR1_LENGTH = 1;
static const uint8_t HUM_DIG_ADDR2_LENGTH = 7;
static const uint8_t DIG_LENGTH = 32;
static const uint8_t SENSOR_DATA_LENGTH = 8;
void WriteSettings();
bool ReadChipID();
bool ReadTrim();
bool ReadData(int32_t data[8]);
bool WriteRegister(uint8_t addr,uint8_t data);
bool ReadRegister(uint8_t addr,uint8_t data[],uint8_t length);
float CalculateTemperature(int32_t raw,int32_t& t_fine);
float CalculateHumidity(int32_t raw,int32_t t_fine);
float CalculatePressure(int32_t raw,int32_t t_fine,PresUnit unit = PresUnit_hPa);
};
#endif // TG_BME_280_H