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 3 SDA
22Internal I2C SCLI2C bus 3 SCL
32GROVE SDA (yellow)I2C bus 1 SDA
33GROVE SCL (white)I2C bus 1 SCL
0HAT header SDA (I2C bus 2—
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.0b5 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":{"batt_gauge":0,"batt_gauge_bus":3,"I2C_Bus_1_SDA":32,"I2C_Bus_1_SCL":33,"I2C_Bus_2_SDA":-1,"I2C_Bus_2_SCL":-1,"I2C_Bus_3_SDA":21,"I2C_Bus_3_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": {
    "batt_gauge": 0,
    "batt_gauge_bus": 3,
    "I2C_Bus_1_SDA": 32,
    "I2C_Bus_1_SCL": 33,
    "I2C_Bus_2_SDA": -1,
    "I2C_Bus_2_SCL": -1,
    "I2C_Bus_3_SDA": 21,
    "I2C_Bus_3_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.

Checked on an M5StickC Plus with v5.0.0b5 (October 2026): both buttons, the AXP192 on the software bus 3 (GPIO 21/22), and an ENV II HAT on bus 2.

  • I2C buses. The stick has three I2C connections, one bus each, so a GROVE add-on and a HAT work together:
    • Bus 1 is the GROVE port on GPIO 32/33, for an add-on such as the ENV IV.
    • Bus 2 is for the HAT header on GPIO 0/26. The board template leaves it off, because not every HAT uses those pins for I2C; a HAT’s add-on template, e.g. the ENV II HAT, turns it on.
    • Bus 3 (software) is the internal bus on GPIO 21/22. The template puts the AXP192 power chip there (Gauge I2C bus Bus 3, Gauge chip AXP192) for battery level, voltage and charging. It also clears bus 2’s pins, so a v4 default of bus 2 on 21/22 can’t drive the same pins.
  • 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. Both are checked on hardware.
  • The screen, IMU, RTC and IR emitter aren’t used by ESPresense.