Waveshare ESP32-S3 Matrix
A module composed of:
- ESP32 S3 chip
- QMI8658C accelerometer and gyroscope
- 8 x 8 LED matrix
Powered by USB-C
Vendor documentation:
GPIO Pinout
| PIN | ESP32 | Description | 
|---|---|---|
| VCC | VCC | Power input (3.3V) | 
| GND | GND | GND | 
| QMI SDA | 11 | QMI8658 I2C SDA pin | 
| QMI SCL | 12 | QMI8658 I2C SCL pin | 
| QMI IRQ1 | 10 | QMI8658 iterrupt 1 (does not work as well as IRQ2) | 
| QMI IRQ2 | 13 | QMI8658 iterrupt 2 | 
| WS2811 LED | 14 | Controlling the 8x8 LED matrix via neopixel | 
Product Images
 

Device Specific Config
NOTE: While enabeling debug-logging works it recommended to disable it once everyhing works a expected if using interrupt updates. This because every update renders a lot of logging and have caused the online logging and even entire Home Assistant to become unresponsive until timeout and refresh.
esphome:
  name: "led8x8-qmi8658"
  friendly_name: "8x8 pixel matrix"
  comment: "ESP32-S3 with 8x8 LED Pixel matrix and QMI8658 accelerometer"
  platformio_options:
    board_build.flash_mode: dio
  libraries:
    - "Wire"
    - "SPI"
    - "SensorLib"
esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: arduino
external_components:
- source: https://github.com/dala318/esphome-qmi8658
i2c:
  sda: GPIO11
  scl: GPIO12
sensor:
  - platform: qmi8658
    address: 0x6B
    interrupt_pin_1: GPIO10
    acceleration_x:
      name: "QMI8658 Acceleration X"
    acceleration_y:
      name: "QMI8658 Acceleration Y"
    acceleration_z:
      name: "QMI8658 Acceleration Z"
    gyroscope_x:
      name: "QMI8658 Gyro X"
    gyroscope_y:
      name: "QMI8658 Gyro Y"
    gyroscope_z:
      name: "QMI8658 Gyro Z"
    temperature:
      name: "QMI8658 Temperature"
      filters:
        - offset: 34.0
    update_interval: 5s
light:
    name: "NeoPixel Light"
    id: pixel_matrix
    type: RGB
    variant: WS2811
    pin: GPIO14
    num_leds: 64
    color_correct: [40%, 40%, 40%]
    effects:
      - addressable_scan:
      - addressable_twinkle:
display:
  - platform: addressable_light
    id: pixel_display
    addressable_light_id: pixel_matrix
    width: 8
    height: 8
    pixel_mapper: |-
      if (x % 2 == 0) {
        return (x * 8) + y;
      }
      return (x * 8) + (7 - y);
    rotation: 180°
    update_interval: 1000ms
    auto_clear_enabled: true
    lambda: |-
          Color red = Color(0x5F0000);
          Color green = Color(0x005F00);
          Color blue = Color(0x00005F);
          it.rectangle(0, 0, 8, 8, red);
          it.rectangle(1, 1, 6, 6, green);
          it.rectangle(2, 2, 4, 4, blue);
          it.rectangle(3, 3, 2, 2, red);