7static const char *
const TAG =
"sds011";
9static const uint8_t SDS011_MSG_REQUEST_LENGTH = 19;
10static const uint8_t SDS011_MSG_RESPONSE_LENGTH = 10;
11static const uint8_t SDS011_DATA_REQUEST_LENGTH = 15;
12static const uint8_t SDS011_DATA_RESPONSE_LENGTH = 6;
13static const uint8_t SDS011_MSG_HEAD = 0xaa;
14static const uint8_t SDS011_MSG_TAIL = 0xab;
15static const uint8_t SDS011_COMMAND_ID_REQUEST = 0xb4;
16static const uint8_t SDS011_COMMAND_ID_RESPONSE = 0xc5;
17static const uint8_t SDS011_COMMAND_ID_DATA = 0xc0;
18static const uint8_t SDS011_COMMAND_REPORT_MODE = 0x02;
19static const uint8_t SDS011_COMMAND_QUERY_DATA = 0x04;
20static const uint8_t SDS011_COMMAND_SET_DEVICE_ID = 0x05;
21static const uint8_t SDS011_COMMAND_SLEEP = 0x06;
22static const uint8_t SDS011_COMMAND_FIRMWARE = 0x07;
23static const uint8_t SDS011_COMMAND_PERIOD = 0x08;
24static const uint8_t SDS011_GET_MODE = 0x00;
25static const uint8_t SDS011_SET_MODE = 0x01;
26static const uint8_t SDS011_MODE_REPORT_ACTIVE = 0x00;
27static const uint8_t SDS011_MODE_REPORT_QUERY = 0x01;
28static const uint8_t SDS011_MODE_SLEEP = 0x00;
29static const uint8_t SDS011_MODE_WORK = 0x01;
37 uint8_t command_data[SDS011_DATA_REQUEST_LENGTH] = {0};
38 command_data[0] = SDS011_COMMAND_REPORT_MODE;
39 command_data[1] = SDS011_SET_MODE;
40 command_data[2] = SDS011_MODE_REPORT_ACTIVE;
41 command_data[13] = 0xff;
42 command_data[14] = 0xff;
45 command_data[0] = SDS011_COMMAND_PERIOD;
46 command_data[1] = SDS011_SET_MODE;
48 command_data[13] = 0xff;
49 command_data[14] = 0xff;
59 uint8_t command_data[SDS011_DATA_REQUEST_LENGTH] = {0};
60 command_data[0] = SDS011_COMMAND_SLEEP;
61 command_data[1] = SDS011_SET_MODE;
62 command_data[2] = working_state ? SDS011_MODE_WORK : SDS011_MODE_SLEEP;
63 command_data[13] = 0xff;
64 command_data[14] = 0xff;
71 " Update Interval: %u min\n"
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;
114 this->
write_array(command_data, SDS011_DATA_REQUEST_LENGTH);
121 for (uint8_t i = 0; i <
length; i++) {
122 sum += command_data[i];
129 uint8_t
byte = this->
data_[index];
132 return byte == SDS011_MSG_HEAD;
136 return byte == SDS011_COMMAND_ID_DATA;
139 if ((index >= 2) && (index <= 7)) {
147 ESP_LOGW(TAG,
"SDS011 Checksum doesn't match: 0x%02X!=0x%02X",
byte,
checksum);
154 if (
byte != SDS011_MSG_TAIL) {
167 ESP_LOGD(TAG,
"Got PM2.5 Concentration: %.1f µg/m³, PM10.0 Concentration: %.1f µg/m³", pm_2_5_concentration,
168 pm_10_0_concentration);
169 if (pm_2_5_concentration <= 0 && pm_10_0_concentration <= 0) {