sonometre.ino

M5StickC Plus2 (M5Stack) — kit portable « stick » ESP32-PICO-V3-02 (SKU K016-P2) · Fichier : sonometre.ino · Langage : Arduino · Usage : Mesurer le niveau ambiant avec le micro du stick

Le micro PDM du Plus2 échantillonne à 16 kHz : RMS et crête se calculent en une boucle et s'affichent en barre colorée. Le seuil rouge à 85 % correspond à une conversation forte à un mètre.

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 ; une source sonore pour tester.

Branchement

Aucun câblage — micro MEMS dans le boîtier, derrière son trou.

Fonctionnement

Mic.record remplit un tampon 16 bits signé ; la somme des carrés donne la RMS, le max donne la crête. Le mapping /100 est un réglage d'oreille, pas une norme dB. 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

Avertisseur sonore (buzzer au-dessus du seuil), ou enregistreur de bruit sur la journée en horodatant les pics.

sonometre.ino

// Micro SPM1423 (PDM) via M5Unified : niveau 0-100 en barre.
#include <M5Unified.h>

const int N = 1024;
int16_t tampon[N];

void setup() {
  auto cfg = M5.config();
  M5.Mic.setSampleRate(16000);
  M5.begin(cfg);
  M5.Display.setRotation(1);
}

void loop() {
  M5.Mic.record(tampon, N, 16000);      // 64 ms de 16 bits
  long long somme = 0;
  int16_t crete = 0;
  for (int i = 0; i < N; i++) {
    somme += (long)tampon[i] * tampon[i];
    crete = max(crete, (int16_t)abs(tampon[i]));
  }
  float rms = sqrtf((float)somme / N);
  int niveau = constrain((int)(rms / 100), 0, 100);

  M5.Display.fillRect(0, 0, 240, 135, TFT_BLACK);
  M5.Display.fillRect(4, 100, 232 * niveau / 100, 24,
                      niveau > 85 ? TFT_RED : TFT_GREEN);
  M5.Display.setCursor(4, 20);
  M5.Display.printf("RMS %6.0f  crete %d\n", rms, crete);
  M5.Display.printf("niveau %d %%\n", niveau);
  delay(100);
}

← Retour à la fiche