ESPHome 2025.7.1
Loading...
Searching...
No Matches
lps22.cpp
Go to the documentation of this file.
1#include "lps22.h"
2
3namespace esphome {
4namespace lps22 {
5
6static constexpr const char *const TAG = "lps22";
7
8static constexpr uint8_t WHO_AM_I = 0x0F;
9static constexpr uint8_t LPS22HB_ID = 0xB1;
10static constexpr uint8_t LPS22HH_ID = 0xB3;
11static constexpr uint8_t CTRL_REG2 = 0x11;
12static constexpr uint8_t CTRL_REG2_ONE_SHOT_MASK = 0b1;
13static constexpr uint8_t STATUS = 0x27;
14static constexpr uint8_t STATUS_T_DA_MASK = 0b10;
15static constexpr uint8_t STATUS_P_DA_MASK = 0b01;
16static constexpr uint8_t TEMP_L = 0x2b;
17static constexpr uint8_t PRES_OUT_XL = 0x28;
18static constexpr uint8_t REF_P_XL = 0x28;
19static constexpr uint8_t READ_ATTEMPTS = 10;
20static constexpr uint8_t READ_INTERVAL = 5;
21static constexpr float PRESSURE_SCALE = 1.0f / 4096.0f;
22static constexpr float TEMPERATURE_SCALE = 0.01f;
23
25 uint8_t value = 0x00;
26 this->read_register(WHO_AM_I, &value, 1);
27 if (value != LPS22HB_ID && value != LPS22HH_ID) {
28 ESP_LOGW(TAG, "device IDs as %02x, which isn't a known LPS22HB or LPS22HH ID", value);
29 this->mark_failed();
30 }
31}
32
34 ESP_LOGCONFIG(TAG, "LPS22:");
35 LOG_SENSOR(" ", "Temperature", this->temperature_sensor_);
36 LOG_SENSOR(" ", "Pressure", this->pressure_sensor_);
37 LOG_I2C_DEVICE(this);
38 LOG_UPDATE_INTERVAL(this);
39}
40
42 uint8_t value = 0x00;
43 this->read_register(CTRL_REG2, &value, 1);
44 value |= CTRL_REG2_ONE_SHOT_MASK;
45 this->write_register(CTRL_REG2, &value, 1);
46 this->set_retry(READ_INTERVAL, READ_ATTEMPTS, [this](uint8_t _) { return this->try_read_(); });
47}
48
50 uint8_t value = 0x00;
51 this->read_register(STATUS, &value, 1);
52 const uint8_t expected_status_mask = STATUS_T_DA_MASK | STATUS_P_DA_MASK;
53 if ((value & expected_status_mask) != expected_status_mask) {
54 ESP_LOGD(TAG, "STATUS not ready: %x", value);
55 return RetryResult::RETRY;
56 }
57
58 if (this->temperature_sensor_ != nullptr) {
59 uint8_t t_buf[2]{0};
60 this->read_register(TEMP_L, t_buf, 2);
61 int16_t encoded = static_cast<int16_t>(encode_uint16(t_buf[1], t_buf[0]));
62 float temp = TEMPERATURE_SCALE * static_cast<float>(encoded);
64 }
65 if (this->pressure_sensor_ != nullptr) {
66 uint8_t p_buf[3]{0};
67 this->read_register(PRES_OUT_XL, p_buf, 3);
68 uint32_t p_lsb = encode_uint24(p_buf[2], p_buf[1], p_buf[0]);
69 this->pressure_sensor_->publish_state(PRESSURE_SCALE * static_cast<float>(p_lsb));
70 }
71 return RetryResult::DONE;
72}
73
74} // namespace lps22
75} // namespace esphome
virtual void mark_failed()
Mark this component as failed.
void set_retry(const std::string &name, uint32_t initial_wait_time, uint8_t max_attempts, std::function< RetryResult(uint8_t)> &&f, float backoff_increase_factor=1.0f)
Set an retry function with a unique name.
ErrorCode write_register(uint8_t a_register, const uint8_t *data, size_t len, bool stop=true)
writes an array of bytes to a specific register in the I²C device
Definition i2c.cpp:25
ErrorCode read_register(uint8_t a_register, uint8_t *data, size_t len, bool stop=true)
reads an array of bytes from a specific register in the I²C device
Definition i2c.cpp:10
sensor::Sensor * temperature_sensor_
Definition lps22.h:20
void dump_config() override
Definition lps22.cpp:33
sensor::Sensor * pressure_sensor_
Definition lps22.h:21
void publish_state(float state)
Publish a new state to the front-end.
Definition sensor.cpp:45
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
constexpr uint32_t encode_uint24(uint8_t byte1, uint8_t byte2, uint8_t byte3)
Encode a 24-bit value given three bytes in most to least significant byte order.
Definition helpers.h:127
constexpr uint16_t encode_uint16(uint8_t msb, uint8_t lsb)
Encode a 16-bit value given the most and least significant byte.
Definition helpers.h:123