podometre.ino

M5StickC Plus2 (M5Stack) — kit portable « stick » ESP32-PICO-V3-02 (SKU K016-P2) · Fichier : podometre.ino · Langage : Arduino · Usage : Détecter les chocs et compter les pas

La norme de l'accélération s'écarte de 1 g à chaque choc : un front sur ce signal, espacé de 300 ms minimum, compte les pas au poignet. Le podomètre le plus simple qui tienne, sans bibliothèque dédiée.

Matériel requis

Un M5StickC Plus2 (ESP32-PICO-V3-02, écran 135×240, boutons A/B/C, buzzer passif G2, IR + LED rouge G19, IMU MPU6886, micro, batterie 200 mAh). Aucun.

Branchement

Aucun câblage. Portez le stick au poignet (sangle ou bracelet) pour un signal propre.

Fonctionnement

Le filtre passe-haut implicite (|a| - 1 g) isole les impacts ; le seuil 0,35 g et le refractory 300 ms évitent le double-comptage. Le bip du buzzer confirme chaque pas. Dans l'Arduino IDE (paquet esp32), carte « M5StickCPlus2 » ; bibliothèque « M5StickCPlus2 » ou M5Unified. Sur la v2 sans PMIC, maintenez le bouton C > 2 s pour allumer ; HOLD (G4) maintient l'alimentation.

Pour aller plus loin

Écran de stats (pas/min, distance estimée), ou total quotidien persisté en NVS à chaque heure.

podometre.ino

// Detecteur de « tap » sur MPU6886 : compteur de pas au poignet.
#include <M5Unified.h>

int pas = 0;
float energiePrec = 0;
unsigned long dernierPas = 0;

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);
  M5.Display.setRotation(1);
  M5.Display.setTextSize(3);
}

void loop() {
  M5.update();
  M5.Imu.update();
  auto a = M5.Imu.getAccel();
  float norme = sqrtf(a.x * a.x + a.y * a.y + a.z * a.z);   // en g
  float energie = fabsf(norme - 1.0f);                      // ecart a la gravite

  unsigned long t = millis();
  if (energie > 0.35f && energiePrec <= 0.35f && t - dernierPas > 300) {
    pas++;
    dernierPas = t;
    M5.Spk.tone(1200, 30);
  }
  energiePrec = energie;

  M5.Display.setCursor(10, 40);
  M5.Display.printf("%4d pas\n", pas);
  M5.Display.setTextSize(1);
  M5.Display.printf("|a|=%.2f g", norme);
  if (M5.BtnB.wasPressed()) pas = 0;      // B = remise a zero
  delay(20);
}

← Retour à la fiche