16static const char *
const TAG =
"ens210";
19static const uint8_t ENS210_BOOTING_MS = 2;
20static const uint8_t ENS210_SINGLE_MEASURMENT_CONVERSION_TIME_MS =
22static const uint16_t ENS210_PART_ID = 0x0210;
25static const uint8_t ENS210_REGISTER_PART_ID = 0x00;
26static const uint8_t ENS210_REGISTER_UID = 0x04;
27static const uint8_t ENS210_REGISTER_SYS_CTRL = 0x10;
28static const uint8_t ENS210_REGISTER_SYS_STAT = 0x11;
29static const uint8_t ENS210_REGISTER_SENS_RUN = 0x21;
30static const uint8_t ENS210_REGISTER_SENS_START = 0x22;
31static const uint8_t ENS210_REGISTER_SENS_STOP = 0x23;
32static const uint8_t ENS210_REGISTER_SENS_STAT = 0x24;
33static const uint8_t ENS210_REGISTER_T_VAL = 0x30;
34static const uint8_t ENS210_REGISTER_H_VAL = 0x33;
37static const uint8_t CRC7_WIDTH = 7;
38static const uint8_t CRC7_POLY = 0x89;
39static const uint8_t CRC7_IVEC = 0x7F;
42static const uint8_t DATA7_WIDTH = 17;
43static const uint32_t DATA7_MASK = ((1UL << DATA7_WIDTH) - 1);
44static const uint32_t DATA7_MSB = (1UL << (DATA7_WIDTH - 1));
47static const LogString *ens210_status_to_human(
int status) {
50 return LOG_STR(
"I2C error - communication with ENS210 failed!");
52 return LOG_STR(
"CRC error");
54 return LOG_STR(
"Invalid data");
56 return LOG_STR(
"Status OK");
58 return LOG_STR(
"ENS210 has wrong chip ID! Is it a ENS210?");
60 return LOG_STR(
"Unknown");
66static uint32_t crc7(uint32_t value) {
68 uint32_t polynomial = CRC7_POLY;
70 polynomial = polynomial << (DATA7_WIDTH - CRC7_WIDTH - 1);
72 uint32_t bit = DATA7_MSB;
74 value = value << CRC7_WIDTH;
75 bit = bit << CRC7_WIDTH;
76 polynomial = polynomial << CRC7_WIDTH;
80 while (bit & (DATA7_MASK << CRC7_WIDTH)) {
93 if (!this->
write_byte(ENS210_REGISTER_SYS_CTRL, 0x80)) {
94 this->
write_byte(ENS210_REGISTER_SYS_CTRL, 0x80);
100 delay(ENS210_BOOTING_MS);
110 if (!this->
read_bytes(ENS210_REGISTER_PART_ID, data, 2)) {
118 part_id = data[1] * 256U + data[0] * 1U;
120 if (part_id != ENS210_PART_ID) {
129 ESP_LOGCONFIG(TAG,
"ENS210:");
130 LOG_I2C_DEVICE(
this);
132 ESP_LOGE(TAG,
"%s", LOG_STR_ARG(ens210_status_to_human(this->error_code_)));
134 LOG_UPDATE_INTERVAL(
this);
143 if (!this->
write_byte(ENS210_REGISTER_SENS_RUN, 0x00)) {
144 ESP_LOGE(TAG,
"Starting single measurement failed!");
149 if (!this->
write_byte(ENS210_REGISTER_SENS_START, 0x03)) {
150 ESP_LOGE(TAG,
"Trigger of measurement failed!");
155 this->
set_timeout(
"data", uint32_t(ENS210_SINGLE_MEASURMENT_CONVERSION_TIME_MS), [
this]() {
156 int temperature_data, temperature_status, humidity_data, humidity_status;
158 uint32_t h_val_data, t_val_data;
164 if (!this->
read_bytes(ENS210_REGISTER_T_VAL, data, 6)) {
165 ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
170 h_val_data = (uint32_t) ((uint32_t) data[5] << 16 | (uint32_t) data[4] << 8 | (uint32_t) data[3]);
176 float humidity = (humidity_data & 0xFFFF) / 512.0;
180 ESP_LOGW(TAG,
"Humidity status failure: %s", LOG_STR_ARG(ens210_status_to_human(humidity_status)));
185 t_val_data = (uint32_t) ((uint32_t) data[2] << 16 | (uint32_t) data[1] << 8 | (uint32_t) data[0]);
192 float temperature = (temperature_data & 0xFFFF) / 64.0 - 27315L / 100.0;
196 ESP_LOGW(TAG,
"Temperature status failure: %s", LOG_STR_ARG(ens210_status_to_human(temperature_status)));
203 *data = (
val >> 0) & 0xffff;
204 int valid = (
val >> 16) & 0x1;
205 uint32_t crc = (
val >> 17) & 0x7f;
206 uint32_t payload = (
val >> 0) & 0x1ffff;
208 uint8_t crc_ok = crc7(payload) == crc;
221 uint8_t low_power_cmd = enable ? 0x01 : 0x00;
222 ESP_LOGD(TAG,
"Enable low power: %s", enable ?
"true" :
"false");
223 bool result = this->
write_byte(ENS210_REGISTER_SYS_CTRL, low_power_cmd);
224 delay(ENS210_BOOTING_MS);