Do you like to try using an external component?
You can try like this.
uart:
baud_rate: 9600
data_bits: 8
parity: NONE
stop_bits: 1
rx_pin: GPIO3
tx_pin: GPIO1
external_components:
- source: github://eigger/espcomponents/releases/latest
components: [ uartex ]
refresh: always
uartex:
rx_timeout: 10ms
tx_delay: 50ms
tx_timeout: 500ms
tx_retry_cnt: 3
rx_header: [0x42, 0x4D]
# rx_footer: "\r\n"
tx_header: [0x42, 0x4D]
# tx_footer: "\r\n"
# rx_checksum: add
# tx_checksum: add
rx_checksum2: !lambda |-
uint8_t crc_1 = 0;
uint8_t crc_2 = 0;
for (int i = 0; i < len; i++)
{
crc_1 += data[i];
crc_2 += data[i];
}
crc_2 += crc_1;
return {crc_1, crc_2};
version:
disabled: False
error:
disabled: False
log:
disabled: False
sensor:
- platform: uartex
name: "PM1.0 Sensor"
unit_of_measurement: "µg/m³"
state:
data: [0x00, 0x00]
mask: [0x00, 0x00]
state_number:
offset: 2
length: 2
precision: 2
- platform: uartex
name: "PM2.5 Sensor"
unit_of_measurement: "µg/m³"
state:
data: [0x00, 0x00]
mask: [0x00, 0x00]
state_number:
offset: 4
length: 2
precision: 2
- platform: uartex
name: "PM10 Sensor"
unit_of_measurement: "µg/m³"
state:
data: [0x00, 0x00]
mask: [0x00, 0x00]
state_number:
offset: 6
length: 2
precision: 2