M5Stack Dial V1.1

ESP32-S3 smart rotary knob with 1.28" round touchscreen, encoder, RFID and buzzer - a ready-made control dial for smart home and industrial panels.

Popular USB-C Native USB
M5Stack Dial V1.1 board
51 × 51 mm
ESP32-S3
MCU
240MHz
clock
8MB
flash
512KB
SRAM
17· Two 12-bit, 20 Channels ADC
GPIO
BLE 5.0+ WiFi
radio

Pinout

17 pins
View:
M5Stack Dial V1.1 pinout diagram
PinGPIOLabelsStatusCapabilitiesNotes
11G1PORT_B_INsafe-
22G2PORT_B_OUTsafe-
33G3BUZZERstrapping-
44G4LCD_DCsafe-
55G5MOSIsafespi
66G6SCKsafespi
77G7LCD_CSsafe-
88G8LCD_RSTsafe-
99G9LCD_BLstrapping-
1011G11SDAstrappingi2c
1112G12SCLstrappingi2c
1213G13PORT_A_SDAstrapping-
1315G15PORT_A_SCLsafe-
1440G40ENC_Astrapping-
1541G41ENC_Bstrapping-
1642G42BUTTONstrapping-
1746G46HOLDstrapping-

Start with these

8 pins with no boot or system involvement
G1PORT_B_ING2PORT_B_OUTG4LCD_DCG5MOSIG6SCKG7LCD_CSG8LCD_RSTG15PORT_A_SCL

Freely assignable - no strapping, flash, USB or JTAG duties. Ideal first picks for buttons, sensors and LEDs.

Fine - with a little care

sampled at boot or shared with debug/serial
PinLabelWhat to knowRole
G3GPIO3Sampled at reset to select JTAG interface (USB Serial/JTAG controller vs. external pins). Improper use can disable external JTAG or alter debug interface.Strapping
G40MTDO (GPIO40)Default JTAG TDO output for debugging. Using it as GPIO will interfere with JTAG debugging functionality.Other
G41MTDI (GPIO41)Default JTAG TDI input for debugging. Should be reserved for JTAG or left unused if JTAG is to remain available.Other
G42MTMS (GPIO42)Default JTAG TMS signal for debugging. Using this pin for other purposes will disable the JTAG interface (unless JTAG is rerouted to USB).Other
G46GPIO46Must be at a defined level during reset (with GPIO0) to select normal or download boot and UART/USB print mode. This pin is input-only (no output drive), so it should be left for its intended strapping function.Strapping

Only if you know the tricks

wired to flash or USB - expect a fight
PinLabelWhat to knowRole
G9FSPIHDConnected to external flash (data/hold signal) on most modules. Not recommended for use as GPIO, since it must remain dedicated to flash communication.Flash
G11FSPIDUsed as a data line for flash (and in-package PSRAM). It should not be used as GPIO when the flash/PSRAM is in use.Flash
G12FSPICLKDrives the flash (and PSRAM) clock. This critical signal must be reserved for memory and not used as general GPIO.Flash
G13FSPIQUsed as a data line for flash/PSRAM transfers. Not available for other uses when flash/PSRAM is connected.Flash
These are recommendations, not hard rules - with the right pull-ups, timing and boot-state awareness most pins can be made to work. When in doubt, start green.
Pinout notes All 17 pins on the M5Stack Dial V1.1 are usable GPIO. Peripheral wiring is straightforward: I²C is mapped to SDA on GPIO11 and SCL on GPIO12. 5 of the exposed…

All 17 pins on the M5Stack Dial V1.1 are usable GPIO.

Peripheral wiring is straightforward: I²C is mapped to SDA on GPIO11 and SCL on GPIO12.

5 of the exposed pins carry boot-time or system duties on the ESP32-S3 (G3, G40, G41 and 2 more) - check the guidance above before wiring anything to them. G1, G2, G4, G5 and 4 more are free of any such role - the safest first picks.


The M5Stack Dial doesn't expose a pin header - expansion happens through its two Grove (HY2.0-4P) ports: Port A (G13 SDA / G15 SCL, I2C) and Port B (G1 input / G2 output, GPIO). A 2.54-2P screw terminal for the wide-range 6-36V power input is included in the box.

Internally, the round display sits on SPI (G5 MOSI / G6 SCK, with G7 CS, G8 reset, G4 D/C and G9 backlight PWM). The touch controller, RFID reader and RTC share the internal I2C bus (G11 SDA / G12 SCL).

The rotary encoder outputs quadrature signals on G40/G41 (16 positions, 64 pulses per revolution), the buzzer is driven from G3, the front button reads on G42, and G46 acts as the power-hold pin.

Guides & tutorials

Getting started

