Componentes · 12 min de lectura

Micrófono I2S INMP441 con ESP32: leer audio, medir dB y onda

Conecta el micrófono I2S INMP441 al ESP32: tabla de pines, lectura de audio de 24 bits, cálculo de dB, forma de onda en el Serial Plotter y código para Pico.

El INMP441 es un pequeño módulo de micrófono MEMS que convierte el sonido a digital en su interior y envía directamente muestras de 24 bits por el bus I2S. La pareja INMP441 ESP32 es la forma más fácil de leer audio limpio sin lidiar con un micrófono analógico, un amplificador y un ADC. Conectas el módulo al ESP32 con seis cables, con unas pocas líneas de código I2S obtienes 16 000 muestras por segundo, con ellas puedes calcular el nivel de sonido del ambiente en decibelios (dB) y ver la forma de onda en directo en el Serial Plotter.

En esta guía verás paso a paso cómo funciona el INMP441, para qué sirven las tres líneas del I2S, un código listo que compila tanto en la versión 2.x como en la 3.x del núcleo Arduino para ESP32, la diferencia entre dBFS y dB SPL y la fórmula de un sonómetro real. Al final encontrarás el uso con Raspberry Pi Pico y MicroPython, la diferencia con el económico sensor de sonido KY-038 y los errores de conexión más habituales.

Placa de desarrollo ESP32 para leer el micrófono INMP441
Para leer el INMP441 necesitas una placa con hardware I2S; el ESP32 tiene dos unidades I2S y las señales se pueden enrutar a cualquier GPIO que quieras.

¿Qué es el INMP441 y cómo funciona?

El INMP441 es un micrófono MEMS omnidireccional (capta por igual desde todas las direcciones) fabricado por TDK InvenSense. MEMS significa, en esencia, un pequeño condensador formado por una membrana microscópica y una placa fija grabadas sobre silicio: cuando la onda sonora hace vibrar la membrana, cambia la capacidad. En un micrófono electret clásico ese cambio sale como una tensión analógica muy débil que tú tienes que amplificar, filtrar y medir con un ADC. Dentro del INMP441, en cambio, hay un preamplificador, un filtro anti-aliasing, un ADC sigma-delta de 24 bits y la interfaz I2S. Es decir, lo que sale del micrófono ya no es tensión, sino números que llegan siguiendo una señal de reloj. Así el cable no recoge ruido analógico, la calidad del ADC de la placa deja de importar y cualquier microcontrolador de 3,3 V adecuado obtiene la misma calidad de sonido. El pequeño orificio de la placa del módulo es la entrada de sonido del micrófono; al montar la placa en una caja, cuida de no taparlo.

CaracterísticaValor
TipoMicrófono MEMS omnidireccional con salida digital
InterfazI2S, 24 bits, primero el bit más significativo, complemento a dos
Alimentación1,8–3,3 V
CorrienteAprox. 1,4 mA
Sensibilidad−26 dBFS (1 kHz, 94 dB SPL)
Relación señal/ruido (SNR)61 dBA
Respuesta en frecuencia60 Hz – 15 kHz
Presión sonora máxima (AOP)120 dB SPL
Frecuencia de SCKAprox. 0,5–3,2 MHz (muestreo aprox. 7,8–50 kHz)
Pines del móduloVDD, GND, SD, L/R, WS, SCK

¿Qué es I2S? Audio digital con tres líneas

I2S (Inter-IC Sound) es un bus serie diseñado para transportar muestras de audio entre chips y, aunque el nombre se parezca, no tiene relación con el I2C. Tiene tres líneas: SCK (reloj de bit) indica cuándo hay que leer cada bit de datos, WS (word select, también llamada LRCLK) indica si en ese momento se envía el canal izquierdo o el derecho, y SD son los datos en sí. En este esquema el ESP32 es el maestro (master): genera los dos relojes y el micrófono, siguiendo el reloj, coloca los datos en la línea SD. En el INMP441 cada trama consta de 64 pulsos de SCK: 32 bits del canal izquierdo y 32 bits del derecho. Por eso la frecuencia de muestreo es SCK / 64; para muestrear a 16 kHz, el ESP32 genera un reloj de bit de unos 1,024 MHz. El micrófono escribe su medición de 24 bits, primero el bit más significativo, en la ranura de 32 bits de su canal, y los 8 bits restantes son cero. Por eso en el código desplazamos el valor 8 bits a la derecha.

