esphome/esphome/components/mpl3115a2/mpl3115a2.h
Keilin Bickar d66b2a1778
Add support for MPL3115A2 Pressure/Altitude and Temperature Sensor (#3371)
* Add support for mpl3115a2

* Add codeowner

* Linter/test updates

* Minor changes

* Made pressure/altitude exclusive

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
2022-09-09 00:18:02 -05:00

108 lines
2.7 KiB
C++

#pragma once
#include "esphome/core/component.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/i2c/i2c.h"
namespace esphome {
namespace mpl3115a2 {
// enums from https://github.com/adafruit/Adafruit_MPL3115A2_Library/
/** MPL3115A2 registers **/
enum {
MPL3115A2_REGISTER_STATUS = (0x00),
MPL3115A2_REGISTER_PRESSURE_MSB = (0x01),
MPL3115A2_REGISTER_PRESSURE_CSB = (0x02),
MPL3115A2_REGISTER_PRESSURE_LSB = (0x03),
MPL3115A2_REGISTER_TEMP_MSB = (0x04),
MPL3115A2_REGISTER_TEMP_LSB = (0x05),
MPL3115A2_REGISTER_DR_STATUS = (0x06),
MPL3115A2_OUT_P_DELTA_MSB = (0x07),
MPL3115A2_OUT_P_DELTA_CSB = (0x08),
MPL3115A2_OUT_P_DELTA_LSB = (0x09),
MPL3115A2_OUT_T_DELTA_MSB = (0x0A),
MPL3115A2_OUT_T_DELTA_LSB = (0x0B),
MPL3115A2_WHOAMI = (0x0C),
MPL3115A2_BAR_IN_MSB = (0x14),
MPL3115A2_BAR_IN_LSB = (0x15),
};
/** MPL3115A2 status register bits **/
enum {
MPL3115A2_REGISTER_STATUS_TDR = 0x02,
MPL3115A2_REGISTER_STATUS_PDR = 0x04,
MPL3115A2_REGISTER_STATUS_PTDR = 0x08,
};
/** MPL3115A2 PT DATA register bits **/
enum {
MPL3115A2_PT_DATA_CFG = 0x13,
MPL3115A2_PT_DATA_CFG_TDEFE = 0x01,
MPL3115A2_PT_DATA_CFG_PDEFE = 0x02,
MPL3115A2_PT_DATA_CFG_DREM = 0x04,
};
/** MPL3115A2 control registers **/
enum {
MPL3115A2_CTRL_REG1 = (0x26),
MPL3115A2_CTRL_REG2 = (0x27),
MPL3115A2_CTRL_REG3 = (0x28),
MPL3115A2_CTRL_REG4 = (0x29),
MPL3115A2_CTRL_REG5 = (0x2A),
};
/** MPL3115A2 control register bits **/
enum {
MPL3115A2_CTRL_REG1_SBYB = 0x01,
MPL3115A2_CTRL_REG1_OST = 0x02,
MPL3115A2_CTRL_REG1_RST = 0x04,
MPL3115A2_CTRL_REG1_RAW = 0x40,
MPL3115A2_CTRL_REG1_ALT = 0x80,
MPL3115A2_CTRL_REG1_BAR = 0x00,
};
/** MPL3115A2 oversample values **/
enum {
MPL3115A2_CTRL_REG1_OS1 = 0x00,
MPL3115A2_CTRL_REG1_OS2 = 0x08,
MPL3115A2_CTRL_REG1_OS4 = 0x10,
MPL3115A2_CTRL_REG1_OS8 = 0x18,
MPL3115A2_CTRL_REG1_OS16 = 0x20,
MPL3115A2_CTRL_REG1_OS32 = 0x28,
MPL3115A2_CTRL_REG1_OS64 = 0x30,
MPL3115A2_CTRL_REG1_OS128 = 0x38,
};
class MPL3115A2Component : public PollingComponent, public i2c::I2CDevice {
public:
void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
void set_altitude(sensor::Sensor *altitude) { altitude_ = altitude; }
void set_pressure(sensor::Sensor *pressure) { pressure_ = pressure; }
void setup() override;
void dump_config() override;
void update() override;
float get_setup_priority() const override { return setup_priority::DATA; }
protected:
sensor::Sensor *temperature_{nullptr};
sensor::Sensor *altitude_{nullptr};
sensor::Sensor *pressure_{nullptr};
enum ErrorCode {
NONE = 0,
COMMUNICATION_FAILED,
WRONG_ID,
} error_code_{NONE};
};
} // namespace mpl3115a2
} // namespace esphome