ESPHome  2024.9.2
a01nyub.cpp
Go to the documentation of this file.
1 // Datasheet https://wiki.dfrobot.com/A01NYUB%20Waterproof%20Ultrasonic%20Sensor%20SKU:%20SEN0313
2 
3 #include "a01nyub.h"
4 #include "esphome/core/helpers.h"
5 #include "esphome/core/log.h"
6 
7 namespace esphome {
8 namespace a01nyub {
9 
10 static const char *const TAG = "a01nyub.sensor";
11 
13  uint8_t data;
14  while (this->available() > 0) {
15  this->read_byte(&data);
16  if (this->buffer_.empty() && (data != 0xff))
17  continue;
18  buffer_.push_back(data);
19  if (this->buffer_.size() == 4)
20  this->check_buffer_();
21  }
22 }
23 
25  uint8_t checksum = this->buffer_[0] + this->buffer_[1] + this->buffer_[2];
26  if (this->buffer_[3] == checksum) {
27  float distance = (this->buffer_[1] << 8) + this->buffer_[2];
28  if (distance > 280) {
29  float meters = distance / 1000.0;
30  ESP_LOGV(TAG, "Distance from sensor: %f mm, %f m", distance, meters);
31  this->publish_state(meters);
32  } else {
33  ESP_LOGW(TAG, "Invalid data read from sensor: %s", format_hex_pretty(this->buffer_).c_str());
34  }
35  } else {
36  ESP_LOGW(TAG, "checksum failed: %02x != %02x", checksum, this->buffer_[3]);
37  }
38  this->buffer_.clear();
39 }
40 
41 void A01nyubComponent::dump_config() { LOG_SENSOR("", "A01nyub Sensor", this); }
42 
43 } // namespace a01nyub
44 } // namespace esphome
std::string format_hex_pretty(const uint8_t *data, size_t length)
Format the byte array data of length len in pretty-printed, human-readable hex.
Definition: helpers.cpp:361
uint8_t checksum
Definition: bl0906.h:210
std::vector< uint8_t > buffer_
Definition: a01nyub.h:23
bool read_byte(uint8_t *data)
Definition: uart.h:29
void publish_state(float state)
Publish a new state to the front-end.
Definition: sensor.cpp:39
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7