sonometre.ino
El micrófono PDM del Plus2 muestrea a 16 kHz: RMS y cresta salen de un bucle y se muestran en barra de color. El umbral rojo al 85 % corresponde a una conversación fuerte a un metro.
Hardware necesario
Un M5StickC Plus2 (ESP32-PICO-V3-02, pantalla de 135×240, botones A/B/C, zumbador pasivo en G2, IR + LED rojo en G19, IMU MPU6886, micrófono, batería de 200 mAh). Ninguno; una fuente sonora para probar.
Cableado
Sin cableado: micrófono MEMS en la carcasa, detrás de su agujero.
Funcionamiento
Mic.record rellena un búfer de 16 bits con signo; la suma de cuadrados da la RMS, el máximo la cresta. El mapeo /100 es un ajuste al oído, no una norma dB. En el Arduino IDE (paquete esp32), placa « M5StickCPlus2 »; biblioteca « M5StickCPlus2 » o M5Unified. En la v2 sin PMIC, mantenga el botón C más de 2 s para encender; HOLD (G4) mantiene la alimentación.
Para ir más lejos
Aviso sonoro (zumbador sobre el umbral), o registrador de ruido de todo el día fechando picos.
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);
}