ESPHome  2024.5.2
jsn_sr04t.cpp
Go to the documentation of this file.
1 #include "jsn_sr04t.h"
2 #include "esphome/core/helpers.h"
3 #include "esphome/core/log.h"
4 
5 #include <cinttypes>
6 
7 // Very basic support for JSN_SR04T V3.0 distance sensor in mode 2
8 
9 namespace esphome {
10 namespace jsn_sr04t {
11 
12 static const char *const TAG = "jsn_sr04t.sensor";
13 
15  this->write_byte(0x55);
16  ESP_LOGV(TAG, "Request read out from sensor");
17 }
18 
20  while (this->available() > 0) {
21  uint8_t data;
22  this->read_byte(&data);
23 
24  ESP_LOGV(TAG, "Read byte from sensor: %x", data);
25 
26  if (this->buffer_.empty() && data != 0xFF)
27  continue;
28 
29  this->buffer_.push_back(data);
30  if (this->buffer_.size() == 4)
31  this->check_buffer_();
32  }
33 }
34 
36  uint8_t checksum = this->buffer_[0] + this->buffer_[1] + this->buffer_[2];
37  if (this->buffer_[3] == checksum) {
38  uint16_t distance = encode_uint16(this->buffer_[1], this->buffer_[2]);
39  if (distance > 250) {
40  float meters = distance / 1000.0f;
41  ESP_LOGV(TAG, "Distance from sensor: %" PRIu32 "mm, %.3fm", distance, meters);
42  this->publish_state(meters);
43  } else {
44  ESP_LOGW(TAG, "Invalid data read from sensor: %s", format_hex_pretty(this->buffer_).c_str());
45  }
46  } else {
47  ESP_LOGW(TAG, "checksum failed: %02x != %02x", checksum, this->buffer_[3]);
48  }
49  this->buffer_.clear();
50 }
51 
53  LOG_SENSOR("", "JST_SR04T Sensor", this);
54  LOG_UPDATE_INTERVAL(this);
55 }
56 
57 } // namespace jsn_sr04t
58 } // 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
void write_byte(uint8_t data)
Definition: uart.h:19
bool read_byte(uint8_t *data)
Definition: uart.h:29
std::vector< uint8_t > buffer_
Definition: jsn_sr04t.h:24
void publish_state(float state)
Publish a new state to the front-end.
Definition: sensor.cpp:39
constexpr uint16_t encode_uint16(uint8_t msb, uint8_t lsb)
Encode a 16-bit value given the most and least significant byte.
Definition: helpers.h:182
uint8_t checksum
Definition: bl0939.h:35
This is a workaround until we can figure out a way to get the tflite-micro idf component code availab...
Definition: a01nyub.cpp:7