Pin del INMP441Función
VDDAlimentación, 1,8–3,3 V
GNDTierra
SCKEntrada del reloj de bit (viene de la placa)
WSEntrada del reloj de selección de canal (viene de la placa)
SDSalida de datos de audio en serie (del micrófono a la placa)
L/RSelección de canal: GND = canal izquierdo, VDD = canal derecho

Conexión del INMP441: ESP32 y Raspberry Pi Pico

Pin del INMP441ESP32Raspberry Pi Pico
VDD3V33V3(OUT) (pin 36)
GNDGNDGND
SCKGPIO 32GP16
WSGPIO 25GP17
SDGPIO 33GP18
L/RGNDGND
No conectes nunca el INMP441 a 5 V; el límite absoluto de alimentación es de unos 3,6 V y 5 V pueden estropear el micrófono de forma permanente. Por la misma razón, Arduino Uno y Nano no son adecuados para este módulo: estas placas no tienen hardware I2S, trabajan con lógica de 5 V y sus 2 KB de RAM no bastan para un búfer de audio. El segundo error más común es dejar el pin L/R al aire; un pin flotante deja el canal indeterminado y las lecturas salen en cero o aleatorias.

En el ESP32 las señales I2S se pueden enrutar a cualquier pin mediante la matriz de GPIO; los números 32, 25 y 33 de la tabla no son obligatorios, solo una elección segura. Eso sí, mantente alejado de los pines de strapping que determinan el comportamiento de la placa al arrancar (GPIO 0, 2, 5, 12, 15) y de los GPIO 6–11, reservados para la memoria flash. Los GPIO 34–39 son solo de entrada, así que sirven para la línea SD pero no para SCK y WS. En la Pico la regla es distinta: el controlador I2S de MicroPython usa PIO y el pin WS debe ser el siguiente al pin SCK (por ejemplo GP16 y GP17). Mantén los cables por debajo de 10–15 cm; la señal de reloj, de varios megahercios, se degrada en cables jumper largos. Puedes comprobar la distribución de pines de tu placa en la herramienta de pinout.

Paso a paso: primera lectura de audio con el ESP32

  1. Asegúrate de que el paquete de placas ESP32 está instalado en el Arduino IDE y elige ESP32 Dev Module en el menú Herramientas > Placa. Si no sabes cómo instalarlo, consulta el artículo ¿Qué es el ESP32?.
  2. Coloca el módulo en la protoboard; conecta VDD a 3V3, GND a GND y L/R también a GND.
  3. Conecta SCK a GPIO 32, WS a GPIO 25 y SD a GPIO 33, y mantén los cables cortos.
  4. Sube el código de abajo. No hace falta ninguna biblioteca adicional: ESP_I2S en el núcleo 3.x y driver/i2s.h en el 2.x ya vienen incluidos en el paquete de placas.
  5. Abre el Monitor Serie a 115200 baudios; en una habitación silenciosa deberías ver valores de unos 35–50 dB y de 55–70 dB mientras hablas.
  6. Abre Herramientas > Serial Plotter para ver en directo las curvas de dBFS y dB SPL; da una palmada junto al micrófono y verás cómo salta la curva.

Código para ESP32: medir el nivel de sonido (dB) con el INMP441

El código comprueba la versión del núcleo Arduino para ESP32 con ESP_ARDUINO_VERSION_MAJOR. En la versión 3.x usa la nueva biblioteca ESP_I2S y en la 2.x el controlador I2S clásico de ESP-IDF. Como ambas rutas ofrecen las mismas funciones micBegin() y micRead(), el cálculo dentro de loop() no cambia. En cada vuelta se leen 512 muestras, es decir, 32 ms de audio a 16 kHz, se elimina el desplazamiento de continua, se obtiene el valor RMS y se convierte a decibelios.

