8static const char *
const TAG =
"sds011";
10static const uint8_t SDS011_MSG_REQUEST_LENGTH = 19;
11static const uint8_t SDS011_MSG_RESPONSE_LENGTH = 10;
12static const uint8_t SDS011_DATA_REQUEST_LENGTH = 15;
13static const uint8_t SDS011_DATA_RESPONSE_LENGTH = 6;
14static const uint8_t SDS011_MSG_HEAD = 0xaa;
15static const uint8_t SDS011_MSG_TAIL = 0xab;
16static const uint8_t SDS011_COMMAND_ID_REQUEST = 0xb4;
17static const uint8_t SDS011_COMMAND_ID_RESPONSE = 0xc5;
18static const uint8_t SDS011_COMMAND_ID_DATA = 0xc0;
19static const uint8_t SDS011_COMMAND_REPORT_MODE = 0x02;
20static const uint8_t SDS011_COMMAND_QUERY_DATA = 0x04;
21static const uint8_t SDS011_COMMAND_SET_DEVICE_ID = 0x05;
22static const uint8_t SDS011_COMMAND_SLEEP = 0x06;
23static const uint8_t SDS011_COMMAND_FIRMWARE = 0x07;
24static const uint8_t SDS011_COMMAND_PERIOD = 0x08;
25static const uint8_t SDS011_GET_MODE = 0x00;
26static const uint8_t SDS011_SET_MODE = 0x01;
27static const uint8_t SDS011_MODE_REPORT_ACTIVE = 0x00;
28static const uint8_t SDS011_MODE_REPORT_QUERY = 0x01;
29static const uint8_t SDS011_MODE_SLEEP = 0x00;
30static const uint8_t SDS011_MODE_WORK = 0x01;
38 uint8_t command_data[SDS011_DATA_REQUEST_LENGTH] = {0};
39 command_data[0] = SDS011_COMMAND_REPORT_MODE;
40 command_data[1] = SDS011_SET_MODE;
41 command_data[2] = SDS011_MODE_REPORT_ACTIVE;
42 command_data[13] = 0xff;
43 command_data[14] = 0xff;
46 command_data[0] = SDS011_COMMAND_PERIOD;
47 command_data[1] = SDS011_SET_MODE;
49 command_data[13] = 0xff;
50 command_data[14] = 0xff;
60 uint8_t command_data[SDS011_DATA_REQUEST_LENGTH] = {0};
61 command_data[0] = SDS011_COMMAND_SLEEP;
62 command_data[1] = SDS011_SET_MODE;
63 command_data[2] = working_state ? SDS011_MODE_WORK : SDS011_MODE_SLEEP;
64 command_data[13] = 0xff;
65 command_data[14] = 0xff;
70 ESP_LOGCONFIG(TAG,
"SDS011:");
72 ESP_LOGCONFIG(TAG,
" RX-only mode: %s", ONOFF(this->
rx_mode_only_));
82 ESP_LOGV(TAG,
"Last transmission too long ago. Reset RX index.");
94 if (!check.has_value()) {
97 this->data_index_ = 0;
100 ESP_LOGV(TAG,
"Byte %i of received data frame is invalid.", this->data_index_);
101 this->data_index_ = 0;
116 this->
write_array(command_data, SDS011_DATA_REQUEST_LENGTH);
123 for (uint8_t i = 0; i <
length; i++) {
124 sum += command_data[i];
131 uint8_t
byte = this->
data_[index];
134 return byte == SDS011_MSG_HEAD;
138 return byte == SDS011_COMMAND_ID_DATA;
141 if ((index >= 2) && (index <= 7)) {
149 ESP_LOGW(TAG,
"SDS011 Checksum doesn't match: 0x%02X!=0x%02X",
byte,
checksum);
156 if (
byte != SDS011_MSG_TAIL) {
169 ESP_LOGD(TAG,
"Got PM2.5 Concentration: %.1f µg/m³, PM10.0 Concentration: %.1f µg/m³", pm_2_5_concentration,
170 pm_10_0_concentration);
171 if (pm_2_5_concentration <= 0 && pm_10_0_concentration <= 0) {
184 return (uint16_t(this->
data_[start_index + 1]) << 8) | uint16_t(this->
data_[start_index]);
uint32_t IRAM_ATTR HOT get_loop_component_start_time() const
Get the cached time in milliseconds from when the current component started its loop execution.
void status_clear_warning()
sensor::Sensor * pm_10_0_sensor_
void set_update_interval_min(uint8_t update_interval_min)
uint16_t get_16_bit_uint_(uint8_t start_index) const
sensor::Sensor * pm_2_5_sensor_
float get_setup_priority() const override
void sds011_write_command_(const uint8_t *command)
void set_working_state(bool working_state)
optional< bool > check_byte_() const
uint32_t last_transmission_
uint8_t update_interval_min_
void set_rx_mode_only(bool rx_mode_only)
Manually set the rx-only mode. Defaults to false.
void dump_config() override
uint8_t sds011_checksum_(const uint8_t *command_data, uint8_t length) const
void publish_state(float state)
Publish a new state to the front-end.
void check_uart_settings(uint32_t baud_rate, uint8_t stop_bits=1, UARTParityOptions parity=UART_CONFIG_PARITY_NONE, uint8_t data_bits=8)
Check that the configuration of the UART bus matches the provided values and otherwise print a warnin...
bool read_byte(uint8_t *data)
void write_byte(uint8_t data)
void write_array(const uint8_t *data, size_t len)
const float DATA
For components that import data from directly connected sensors like DHT.
Providing packet encoding functions for exchanging data with a remote host.
Application App
Global storage of Application pointer - only one Application can exist.