How to use UART to communicate with devices in esphome

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
2 Likes