podometre.ino
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);
}