sonometre.ino
El micrófono MEMS de la carcasa (GPIO34) entrega un flujo de 8 bits: la raíz media cuadrática convierte el ruido en un nivel 0-100 % mostrado en barra. El sonómetro de apoyo está a tres funciones matemáticas.
Hardware necesario
Un M5Stack Core Basic/Gray (ESP32 en carcasa con TFT de 320×240, botones A/B/C, altavoz, ranura microSD, batería de 110 mAh). Ninguno (micrófono en la carcasa); una fuente sonora para probar.
Cableado
Sin cableado. El micrófono está detrás de los agujeros de la tapa: no los tape.
Funcionamiento
Mic.readPixels muestrea ~8 kHz en el bus PDM interno; la RMS (suma de cuadrados / N, raíz) es la medida de energía de la señal. El mapeo 0-64 → 0-100 % se calibra al oído. En el Arduino IDE (paquete esp32), placa « M5Stack-Core-ESP32 »; instale la biblioteca « M5Stack » (o M5Unified) desde el gestor y suba.
Para ir más lejos
Dispare el zumbador por encima de un umbral (aviso de nivel), o registre los picos en 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);
}