C++ (Arduino IDE)
1// INMP441 + ESP32: ses seviyesi (dB) olcer / sound level (dB) meter
2// ESP32 Arduino core 2.x ve 3.x / ESP32 Arduino core 2.x and 3.x
3#include <Arduino.h>
4#include <math.h>
5
6#define MIC_SCK 32   // INMP441 SCK
7#define MIC_WS  25   // INMP441 WS
8#define MIC_SD  33   // INMP441 SD
9
10const uint32_t SAMPLE_RATE = 16000;      // ornekleme hizi / sample rate
11const size_t   BLOCK       = 512;        // blok basina ornek / samples per block
12const double   FS_RMS      = 5931642.0;  // 8388608 / sqrt(2): tam olcek sinus RMS / full-scale sine RMS
13const double   DB_OFFSET   = 120.0;      // 94 dB SPL - (-26 dBFS)
14
15int32_t samples[BLOCK];
16
17#if ESP_ARDUINO_VERSION_MAJOR >= 3
18#include <ESP_I2S.h>
19I2SClass i2s;
20
21bool micBegin() {
22  i2s.setPins(MIC_SCK, MIC_WS, -1, MIC_SD);   // bclk, ws, dout (yok / none), din
23  return i2s.begin(I2S_MODE_STD, SAMPLE_RATE, I2S_DATA_BIT_WIDTH_32BIT,
24                   I2S_SLOT_MODE_MONO, I2S_STD_SLOT_LEFT);   // L/R = GND -> sol / left
25}
26
27size_t micRead(int32_t *buf, size_t count) {
28  size_t bytes = i2s.readBytes((char *)buf, count * sizeof(int32_t));
29  return bytes / sizeof(int32_t);
30}
31#else
32#include <driver/i2s.h>
33
34bool micBegin() {
35  i2s_config_t cfg = {};
36  cfg.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX);   // ana cihaz, alici / master, receiver
37  cfg.sample_rate = SAMPLE_RATE;
38  cfg.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT;
39  cfg.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT;           // L/R = GND -> sol / left
40  cfg.communication_format = I2S_COMM_FORMAT_STAND_I2S;
41  cfg.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1;
42  cfg.dma_buf_count = 4;
43  cfg.dma_buf_len = 256;
44  cfg.use_apll = false;
45
46  i2s_pin_config_t pins = {};
47  pins.mck_io_num = I2S_PIN_NO_CHANGE;
48  pins.bck_io_num = MIC_SCK;
49  pins.ws_io_num = MIC_WS;
50  pins.data_out_num = I2S_PIN_NO_CHANGE;
51  pins.data_in_num = MIC_SD;
52
53  if (i2s_driver_install(I2S_NUM_0, &cfg, 0, NULL) != ESP_OK) return false;
54  return i2s_set_pin(I2S_NUM_0, &pins) == ESP_OK;
55}
56
57size_t micRead(int32_t *buf, size_t count) {
58  size_t bytes = 0;
59  i2s_read(I2S_NUM_0, buf, count * sizeof(int32_t), &bytes, portMAX_DELAY);
60  return bytes / sizeof(int32_t);
61}
62#endif
63
64void setup() {
65  Serial.begin(115200);
66  if (!micBegin()) {
67    Serial.println("I2S baslatilamadi / I2S init failed");
68    while (true) delay(1000);
69  }
70}
71
72void loop() {
73  size_t n = micRead(samples, BLOCK);
74  if (n == 0) return;
75
76  double sum = 0;
77  for (size_t i = 0; i < n; i++) {
78    samples[i] >>= 8;                 // 32 bit yuvadan 24 bit veri / 24-bit data from 32-bit slot
79    sum += samples[i];
80  }
81  double mean = sum / n;              // DC kaymasi / DC offset
82
83  double sq = 0;
84  for (size_t i = 0; i < n; i++) {
85    double v = (double)samples[i] - mean;
86    sq += v * v;
87  }
88  double rms = sqrt(sq / n);
89  if (rms < 1.0) rms = 1.0;           // log10(0) olmasin / avoid log10(0)
90
91  double dbfs = 20.0 * log10(rms / FS_RMS);
92  double spl = dbfs + DB_OFFSET;
93
94  Serial.print("dBFS:");
95  Serial.print(dbfs, 1);
96  Serial.print(" dB_SPL:");
97  Serial.println(spl, 1);
98}
Fragmento de código¿Qué hace?
SAMPLE_RATE = 16000Se toman 16 000 muestras por segundo; la frecuencia de SCK es 16 000 × 64 = 1,024 MHz. Basta para la voz; para música puedes elegir 44 100 (SCK de unos 2,82 MHz).
Ancho de datos de 32 bitsEl INMP441 espera 64 pulsos de SCK por trama WS; si eliges 16 bits, la trama se acorta y los datos pierden sentido.
MONO + LEFT / ONLY_LEFTSolo se lee el canal izquierdo; como el pin L/R está a GND, el micrófono usa la ranura izquierda.
samples[i] >>= 8Extrae la medición de 24 bits de la ranura de 32 bits; el valor queda entre −8 388 608 y +8 388 607.
Restar la mediaElimina el pequeño desplazamiento de continua de la señal; de lo contrario el RMS saldría mayor de lo debido.
rmsRaíz cuadrada de la media de los cuadrados de las muestras; representa la potencia media del sonido.
dbfs + DB_OFFSETConvierte el resultado a dB SPL con la sensibilidad de la hoja de datos, −26 dBFS @ 94 dB SPL.

