boutons.ino
wasPressed para el clic, wasHold(1000) para la pulsación larga: M5Unified trae la semántica completa de botones con antirrebote. El botón C apaga la pantalla sin cortar la carga: el gesto de autonomía.
Hardware necesario
Un M5StickC Plus2 (ESP32-PICO-V3-02, pantalla de 135×240, botones A/B/C, zumbador pasivo en G2, IR + LED rojo en G19, IMU MPU6886, micrófono, batería de 200 mAh). Ninguno.
Cableado
Sin cableado. A en G38, B en G37, C (Power) en G35. El HOLD G4 debe quedar alto a batería (lo mantiene el firmware).
Funcionamiento
Los objetos botón memorizan flancos y duraciones; wasHold(ms) solo dispara pasada la duración. setBrightness(0) corta la retroiluminación mientras el ESP32 sigue corriendo. En el Arduino IDE (paquete esp32), placa « M5StickCPlus2 »; biblioteca « M5StickCPlus2 » o M5Unified. En la v2 sin PMIC, mantenga el botón C más de 2 s para encender; HOLD (G4) mantiene la alimentación.
Para ir más lejos
Doble clic midiendo el intervalo entre wasPressed, o menú contextual con clic largo.
boutons.ino
// A (G38, flanc), B (G37, bas), C (G35, sous l'ecran = Power).
#include <M5Unified.h>
int page = 0;
void setup() {
auto cfg = M5.config();
M5.begin(cfg);
M5.Display.setRotation(1);
M5.Display.setTextSize(2);
}
void loop() {
M5.update();
if (M5.BtnA.wasPressed()) page = (page + 1) % 3; // appui court
if (M5.BtnA.wasHold(1000)) page = (page + 2) % 3; // appui long
if (M5.BtnB.wasPressed()) M5.Spk.tone(660, 60);
M5.Display.fillScreen(TFT_BLACK);
M5.Display.setCursor(6, 20);
M5.Display.printf("Page %d\n", page);
M5.Display.setTextSize(1);
M5.Display.setCursor(6, 60);
M5.Display.printf("A court=%d long=%d B=%d\n",
M5.BtnA.wasPressed(), M5.BtnA.wasHold(1000),
M5.BtnB.isPressed());
// Bouton C = Power : eteint l'ecran puis le HOLD laisse la charge
if (M5.BtnC.wasPressed()) M5.Display.setBrightness(
M5.Display.getBrightness() > 0 ? 0 : 128);
delay(50);
}