ESPHome 2026.1.4
Loading...
Searching...
No Matches
gl_r01_i2c.cpp
Go to the documentation of this file.
1#include "esphome/core/log.h"
2#include "esphome/core/hal.h"
3#include "gl_r01_i2c.h"
4
5namespace esphome {
6namespace gl_r01_i2c {
7
8static const char *const TAG = "gl_r01_i2c";
9
10// Register definitions from datasheet
11static const uint8_t REG_VERSION = 0x00;
12static const uint8_t REG_DISTANCE = 0x02;
13static const uint8_t REG_TRIGGER = 0x10;
14static const uint8_t CMD_TRIGGER = 0xB0;
15static const uint8_t RESTART_CMD1 = 0x5A;
16static const uint8_t RESTART_CMD2 = 0xA5;
17static const uint8_t READ_DELAY = 40; // minimum milliseconds from datasheet to safely read measurement result
18
20 // Verify sensor presence
21 if (!this->read_byte_16(REG_VERSION, &this->version_)) {
22 ESP_LOGE(TAG, "Failed to communicate with GL-R01 I2C sensor!");
23 this->mark_failed();
24 return;
25 }
26 ESP_LOGD(TAG, "Found GL-R01 I2C with version 0x%04X", this->version_);
27}
28
30 ESP_LOGCONFIG(TAG,
31 "GL-R01 I2C:\n"
32 " Firmware Version: 0x%04X",
33 this->version_);
34 LOG_I2C_DEVICE(this);
35 LOG_SENSOR(" ", "Distance", this);
36}
37
39 // Trigger a new measurement
40 if (!this->write_byte(REG_TRIGGER, CMD_TRIGGER)) {
41 ESP_LOGE(TAG, "Failed to trigger measurement!");
42 this->status_set_warning();
43 return;
44 }
45
46 // Schedule reading the result after the read delay
47 this->set_timeout(READ_DELAY, [this]() { this->read_distance_(); });
48}
49
51 uint16_t distance = 0;
52 if (!this->read_byte_16(REG_DISTANCE, &distance)) {
53 ESP_LOGE(TAG, "Failed to read distance value!");
54 this->status_set_warning();
55 return;
56 }
57
58 if (distance == 0xFFFF) {
59 ESP_LOGW(TAG, "Invalid measurement received!");
60 this->status_set_warning();
61 } else {
62 ESP_LOGV(TAG, "Distance: %umm", distance);
63 this->publish_state(distance);
65 }
66}
67
68} // namespace gl_r01_i2c
69} // namespace esphome
virtual void mark_failed()
Mark this component as failed.
void status_set_warning(const char *message=nullptr)
ESPDEPRECATED("Use const char* or uint32_t overload instead. Removed in 2026.7.0", "2026.1.0") void set_timeout(const std voi set_timeout)(const char *name, uint32_t timeout, std::function< void()> &&f)
Set a timeout function with a unique name.
Definition component.h:445
void status_clear_warning()
bool write_byte(uint8_t a_register, uint8_t data) const
Definition i2c.h:266
bool read_byte_16(uint8_t a_register, uint16_t *data)
Definition i2c.h:250
void publish_state(float state)
Publish a new state to the front-end.
Definition sensor.cpp:76
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7