¿Cómo se calcula el nivel de sonido? dBFS y dB SPL

Como la presión sonora varía en un rango enorme, se usa la escala logarítmica de decibelios: duplicar la amplitud supone unos 6 dB más y multiplicarla por diez, 20 dB más. Los números que da el micrófono se convierten primero a dBFS (decibelios respecto a fondo de escala): dBFS = 20 × log10(RMS / RMS a fondo de escala). El fondo de escala es el valor RMS de una senoidal cuyo pico alcanza el mayor valor de 24 bits, 8 388 608; es decir, 8 388 608 / √2 ≈ 5 931 642. En esta escala 0 dBFS es el límite de saturación del micrófono y cualquier sonido menor da un valor negativo. Para pasar a la presión sonora física, es decir, a dB SPL, se usa la sensibilidad de la hoja de datos: el INMP441 entrega un sonido de 1 kHz a 94 dB SPL como −26 dBFS. De ahí sale la fórmula dB SPL = dBFS + 94 − (−26) = dBFS + 120. Por ejemplo, si el RMS resulta 5 932, dBFS = 20 × log10(0,001) = −60 y el nivel de sonido es de unos 60 dB SPL, es decir, una conversación normal.

Fuente de sonidodB SPL aprox.dBFS en el INMP441
Suelo de ruido del propio micrófono33−87
Habitación silenciosa40−80
Conversación normal (a 1 m)60−60
Tráfico denso, aspiradora70–80−50 a −40
Riesgo para el oído con exposición prolongada85−35
Referencia de medición (calibrador)94−26
Taladro, delante del escenario de un concierto100–110−20 a −10
Límite superior del micrófono (AOP)1200
Esta fórmula se basa solo en el valor de la hoja de datos; la sensibilidad puede variar ±1 dB de un micrófono a otro y el cálculo no tiene ponderación A. Para un resultado más preciso, mide a la vez un sonido constante (por ejemplo un tono de 1 kHz) con el INMP441 y con un sonómetro o una app de medición de sonido del móvil, y suma o resta la diferencia al número 120 del código. Para que los valores se muestren más estables, haz la media de las últimas mediciones; la media móvil del artículo filtrado de datos de sensores también sirve aquí.

Dibujar la forma de onda en el Serial Plotter

El valor en decibelios te dice lo fuerte que es el sonido; para ver su forma tienes que representar las muestras en bruto. En el mismo sketch, sustituye solo la función loop() por la siguiente. Hay un límite importante: una línea serie de 115200 baudios transporta unos 11 500 caracteres por segundo, y eso no basta para imprimir 16 000 muestras por segundo. Por eso el código imprime seguido un bloque de 512 muestras; el sonido que llega mientras se escribe el bloque se pierde, pero cada fragmento que ves en el plotter es un trozo real y continuo de 32 ms.

