🛠 Réveil par mouvement et économie d'énergie (HOLD/RTC)

M5StickC Plus2 (M5Stack) — kit portable « stick » ESP32-PICO-V3-02 (SKU K016-P2) · avance · Schéma : IMG-m5stack-stick-c-plus-2-avance-1-m5stick-c2-eveil-mouvement.svg — M5StickC Plus2 en cycle veille/réveil : broche HOLD G4 à 1 pendant l'activité, relâchée en veille, réveil par IRQ du RTC BM8563, avec la consigne « remettre HOLD=1 sinon réextinction ».

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels