ESPHome 2025.5.0
Loading...
Searching...
No Matches
xgzp68xx.cpp
Go to the documentation of this file.
1#include "xgzp68xx.h"
2#include "esphome/core/log.h"
3#include "esphome/core/hal.h"
6
7#include <cinttypes>
8
9namespace esphome {
10namespace xgzp68xx {
11
12static const char *const TAG = "xgzp68xx.sensor";
13
14static const uint8_t CMD_ADDRESS = 0x30;
15static const uint8_t SYSCONFIG_ADDRESS = 0xA5;
16static const uint8_t PCONFIG_ADDRESS = 0xA6;
17static const uint8_t READ_COMMAND = 0x0A;
18
20 // Request temp + pressure acquisition
21 this->write_register(0x30, &READ_COMMAND, 1);
22
23 // Wait 20mS per datasheet
24 this->set_timeout("measurement", 20, [this]() {
25 uint8_t data[5];
26 uint32_t pressure_raw;
27 uint16_t temperature_raw;
28 float pressure_in_pa, temperature;
29 int success;
30
31 // Read the sensor data
32 success = this->read_register(0x06, data, 5);
33 if (success != 0) {
34 ESP_LOGE(TAG, "Failed to read sensor data! Error code: %i", success);
35 return;
36 }
37
38 pressure_raw = encode_uint24(data[0], data[1], data[2]);
39 temperature_raw = encode_uint16(data[3], data[4]);
40
41 // Convert the pressure data to hPa
42 ESP_LOGV(TAG, "Got raw pressure=%" PRIu32 ", raw temperature=%u", pressure_raw, temperature_raw);
43 ESP_LOGV(TAG, "K value is %u", this->k_value_);
44
45 // The most significant bit of both pressure and temperature will be 1 to indicate a negative value.
46 // This is directly from the datasheet, and the calculations below will handle this.
47 if (pressure_raw > pow(2, 23)) {
48 // Negative pressure
49 pressure_in_pa = (pressure_raw - pow(2, 24)) / (float) (this->k_value_);
50 } else {
51 // Positive pressure
52 pressure_in_pa = pressure_raw / (float) (this->k_value_);
53 }
54
55 if (temperature_raw > pow(2, 15)) {
56 // Negative temperature
57 temperature = (float) (temperature_raw - pow(2, 16)) / 256.0f;
58 } else {
59 // Positive temperature
60 temperature = (float) temperature_raw / 256.0f;
61 }
62
63 if (this->pressure_sensor_ != nullptr)
64 this->pressure_sensor_->publish_state(pressure_in_pa);
65
66 if (this->temperature_sensor_ != nullptr)
67 this->temperature_sensor_->publish_state(temperature);
68 }); // end of set_timeout
69}
70
72 ESP_LOGD(TAG, "Setting up XGZP68xx...");
73 uint8_t config;
74
75 // Display some sample bits to confirm we are talking to the sensor
76 this->read_register(SYSCONFIG_ADDRESS, &config, 1);
77 ESP_LOGCONFIG(TAG, "Gain value is %d", (config >> 3) & 0b111);
78 ESP_LOGCONFIG(TAG, "XGZP68xx started!");
79}
80
82 ESP_LOGCONFIG(TAG, "XGZP68xx");
83 LOG_SENSOR(" ", "Temperature: ", this->temperature_sensor_);
84 LOG_SENSOR(" ", "Pressure: ", this->pressure_sensor_);
85 LOG_I2C_DEVICE(this);
86 if (this->is_failed()) {
87 ESP_LOGE(TAG, " Connection with XGZP68xx failed!");
88 }
89 LOG_UPDATE_INTERVAL(this);
90}
91
92} // namespace xgzp68xx
93} // namespace esphome
bool is_failed() const
void set_timeout(const std::string &name, uint32_t timeout, std::function< void()> &&f)
Set a timeout function with a unique name.
Definition component.cpp:72
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
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:200
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:191
uint16_t temperature
Definition sun_gtil2.cpp:12