C++ (Arduino IDE)
1// dB taslaginda loop() yerine bunu kullan / Use this instead of loop() in the dB sketch
2void loop() {
3  size_t n = micRead(samples, BLOCK);
4  for (size_t i = 0; i < n; i++) {
5    int32_t v = samples[i] >> 8;     // 24 bit ham ornek / 24-bit raw sample
6    Serial.print("ses:");
7    Serial.println(v);
8  }
9}

Si silbas al micrófono, verás en el plotter una senoidal casi limpia. En un silbido de 1 kHz un periodo dura 1 ms y equivale a 16 puntos con un muestreo de 16 kHz; contando los puntos de un periodo puedes estimar la frecuencia a grandes rasgos. Como la voz es una mezcla de muchas frecuencias, dibuja una onda irregular y con envolvente; una palmada produce un pico corto y muy alto. Como el plotter escala el eje automáticamente, en el silencio las pequeñas fluctuaciones de ruido pueden parecer grandes; es normal. Para más detalles sobre el Monitor Serie y el Serial Plotter, consulta el artículo Monitor Serie de Arduino.

INMP441 con Raspberry Pi Pico (MicroPython)

La Raspberry Pi Pico no tiene una unidad I2S independiente, pero sus bloques PIO programables emulan el I2S a velocidad de hardware y la clase machine.I2S de MicroPython hace ese trabajo por ti. No hace falta instalar ningún archivo adicional; basta con tener una versión reciente de MicroPython. En el código se elige bits=32 y format=I2S.MONO, y las muestras leídas se desplazan de nuevo 8 bits a la derecha y se convierten a decibelios con la misma fórmula. Como los bucles de Python son más lentos que en C, mantener el tamaño de bloque en 512 muestras es un buen equilibrio; que se pierdan unos milisegundos de sonido durante el cálculo apenas afecta al resultado. Si programas la Pico con el Arduino IDE, la biblioteca I2S del núcleo arduino-pico hace lo mismo; allí también el pin WS (LRCLK) debe ser el siguiente al pin BCLK. Si eres nuevo en MicroPython, echa primero un vistazo a ¿Qué es la Raspberry Pi Pico?.

MicroPython
1from machine import Pin, I2S
2import array
3import math
4
5SCK_PIN = 16   # INMP441 SCK
6WS_PIN = 17    # INMP441 WS (SCK + 1 olmali / must be SCK + 1)
7SD_PIN = 18    # INMP441 SD
8
9FS_RMS = 5931642.0   # 8388608 / sqrt(2): tam olcek sinus RMS / full-scale sine RMS
10DB_OFFSET = 120.0    # 94 dB SPL - (-26 dBFS)
11LN10 = math.log(10)
12
13mic = I2S(0, sck=Pin(SCK_PIN), ws=Pin(WS_PIN), sd=Pin(SD_PIN),
14          mode=I2S.RX, bits=32, format=I2S.MONO,
15          rate=16000, ibuf=8192)
16
17samples = array.array('i', [0] * 512)   # 32 bit ornek dizisi / 32-bit sample array
18
19while True:
20    n = mic.readinto(samples) // 4      # okunan ornek sayisi / number of samples read
21    if n == 0:
22        continue
23    total = 0
24    for i in range(n):
25        samples[i] >>= 8                # 24 bit degeri ayikla / extract 24-bit value
26        total += samples[i]
27    mean = total / n                    # DC kaymasi / DC offset
28    sq = 0.0
29    for i in range(n):
30        d = samples[i] - mean
31        sq += d * d
32    rms = max(math.sqrt(sq / n), 1.0)
33    dbfs = 20 * math.log(rms / FS_RMS) / LN10
34    print("dBFS: {:.1f}  dB SPL: {:.1f}".format(dbfs, dbfs + DB_OFFSET))

Diferencia entre el INMP441 y el sensor de sonido analógico KY-038

Módulo de sensor de sonido analógico KY-038
KY-038: sensor de sonido analógico con cápsula electret, trimmer para ajustar el umbral y comparador LM393.

