Skip to content

M5StickC Plus

Works, with caveatsWorks; the built-in battery is a liability for a node that stays plugged in.
ChipESP32
Form factorStick with screen and battery, 48 × 25 × 14 mm
Flash4 MB
AntennaBuilt-in
USBUSB-C (USB-UART)
InstallBrowser installer
GPIOFunctionESPresense setting
21Internal I2C SDA (AXP192 power chipI2C_Bus_2_SDA
22Internal I2C SCLI2C_Bus_2_SCL
32GROVE SDA (yellow)I2C bus 1 SDA
33GROVE SCL (white)I2C bus 1 SCL
0HAT header SDA (e.g. ENV II HAT)—
26HAT header SCL—
37Button AInputs
39Button BInputs
10Red LED (active low)—
2Buzzer—
9IR emitter—

Paste this into the Board Template box on the node's Templates page, then Preview and Apply (firmware v5.0.0b1 or later). It sets the board's pins (and Ethernet type, if it has one) in one go. Apply it before any add-on template. The LED, input and output lists replace what was configured before, so the result doesn't depend on the node's old setup. See Templates.

{"name":"M5StickC Plus","chip":"esp32","settings":{"axp192":true,"I2C_Bus_1_SDA":32,"I2C_Bus_1_SCL":33,"I2C_Bus_2_SDA":21,"I2C_Bus_2_SCL":22,"leds":[],"inputs":[{"name":"Button A","role":"button","pin":37,"type":"floating_inverted"},{"name":"Button B","role":"button","pin":39,"type":"floating_inverted"}],"outputs":[]}}
Formatted, with what each value means
{
  "name": "M5StickC Plus",
  "chip": "esp32",
  "settings": {
    "axp192": true,
    "I2C_Bus_1_SDA": 32,
    "I2C_Bus_1_SCL": 33,
    "I2C_Bus_2_SDA": 21,
    "I2C_Bus_2_SCL": 22,
    "leds": [],
    "inputs": [
      {
        "name": "Button A",
        "role": "button",
        "pin": 37,
        "type": "floating_inverted"
      },
      {
        "name": "Button B",
        "role": "button",
        "pin": 39,
        "type": "floating_inverted"
      }
    ],
    "outputs": []
  }
}

LED type: pwm, pwm_inverted, grb, grbw, rgb or rgbw (the last four are addressable). LED control: mqtt, status, motion, count, or output (follows the output numbered byoutput). Input type: pullup, pulldown or floating, with_inverted for active-low. Output type: output, output_inverted, or high/low for a pin that's just held at that level. An output's input is the 1-based input that controls it. power takes ESPHome's hlw8012 values (a cse7766 needs only rx); sel_inverted matches ESPHome's inverted on sel_pin. eth is the Ethernet Type's option number.

Settings from a working M5StickC Plus node (October 2026): AXP192 on I2C bus 2, Button B, and an ENV II HAT on bus 1.

  • I2C buses. The stick has three I2C connections but the firmware drives two. Bus 2 is the internal bus on GPIO 21/22, which the AXP192 power chip needs (the axp192 setting reads it on bus 2). Bus 1 is the GROVE port on GPIO 32/33, ready for a GROVE add-on such as the ENV IV. A HAT on the top header uses GPIO 0/26 instead: its add-on template, e.g. the ENV II HAT, moves bus 1 there, so you can use the GROVE port or a HAT, not both.
  • leds is empty on purpose. Without it, the generic esp32 build’s default status LED on GPIO 2 drives the buzzer. The red LED on GPIO 10 (active low) can be added as a pwm_inverted LED; that pin is from M5Stack’s docs and hasn’t been checked with ESPresense.
  • Both buttons have external pull-ups, so they use floating_inverted. Button B is checked on hardware; Button A’s pin is from M5Stack’s docs.
  • The screen, IMU, RTC and IR emitter aren’t used by ESPresense.