mirror of
https://github.com/esphome/esphome.git
synced 2025-10-01 09:32:21 +01:00
44 lines
1.2 KiB
C++
44 lines
1.2 KiB
C++
// Datasheet https://wiki.dfrobot.com/_A02YYUW_Waterproof_Ultrasonic_Sensor_SKU_SEN0311
|
|
|
|
#include "a02yyuw.h"
|
|
#include "esphome/core/helpers.h"
|
|
#include "esphome/core/log.h"
|
|
|
|
namespace esphome {
|
|
namespace a02yyuw {
|
|
|
|
static const char *const TAG = "a02yyuw.sensor";
|
|
|
|
void A02yyuwComponent::loop() {
|
|
uint8_t data;
|
|
while (this->available() > 0) {
|
|
this->read_byte(&data);
|
|
if (this->buffer_.empty() && (data != 0xff))
|
|
continue;
|
|
buffer_.push_back(data);
|
|
if (this->buffer_.size() == 4)
|
|
this->check_buffer_();
|
|
}
|
|
}
|
|
|
|
void A02yyuwComponent::check_buffer_() {
|
|
uint8_t checksum = this->buffer_[0] + this->buffer_[1] + this->buffer_[2];
|
|
if (this->buffer_[3] == checksum) {
|
|
float distance = (this->buffer_[1] << 8) + this->buffer_[2];
|
|
if (distance > 30) {
|
|
ESP_LOGV(TAG, "Distance from sensor: %f mm", distance);
|
|
this->publish_state(distance);
|
|
} else {
|
|
ESP_LOGW(TAG, "Invalid data read from sensor: %s", format_hex_pretty(this->buffer_).c_str());
|
|
}
|
|
} else {
|
|
ESP_LOGW(TAG, "checksum failed: %02x != %02x", checksum, this->buffer_[3]);
|
|
}
|
|
this->buffer_.clear();
|
|
}
|
|
|
|
void A02yyuwComponent::dump_config() { LOG_SENSOR("", "A02yyuw Sensor", this); }
|
|
|
|
} // namespace a02yyuw
|
|
} // namespace esphome
|