El KY-038 es un módulo económico formado por una cápsula de micrófono electret, un trimmer para ajustar el umbral y un comparador LM393. Su salida digital (DO) cambia de estado cuando el sonido supera el umbral que hayas fijado; la salida analógica (AO) entrega la tensión en bruto de la cápsula y se lee con el ADC de la placa. Esta estructura basta para detectar palmadas o saber si hay sonido en el ambiente. Pero como el módulo no lleva amplificador, la señal es muy débil: el ADC de 10 bits del Arduino Uno apenas ve unos pocos escalones de variación al hablar, y el ADC del ESP32 también es ruidoso. El INMP441, en cambio, hace la medición dentro del micrófono con 24 bits; como no hay cable analógico, amplificador ni ADC por el medio, registra limpiamente un rango de unos 87 dB desde el suelo de ruido hasta el límite de saturación. En resumen, el KY-038 es un interruptor de sonido y el INMP441 es un micrófono de verdad. Puedes encontrar los límites de la lectura analógica con detalle en la guía del ADC.

CaracterísticaINMP441KY-038
Tipo de micrófonoMEMS, salida digitalCápsula electret, analógico
SalidaI2S, muestras de 24 bitsTensión analógica AO + salida de umbral DO
Alimentación1,8–3,3 V3,3–5 V
Placas compatiblesESP32, Pico y placas con I2SCualquier placa, incluido el Uno
Calidad de sonidoSuficiente para grabar y analizar (60 Hz – 15 kHz)Solo nivel aproximado
Medición de dBSe puede hacer con la fórmulaNo es fiable
Uso típicoSonómetro, grabación de audio, FFT, comandos de vozInterruptor por palmada, alarma de sonido sí/no

Ideas de proyectos con el INMP441

  • LED que reacciona a la música: convierte el nivel de sonido en el número de LED encendidos de una tira WS2812B; para los detalles, mira los artículos LED que reacciona a la música y WS2812B NeoPixel.
  • Semáforo de ruido para el aula: haz una lámpara de aviso verde por debajo de 55 dB, amarilla entre 55 y 70 dB y roja por encima.
  • Panel de ruido en directo en la web: envía el valor en dB al navegador por WebSocket y míralo como gráfico desde el móvil; la estructura básica está en el artículo ESP32 Web Server y WebSocket.
  • Sensor de ruido para casa inteligente: envía las mediciones a Home Assistant por MQTT; la guía ESP32 MQTT y Home Assistant te lo pone fácil.
  • Aviso de llanto de bebé o ladrido de perro: si el sonido supera el umbral durante un tiempo determinado, envía un mensaje a tu móvil con un bot de Telegram.
  • Grabadora de sonido: escribe las muestras como archivo WAV de 16 bits en un módulo de tarjeta SD y escúchalo en el ordenador.
  • Control por silbido: encuentra la frecuencia dominante con una FFT y activa un LED o un relé con un tono de silbido concreto.

Errores comunes y cómo solucionarlos

SíntomaCausa probableSolución
El valor dB SPL se queda fijo en torno a −15,5No llegan datos por la línea SD, todas las muestras son 0Revisa el cable SD y que L/R esté a GND; si no funciona, cambia el canal a derecho (I2S_STD_SLOT_RIGHT en 3.x, I2S_CHANNEL_FMT_ONLY_RIGHT en 2.x)
Al subir el sonido el valor no aumenta, salta al azarSCK y WS están intercambiados o los cables son demasiado largosCorrige los pines según la tabla y deja los cables por debajo de 10–15 cm
Error "CONFLICT! The new i2s driver can't work along with the legacy i2s driver" al arrancarEn el núcleo 3.x se ha usado el antiguo driver/i2s.h junto con el nuevo controladorUsa un solo controlador; la estructura #if de aquí elige automáticamente el correcto
Los valores dB difieren 10–20 dB del sonómetroDesplazamiento de bits incorrecto, no se ha restado la continua o no se ha calibradoDesplaza 8 bits, resta la media y calibra con un tono constante
ValueError al crear el I2S en la PicoEl pin WS no es el siguiente al pin SCKUsa pines consecutivos, como SCK = GP16 y WS = GP17
El micrófono se calienta o no respondeVDD conectado a 5 VPásalo a 3V3 de inmediato; el micrófono puede haberse dañado, prueba con uno nuevo
La onda aparece entrecortada en el Serial PlotterLa línea serie no puede transportar 16 000 muestras por segundoEs normal; para una imagen más fluida sube la velocidad a 921600 baudios
La forma más rápida de probar la conexión es subir el código de dB y soplar suavemente al micrófono. Si el valor ronda los 40 y al soplar sube por encima de 90, todo está bien. Si se queda inmóvil en torno a −15,5, no llegan datos; antes de complicarte con el código, revisa los cables L/R y SD.