flash your first firmware in ~2 minutes
Tool:
1
Connect over USB
Native USB - no driver, no serial chip. Not detected? Hold BOOT while plugging in.
2
Flash with your tool
Arduino IDE, PlatformIO, ESPHome or esptool - copy the settings on the right.
3
Verify it runs
The blink example uses GPIO1 - swap for your board's LED pin if different.
Tools → Board settings Copy
Board:            M5stack Stamp S3
USB CDC On Boot:  Enabled
Flash Size:       8MB · DIO
Upload Speed:     921600

// blink
pinMode(1, OUTPUT);
digitalWrite(1, LOW);   // on (often inverted)
platformio.ini Copy
[env:m5stack-dial]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
upload_speed = 921600
device.yaml Copy
esp32:
  board: esp32-s3-devkitc-1
  variant: m5stack_stamp_s3
  framework:
    type: esp-idf

# blink - GPIO1
output:
  - platform: gpio
    pin: 1
    id: led_out
light:
  - platform: binary
    name: "LED"
    output: led_out
shell Copy
esptool.py --chip esp32s3 --port /dev/ttyACM0 \
  write_flash 0x0 firmware.bin
Build details: sketch space 3342336 B · data 327680 B · DIO

Good to know

board-specific quirks worth 60 seconds
The screen boots black, inverted, and upside down illustration
The screen boots black, inverted, and upside down
Three separate display traps, same symptom: firmware runs fine, screen shows nothing right. The backlight on GPIO9 is PWM-controlled and off at boot - the panel happily renders behind it, so no error appears anywhere. The GC9A01 panel needs color inversion enabled, otherwise every color comes out negative. And the panel is mounted rotated 180° relative to how you hold the Dial. In ESPHome: define GPIO9 as…

Three separate display traps, same symptom: firmware runs fine, screen shows nothing right. The backlight on GPIO9 is PWM-controlled and off at boot - the panel happily renders behind it, so no error appears anywhere. The GC9A01 panel needs color inversion enabled, otherwise every color comes out negative. And the panel is mounted rotated 180° relative to how you hold the Dial.

In ESPHome: define GPIO9 as a monochromatic light with restore_mode: ALWAYS_ON, set invert_colors: true on the display, and rotation: 180 in the lvgl: block. Our kitchen timer tutorial shows all three wired up.

GPIO46 is both the side button and the power latch illustration
GPIO46 is both the side button and the power latch
One pin, two jobs, pick one. As an input , GPIO46 senses the side (wake) button - fine for USB or DC-powered builds. On battery , the button only supplies power while physically held: firmware must drive GPIO46 HIGH early at boot or the Dial powers back down the moment it is released, so the pin cannot be your button anymore. Wall-powered: a binary_sensor on GPIO46 (inverted) gives you an extra button.…

One pin, two jobs, pick one. As an input, GPIO46 senses the side (wake) button - fine for USB or DC-powered builds. On battery, the button only supplies power while physically held: firmware must drive GPIO46 HIGH early at boot or the Dial powers back down the moment it is released, so the pin cannot be your button anymore.

Wall-powered: a binary_sensor on GPIO46 (inverted) gives you an extra button. Battery: a GPIO46 switch with restore_mode: ALWAYS_ON latches power instead.

There is no PSRAM, and LVGL knows it illustration
There is no PSRAM, and LVGL knows it
The Stamp-S3A module has 8MB flash but no PSRAM . A full-frame LVGL draw buffer for the 240x240 panel wants about 112KB of the same internal RAM WiFi lives in, so ESPHome warns at build time ("buffer_size: may need to be reduced without PSRAM") and LVGL falls back to a smaller strip buffer on its own. Typical LVGL UIs run fine with the automatic fallback. If you push the UI harder and see render trouble or…

The Stamp-S3A module has 8MB flash but no PSRAM. A full-frame LVGL draw buffer for the 240x240 panel wants about 112KB of the same internal RAM WiFi lives in, so ESPHome warns at build time ("buffer_size: may need to be reduced without PSRAM") and LVGL falls back to a smaller strip buffer on its own.

Typical LVGL UIs run fine with the automatic fallback. If you push the UI harder and see render trouble or allocation failures, pin buffer_size: 25% (working configs use 12-25%) in the lvgl: block.

Specifications

ESP32-S3 · 51 × 51 mm
Compute
MCU
ESP32-S3
Clock
240 MHz
SRAM · Flash
512 KB · 8MB
Radio
Wi-Fi
802.11 b/g/n
Bluetooth
5.0 LE
Antenna
3D
I/O
GPIO · ADC
17 · Two 12-bit, 20 Channels
UART · I²C · SPI
3 · 2 · 4
PWM
8 channels
Power
USB
USB-C
Serial
Native (CDC)
Boot address
0x0
Display
Screen
Round TFT · 1.28" · 240x240
Driver
GC9A01
Touch
FT3267
Flashing
Upload · OTA
esptool_py · esp_ota
Flash · Boot mode
DIO · DIO
Sketch · Data
3.19 MB · 320 KB
51 mm51 mm
51 × 51 mm
The M5Stack Dial V1.1 uses esptool_py for firmware uploads, esp_ota for over-the-air (OTA) updates. Flash mode is DIO with DIO boot mode. The maximum sketch size is 3.19 MB with 320 KB available for data.

