🛠 Réveil par mouvement et économie d'énergie (HOLD/RTC)
Objetivos
Poner a dormir la M5StickC Plus2 v2 para ahorrar la batería de 200 mAh y despertarla periódicamente. La trampa principal de la v2 sin PMIC: la alimentación está bloqueada por el pin HOLD (G4); tras un despertar (IRQ del RTC BM8563), el firmware debe restablecer HOLD=1 inmediatamente, de lo contrario el dispositivo se apaga de nuevo — lo que parece un reinicio en bucle. El despertar « por aceleración por hardware » a través del pin INT del MPU6886 no está documentado como conectado a un pin de despertar: >
Material
- 1× M5StickC Plus2 (v2) — batería cargada
- Cable USB-C para subir el código (con carga, el apagado es solo una suspensión de pantalla)
- Arduino IDE / PlatformIO, M5Unified
Código completo
//veille periodique + pique d'acceleration — architecture HOLD (G4) de la v2
#include <M5Unified.h>
const int PIN_HOLD = 4; // POWER HOLD = G4 (officiel)
const float SEUIL_MOUV = 1.5f; // g
uint32_t eveils = 0;
void setup {
pinMode(PIN_HOLD, OUTPUT);
digitalWrite(PIN_HOLD, HIGH); // VITAL: garder l'alim apres un reveil RTC
auto cfg = M5.config;
M5.begin(cfg);
M5.Display.setRotation(1);
M5.Display.setTextSize(2);
M5.Display.setTextColor(TFT_MAGENTA, TFT_BLACK);
M5.Display.printf("Reveil #%lu\n", (unsigned long)++eveils);
delay(400);
}
void loop {
M5.update;
float ax, ay, az;
M5.Imu.getAccel(&ax, &ay, &az);
float n = sqrtf(ax * ax + ay * ay + az * az);
if (n > SEUIL_MOUV) { // mouvement : on reste eveille et on bippe
M5.Display.setCursor(0, 40);
M5.Display.printf("MOUVEMENT %4.2f g", n);
M5.Speaker.tone(1568, 100);
vTaskDelay(300 / portTICK_PERIOD_MS);
} else {
// Pas de mouvement : deep-sleep 2 s (le timer reveille l'ESP32).
// Sans USB, retirer HOLD eteint vraiment ; avec timer-wakeup, l'ESP
// redemarre et setup remet HOLD=1.
esp_sleep_enable_timer_wakeup(2000000ULL);
esp_deep_sleep_start;
}
// Bouton C (G35) : appui long > 6 s sans USB = extinction materielle.
}
Verificación esperada
El dispositivo se despierta cada 2 segundos (se muestra el contador de despertares) y casi no consume entre dos despertares. Sacudir el stick lo mantiene despierto mostrando el pico y emitiendo un pitido. Cortar HOLD (pulsación larga de C sin USB) apaga todo; el reinicio se realiza manteniendo C pulsado más de 2 s.
Errores frecuentes
- Olvidar
digitalWrite(HOLD, HIGH)al principio desetup: tras un despertar por RTC, la máquina se apaga inmediatamente — síntoma de « bucle de reinicio » documentado por M5Stack. - Creer que un
esp_deep_sleep_startes suficiente para apagar el dispositivo: sin USB, hay que liberar HOLD (G4=0); el deep-sleep clásico deja activo el latch de alimentación. - Confiar en una interrupción por hardware del IMU: la conexión del INT del MPU6886 a un pin de despertar no está confirmada en la documentación.
- Probar el « apagado » conectado por USB: con USB, la pulsación larga de C solo apaga la pantalla — la batería no se descarga pero el dispositivo sigue alimentado.
- El LED verde no es programable: es un indicador de estado de suspensión, no un LED de usuario.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
hello-stick.inoArduinoboutons.inoArduinobuzzer.inoArduinoinclinometre.inoArduinohorloge.inoArduinoir-tv.inoArduino