Con unos pocos cables y un código corto, el INMP441 le da al ESP32 un micrófono digital de verdad; es la base de muchos proyectos, desde medir el nivel de sonido hasta luces que reaccionan a la música. Siempre que quieras procesar el sonido como números en lugar de conformarte con un sensor analógico, es la primera opción. En la app de BlueGrays puedes ver paso a paso, con esquema de conexiones y código, proyectos con ESP32 como LED, zumbador, tira WS2812B y servidor web, y añadirles este micrófono con facilidad.

Preguntas frecuentes

¿Funciona el INMP441 con Arduino Uno?

No, en la práctica no funciona. Arduino Uno y Nano no tienen hardware I2S, trabajan con lógica de 5 V y sus 2 KB de RAM no bastan para un búfer de audio. Para el INMP441 debes usar un ESP32, un ESP32-S3, una Raspberry Pi Pico o una placa de 3,3 V con soporte I2S.

¿Para qué sirve el pin L/R del INMP441?

El pin L/R elige qué canal de la trama estéreo usa el micrófono: izquierdo si va a GND y derecho si va a 3,3 V. Si conectas en común las líneas SCK, WS y SD de dos INMP441 y configuras uno como izquierdo y otro como derecho, obtienes audio estéreo por un solo bus I2S. No dejes el pin al aire; las lecturas saldrán en cero o inestables.

¿Se puede grabar audio con el INMP441?

Sí. Si reduces las muestras de 24 a 16 bits y las escribes en una tarjeta SD con una cabecera WAV, obtienes una grabación que se puede escuchar en el ordenador. Un muestreo de 16 kHz basta para la voz; un minuto de grabación mono de 16 bits ocupa unos 1,9 MB.

¿Qué precisión tiene la medición de decibelios con el INMP441?

El cálculo con la sensibilidad de −26 dBFS de la hoja de datos da un resultado dentro de unos pocos dB incluso sin calibrar; la tolerancia de sensibilidad de los micrófonos es de ±1 dB. Como el cálculo no tiene ponderación A, en ambientes con mucho zumbido de baja frecuencia puede salir más alto que en un sonómetro. Si calibras con una fuente de sonido conocida, obtienes muy buenos resultados para el ruido de una habitación, pero no sustituye a un instrumento de medición oficial.

¿Qué me conviene comprar, INMP441 o KY-038?

Si solo vas a detectar palmadas o un sonido fuerte para activar algo, el KY-038 basta y funciona con cualquier placa. Si quieres medir el nivel de sonido en dB, grabar audio, analizar frecuencias o hacer luces que reaccionen a la música, el INMP441 da un resultado mucho más limpio y preciso.

¿Por qué el INMP441 siempre lee 0 en el ESP32?

Las causas más habituales son el pin L/R al aire, un canal en el código que no coincide con la configuración del micrófono y el cable SD conectado al pin equivocado. Primero conecta L/R a GND y luego prueba cambiando el canal del código a derecho. Comprueba también que el ancho de bits sea de 32 bits y que el módulo esté alimentado con 3V3.

Ver todos los proyectos
LED Parpadeante con ESP32
#103Principiante

LED Parpadeante con ESP32

Enseña el uso básico de la salida GPIO con ESP32. Conseguimos un efecto de parpadeo encendiendo y apagando un LED desde el pin digital. Versión para ESP32 del clásico proyecto blink en Arduino UNO; los comandos básicos de blink en el entorno Arduino son los mismos, pero la distribución de pines y los niveles GPIO de 3,3 V del ESP32 difieren de los del Arduino UNO.

