devices.esphome.io
Waveshare ESP32-S3 Matrix
Waveshare ESP32-S3 Matrix
Device Type: miscElectrical Standard: globalBoard: esp32Difficulty: Plug-n-flash, 2/5
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);