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_2_SDA |
| 22 | Internal I2C SCL | I2C_Bus_2_SCL |
| 32 | GROVE SDA (yellow) | I2C bus 1 SDA |
| 33 | GROVE SCL (white) | I2C bus 1 SCL |
| 0 | HAT header SDA (e.g. ENV II HAT) | — |
| 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.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
axp192setting 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. 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. 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.