4.7(37)
100
Uso del zumbador
#13Principiante

Uso del zumbador

¿Alguna vez te has preguntado cómo suena un timbre o una alarma? El Arduino hace pitar un pequeño zumbador a intervalos cortos: pip, silencio, pip, silencio. Ves cómo se crea sonido con electricidad y

4.7(89)
162
ESP32 LED Fade con PWM
#110Principiante

ESP32 LED Fade con PWM

Cambiar el brillo del LED suavemente de 0 a max, de max a 0. Controlamos PWM con analogWrite() como en Arduino - la misma sintaxis con ESP32 Arduino Core 3.0+ funciona sin problemas. Pin definición + pinMode + analogWrite es suficiente.

4.8(36)
55
ESP32 Reproducción de melodías con zumbador
#114Principiante
Premium

ESP32 Reproducción de melodías con zumbador

Tocando una melodía simple (Twinkle Twinkle Little Star) con un zumbador pasivo. Tocamos las notas con las funciones tone() y noTone() como en Arduino - la misma sintaxis funciona con ESP32 Arduino Core 3.0+. Se debe utilizar un zumbador pasivo (el zumbador activo no reproduce la melodía).

4.8(30)
55
Control de la tira NeoPixel WS2812B con ESP32
#126Intermedio
Premium

Control de la tira NeoPixel WS2812B con ESP32

Los LED direccionables WS2812B (NeoPixel) son LED RGB inteligentes que se pueden controlar en cadena a través de un único pin de datos. En este proyecto, controlaremos una tira de 8 LED WS2812B con la biblioteca Adafruit_NeoPixel para crear una animación fluida de arcoíris. Aunque el nivel lógico de 3,3 V del ESP32 funciona sin problemas en la mayoría de los componentes WS2812B, mostraremos la solución de una resistencia en serie de 470 Ω y un condensador de 1000 µF en caso de inestabilidad. La

4.9(19)
30
Servidor web asíncrono ESP32 (con indicación de IP en la pantalla LCD)
#129Avanzado

Servidor web asíncrono ESP32 (con indicación de IP en la pantalla LCD)

En este proyecto, convertimos el ESP32 en un servidor web asíncrono que puedes controlar desde tu teléfono o tu ordenador, siempre que estén conectados a la misma red Wi-Fi. Gracias a la biblioteca ESPAsyncWebServer, el servidor puede procesar varias solicitudes al mismo tiempo (a diferencia del clásico WebServer.h, que se bloquea con una sola solicitud).

4.8(16)
26
Contador ESP32 WebSocket (2 botones + pantalla LCD + web en tiempo real)
#130Avanzado
Premium

Contador ESP32 WebSocket (2 botones + pantalla LCD + web en tiempo real)

En este proyecto, dos botones conectados al ESP32 (GPIO 5 suma, GPIO 4 resta) cambian un contador. El valor se actualiza al instante en una pantalla LCD I2C de 16x2 y, gracias al soporte WebSocket de ESPAsyncWebServer, en todos los navegadores conectados sin recargar la página. En lugar del sondeo HTTP se usa una única conexión persistente y el ESP32 envía el nuevo valor a todos con ws.textAll().

4.5(14)
23
ESP32 HTTPClient + API del tiempo (con pantalla OLED SSD1306)
#134Avanzado
Premium

ESP32 HTTPClient + API del tiempo (con pantalla OLED SSD1306)

En este proyecto, utilizamos el ESP32 para realizar una llamada a la API REST de la información meteorológica (wttr.in) a través de Internet, utilizando HTTPClient.h. A diferencia de la versión anterior con pantalla LCD I2C, aquí utilizamos una pantalla OLED SSD1306 (128×64), lo que permite utilizar fuentes grandes, iconos vectoriales y una presentación visual muy rica en una sola pantalla. Para indicar el tiempo, se dibujan en tiempo de ejecución 7 iconos vectoriales diferentes (soleado, parc

4.3(10)
20