mirror of
https://github.com/esphome/esphome.git
synced 2025-02-08 22:20:56 +00:00
74 lines
1.9 KiB
C++
74 lines
1.9 KiB
C++
#include "jsn_sr04t.h"
|
|
#include "esphome/core/helpers.h"
|
|
#include "esphome/core/log.h"
|
|
|
|
// Very basic support for JSN_SR04T V3.0 distance sensor in mode 2
|
|
|
|
namespace esphome {
|
|
namespace jsn_sr04t {
|
|
|
|
static const char *const TAG = "jsn_sr04t.sensor";
|
|
|
|
void Jsnsr04tComponent::update() {
|
|
this->write_byte(0x55);
|
|
ESP_LOGV(TAG, "Request read out from sensor");
|
|
}
|
|
|
|
void Jsnsr04tComponent::loop() {
|
|
while (this->available() > 0) {
|
|
uint8_t data;
|
|
this->read_byte(&data);
|
|
|
|
ESP_LOGV(TAG, "Read byte from sensor: %x", data);
|
|
|
|
if (this->buffer_.empty() && data != 0xFF)
|
|
continue;
|
|
|
|
this->buffer_.push_back(data);
|
|
if (this->buffer_.size() == 4)
|
|
this->check_buffer_();
|
|
}
|
|
}
|
|
|
|
void Jsnsr04tComponent::check_buffer_() {
|
|
uint8_t checksum = 0;
|
|
switch (this->model_) {
|
|
case JSN_SR04T:
|
|
checksum = this->buffer_[0] + this->buffer_[1] + this->buffer_[2];
|
|
break;
|
|
case AJ_SR04M:
|
|
checksum = this->buffer_[1] + this->buffer_[2];
|
|
break;
|
|
}
|
|
|
|
if (this->buffer_[3] == checksum) {
|
|
uint16_t distance = encode_uint16(this->buffer_[1], this->buffer_[2]);
|
|
if (distance > 250) {
|
|
float meters = distance / 1000.0f;
|
|
ESP_LOGV(TAG, "Distance from sensor: %umm, %.3fm", distance, meters);
|
|
this->publish_state(meters);
|
|
} 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 Jsnsr04tComponent::dump_config() {
|
|
LOG_SENSOR("", "JST_SR04T Sensor", this);
|
|
switch (this->model_) {
|
|
case JSN_SR04T:
|
|
ESP_LOGCONFIG(TAG, " sensor model: jsn_sr04t");
|
|
break;
|
|
case AJ_SR04M:
|
|
ESP_LOGCONFIG(TAG, " sensor model: aj_sr04m");
|
|
break;
|
|
}
|
|
LOG_UPDATE_INTERVAL(this);
|
|
}
|
|
|
|
} // namespace jsn_sr04t
|
|
} // namespace esphome
|