M5StickC Plus
| Chip | ESP32 |
|---|---|
| Form factor | Stick with screen and battery, 48 × 25 × 14 mm |
| Flash | 4 MB |
| Antenna | Built-in |
| USB | USB-C (USB-UART) |
| Install | Browser installer |
| GPIO | Function | ESPresense setting |
|---|---|---|
| 21 | Internal I2C SDA (AXP192 power chip | I2C bus 3 SDA |
| 22 | Internal I2C SCL | I2C bus 3 SCL |
| 32 | GROVE SDA (yellow) | I2C bus 1 SDA |
| 33 | GROVE SCL (white) | I2C bus 1 SCL |
| 0 | HAT header SDA (I2C bus 2 | — |
| 26 | HAT header SCL | — |
| 37 | Button A | Inputs |
| 39 | Button B | Inputs |
| 10 | Red LED (active low) | — |
| 2 | Buzzer | — |
| 9 | IR emitter | — |
Template
Section titled “Template”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.
ledsis empty on purpose. Without it, the genericesp32build’s default status LED on GPIO 2 drives the buzzer. The red LED on GPIO 10 (active low) can be added as apwm_invertedLED; 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.