sonometre.ino
Le micro MEMS du boîtier (GPIO34) fournit un flux 8 bits : la racine moyenne quadratique transforme le bruit en un niveau 0-100 % affiché en barre. Le sonomètre d'appoint est à trois fonctions mathématiques.
Matériel requis
Un M5Stack Core Basic/Gray (ESP32 dans un boîtier avec écran TFT 320×240, 3 boutons A/B/C, haut-parleur, micro SD, batterie 110 mAh). Aucun (micro dans le boîtier) ; une source sonore pour tester.
Branchement
Aucun câblage. Le micro est derrière les trous du capot : ne pas boucher.
Fonctionnement
Mic.readPixels échantillonne ~8 kHz sur le bus PDM interne ; la RMS (somme des carrés / N, racine) est la mesure d'énergie du signal. Le mapping 0-64 → 0-100 % est calibré à l'oreille. Dans l'Arduino IDE (paquet esp32), carte « M5Stack-Core-ESP32 » ; installez la bibliothèque « M5Stack » (ou M5Unified) via le gestionnaire, puis Téléverser.
Pour aller plus loin
Déclenchez le buzzer au-dessus d'un seuil (avertisseur de niveau), ou journalisez les pics sur la SD.
sonometre.ino
// Microphone PDM interne : RMS -> barre de niveau + clignotement.
#include <M5Stack.h>
const int N = 2048;
uint8_t tampon[N];
unsigned long precedent = 0;
void setup() {
M5.begin();
M5.Mic.begin();
M5.Lcd.setTextSize(2);
}
void loop() {
if (millis() - precedent < 100) return;
precedent = millis();
M5.Mic.readPixels(tampon, N); // 2048 echantillons 8 bits
long somme = 0;
for (int i = 0; i < N; i++) {
long e = tampon[i] - 128; // recentre autour de zero
somme += e * e;
}
float rms = sqrtf((float)somme / N);
int niveau = constrain(map((int)rms, 0, 64, 0, 100), 0, 100);
M5.Lcd.fillRect(10, 60, 300, 40, TFT_BLACK);
M5.Lcd.fillRect(10, 60, 3 * niveau, 40,
niveau > 80 ? TFT_RED : TFT_GREEN);
M5.Lcd.setCursor(10, 110);
M5.Lcd.printf("RMS %.1f -> %d %%\n", rms, niveau);
}