🛠 Réveil par mouvement et économie d'énergie (HOLD/RTC)
Objectifs
Endormir la M5StickC Plus2 v2 pour économiser la batterie de 200 mAh et la réveiller périodiquement. Piège majeur de la v2 sans PMIC : l'alimentation est verrouillée par la broche HOLD (G4) ; après un réveil (IRQ du RTC BM8563), le firmware doit remettre HOLD=1 immédiatement, sinon l'appareil se rééteint — ce qui ressemble à un redémarrage en boucle. Le réveil « sur accélération matérielle » via la broche INT du MPU6886 n'est pas documenté comme routée vers une broche de réveil : >
Matériel
- 1× M5StickC Plus2 (v2) — batterie chargée
- Câble USB-C pour téléverser (en charge, l'extinction est seulement une mise en veille d'écran)
- Arduino IDE / PlatformIO, M5Unified
Code complet
//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 après un réveil 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.
}
Vérification attendue
L'appareil se réveille toutes les 2 secondes (compteur d'éveils affiché) et ne consomme presque rien entre deux réveils. Secouer le stick le maintient éveillé avec affichage du pic et bip. Couper HOLD (appui long C sans USB) éteint tout ; le réamorçage se fait par C maintenu plus de 2 s.
Erreurs fréquentes
- Oublier
digitalWrite(HOLD, HIGH)en tout début desetup: après un réveil RTC, la machine se rééteint aussitôt — symptôme « reboot loop » documenté par M5Stack. - Croire qu'un
esp_deep_sleep_startsuffit à éteindre l'appareil : sans USB, il faut relâcher HOLD (G4=0) ; le deep-sleep classique laisse le latch d'alimentation actif. - Compter sur une interruption matérielle de l'IMU : le routement de l'INT du MPU6886 vers une broche de réveil n'est pas confirmé dans la doc.
- Tester « l'extinction » branché sur USB : avec USB, l'appui long C n'éteint que l'écran — la batterie ne se vide pas mais l'appareil reste alimenté.
- La LED verte n'est pas programmable : c'est un indicateur d'état de veille, pas une LED user.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
hello-stick.inoArduinoboutons.inoArduinobuzzer.inoArduinoinclinometre.inoArduinohorloge.inoArduinoir-tv.inoArduino