About this board

Inside sits the ESP32-S3 - a dual-core Xtensa with vector extensions suited to AI workloads.

At $35.00 it's on the expensive side for an ESP32-S3 board - most land around $30.

Around the module: a Round TFT 1.28" 240x240 display with touch, a Grove connector, a BM8563 RTC, a buzzer, an NFC/RFID reader (WS1850S), a rotary encoder, battery charging via 1.25mm-2P and Button/Reset/Wake buttons.

It flashes over native USB - no serial-converter driver needed, which isn't a given among ESP32-S3 boards.


The M5Stack Dial V1.1 is a smart rotary knob built around the M5Stamp-S3A module (ESP32-S3FN8, dual-core @ 240 MHz, 8 MB flash). A 1.28" round capacitive touchscreen (GC9A01, 240x240) sits inside a physical rotary encoder, so you can turn it, tap it, or press it. The default firmware shows this off nicely: turning the dial scrolls a menu detent by detent, with a click from the buzzer at each step.


Beyond the dial there's a WS1850S RFID reader (13.56 MHz, ISO 14443 Type A/B), a BM8563 RTC, an 80dB buzzer, a physical button and two Grove ports for I2C and GPIO expansion. There's no microphone or speaker - audio feedback is buzzer-only.


Power input suits wall or panel installs: DC 6-36V via the included screw terminal, plus a 1.25mm-2P battery connector with a charging circuit for standalone use.


Compared to the original V1.0, the V1.1 swaps the controller for the Stamp-S3A, improves the antenna design and makes the physical buttons bigger.

  • 1.28" round capacitive touchscreen (240x240, GC9A01 driver, FT3267 touch)
  • Physical rotary encoder: 16 positions, 64 pulses per revolution
  • WS1850S RFID reader - 13.56 MHz, ISO/IEC 14443 Type A/B
  • BM8563 RTC with sleep-timer wake-up
  • 80dB buzzer for audible feedback (no microphone or speaker)
  • Wide DC 6-36V power input via included screw terminal
  • 1.25mm-2P battery connector with built-in charging circuit
  • Two Grove ports: Port A (I2C) and Port B (GPIO)
  • Low sleep current: ~6uA on battery
  • V1.1 upgrades: Stamp-S3A controller, improved antenna, larger buttons

FAQ

7 common questions
What is the difference between the M5Stack Dial V1.0 and V1.1?
The V1.1 upgrades the main controller from the StampS3 to the Stamp-S3A, optimizes the antenna design for a stronger wireless signal, enlarges the physical buttons (4.0 x 3.0mm vs 2.6 x 1.6mm) and optimizes power consumption. The display, encoder, RFID and RTC stay the same.
Does the M5Stack Dial work with ESPHome?
Yes, and it is a popular ESPHome device. The round display (GC9A01A), touchscreen, rotary encoder, buzzer (via rtttl), RFID reader (rc522_i2c), RTC and buttons all work with standard ESPHome components - no external component forks needed. We published a complete working config in our kitchen timer tutorial.
Which ESPHome components drive the Dial's touch, RTC and RFID?
None are named after the chips on the board: the FT3267 touch controller uses the ft5x06 platform (address 0x38), the BM8563 RTC uses pcf8563 (0x51), and the WS1850S RFID reader uses rc522_i2c (0x28). All three are compatible parts, but searching the ESPHome docs for the chip names finds nothing. For the display, prefer mipi_spi (model GC9A01A) - the older ili9xxx driver still works but is deprecated.
How many counts does one encoder detent produce in ESPHome?
One, at the default rotary_encoder resolution: the encoder has 16 detents and 64 pulses per revolution, four quadrature edges per detent. Configs that set resolution: 4 - including M5Stack's own Home Assistant guide - get four counts per detent, which suits fine menu scrolling but breaks one-detent-one-step controls. Plain pin_a: GPIO40 / pin_b: GPIO41 works; no pullup configuration is needed.
Does the M5Stack Dial have a battery?
Not built in - but it has a 1.25mm-2P battery connector with a charging circuit, so you can add your own lithium battery. It also accepts DC 6-36V through the included screw terminal, and sleep current on battery is only about 6uA.
Does the M5Stack Dial have a speaker or microphone?
No - audio output is limited to an 80dB buzzer, which is good for click feedback and simple melodies (RTTTL) but not for voice or music playback. There is no microphone.
What can I use the M5Stack Dial for?
It is essentially a ready-made smart knob: light dimming and scene control in Home Assistant, thermostat-style controls, volume knobs, industrial panel controls, or RFID-based access control - the 6-36V input makes it easy to wire into existing installations.

Where to buy

prices are typical street prices
M5Stack Dial V1.1
M5Stack Dial V1.1
$35.00per unit, typical
As an Amazon Associate, ESPboards earns from qualifying purchases.

Resources

Similar boards