En este tutorial aprenderás a detectar sonido con un micrófono MAX4466 y un Arduino o ESP32. Usaremos el MAX4466 para medir la intensidad sonora, encender un LED si el sonido es demasiado fuerte y controlar un dispositivo como una lámpara con palmadas.
Comencemos con las piezas necesarias.
Piezas necesarias
Necesitarás un Arduino, ESP32, ESP8266 o un microcontrolador similar y el módulo de micrófono MAX4466. Para construir los ejemplos de aplicación también necesitarás un módulo relé, algunos cables, resistencias y LEDs.

Arduino Uno

Micrófono MAX4466

Módulo Relé

Juego de cables Dupont

Protoboard

Cable USB para Arduino UNO

Kit de resistencias y LEDs
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Características del módulo de micrófono MAX4466
El módulo de micrófono MAX4466 es una placa breakout con un micrófono electret de 20-20KHz y el MAX4466 circuito integrado preamplificador. En la parte trasera de la placa hay un pequeño potenciómetro que permite ajustar la ganancia de 25x a 125x. La imagen a continuación muestra el frente y la parte trasera de la placa:

El módulo funciona con 2.4…5.5V con una corriente de alimentación en reposo muy baja de <24μA. Para un buen rendimiento, usa la fuente de alimentación más “silenciosa” disponible. Esto sería el pin de 3.3V de un Arduino o ESP32.
Ten en cuenta que el voltaje máximo de salida en el pin OUT va de 0 V a VCC. Si conectas la salida al convertidor analógico-digital (ADC) de tu microcontrolador, asegúrate de que pueda manejar el voltaje máximo de salida. La salida tendrá un sesgo de VCC/2. Así que cuando esté completamente en silencio, el voltaje de salida será VCC/2 V.
Para más detalles técnicos, consulta la hoja de datos del MAX4466 que está enlazada abajo:
Conexión del MAX4466 a Arduino/ESP32
Conectar el módulo MAX4466 a un Arduino UNO es fácil. Solo conecta GND a GND, VCC a 3.3V y el pin de salida OUT del MAX4466 a la entrada analógica A0 como se muestra a continuación:

También podrías conectar el pin VCC del módulo MAX4466 a 5V para obtener una mejor resolución en la entrada analógica A0, pero la señal de entrada sería un poco más ruidosa.
Si usas un ESP32, debes alimentar el módulo MAX4466 con 3.3V, ya que la salida máxima del módulo depende de VCC y con 5V de alimentación, el voltaje en la entrada analógica sería demasiado alto.
Ejemplos de código
En las siguientes secciones encontrarás tres ejemplos de código para usar el MAX4466.
Código: Mostrar mediciones del MAX4466
En este primer ejemplo mostramos las lecturas del MAX4466 en el Monitor Serial o Plotter:
const byte micPin = A0;
void setup() {
Serial.begin(115200);
pinMode(micPin, INPUT);
}
void loop() {
int value = analogRead(micPin);
Serial.println(value);
delay(100);
}
El código es muy simple. Primero definimos el pin donde está conectado el micrófono MAX4466 (micPin = A0).
En la función setupinicializamos la comunicación serial y declaramos el micPincomo entrada. En la función loop leemos la señal del micrófono desde el micPiny mostramos el valor medido en el monitor serial.
El siguiente gráfico muestra la salida en el Serial Plotter al aplaudir tres veces. Se pueden ver claramente los tres picos en la señal:

Usé un ESP32 para este gráfico, que tiene mejor resolución en la entrada analógica. Si usas un Arduino UNO, verás valores entre 0 y 1024 en el eje y.
Ten en cuenta que la señal en completo silencio está alrededor de la mitad del máximo de la entrada analógica. En el caso del ESP32, donde la entrada analógica tiene resolución de 0…4095, el valor está aproximadamente en 2000. En el Arduino UNO el valor en silencio será alrededor de 500.
Si observas el gráfico de nuevo, notarás que los picos pueden ser positivos y negativos. Esto se debe a que el micrófono MAX4466 mide esencialmente el cambio en la presión del aire causado por un sonido. Dependiendo del momento en que se tome la medición durante la onda sonora, puede ser presión baja o alta.
Esto significa que si queremos medir la intensidad de un sonido, no podemos tomar solo el máximo, sino que debemos calcular la diferencia con la línea base (silencio). Y esto es lo que haremos en el siguiente ejemplo para controlar un LED.
Código: Encender LED si el sonido es muy fuerte
En este ejemplo encenderemos un LED si el micrófono detecta un sonido fuerte. A continuación está el cableado. Es igual que antes, con la adición de un LED conectado al pin 11. Ten en cuenta que necesitarás una resistencia de 220 Ω para el LED para limitar la corriente.

El siguiente código lee la señal del micrófono, calcula un valor de intensidad y si la intensidad es mayor que un umbral dado, enciende el LED por un segundo:
const byte micPin = A0;
const byte ledPin = 11;
const int threshold = 100;
void setup() {
pinMode(micPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
static int last = 0;
int value = analogRead(micPin);
int loudness = abs(last-value);
if (last && loudness > threshold) {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
}
last = value;
delay(1);
}
El código comienza definiendo los pines para el micrófono y el LED, y el umbral de intensidad. En la función setup declaramos el pin del micrófono como entrada y el pin del LED como salida.
En la función setup declaramos una variable estática lastque guarda el valor last(anterior) que el micrófono registró. Calculando la diferencia absoluta absentre el lasty el valor actual value obtenemos una medida de la intensidad:
int loudness = abs(last-value);
Si tenemos un valor lasty el loudness es mayor que el threshold, encendemos el LED por un segundo y luego lo apagamos:
if (last && loudness > threshold) {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
}
Puedes ajustar qué tan fuerte debe ser el sonido para activar el LED cambiando el umbral. Un umbral más bajo hará que la detección sea más sensible, por ejemplo. De igual forma, puedes cambiar el retardo para mantener el LED encendido por más o menos tiempo.
Este circuito sería adecuado como un sistema simple de luz o alarma sin contacto que activa una lámpara cuando se detecta un sonido.
Código: Controlar relé/luz con palmadas
En este ejemplo activamos un relé cuando se detecta la primera palmada y lo desactivamos con la segunda palmada. A continuación está el cableado para este ejemplo. Básicamente reemplaza el LED del ejemplo anterior por un relé.

El pin DC+ (VCC) del relé está conectado a 5V y el pin DC- (GND) está conectado a GND. El pin de entrada IN está conectado al pin 11 del Arduino.
El relé puede usarse para controlar dispositivos de alto voltaje y corriente como una lámpara, como se muestra en el circuito. ¡Ten mucho cuidado al trabajar con voltajes de 110 o 220 V! También asegúrate de que tu relé tenga la capacidad adecuada para los dispositivos que quieres controlar.
Si quieres aprender más sobre relés, echa un vistazo a nuestro How To Use A Relay With Arduino o al tutorial Interfacing a Relay Module With ESP32. También puede ser útil el tutorial sobre How To Control a Fan using Arduino.
A continuación está el código para este ejemplo. Como antes, mide la intensidad pero también lleva un registro del state del relé (HIGH o LOW). Si el loudnes supera el threshold, el state del relé cambia. Esto significa que aplaudir dos veces, por ejemplo, primero enciende el relé y luego lo apaga. Ya no hay un tiempo fijo de encendido como en el ejemplo anterior.
const byte micPin = A0;
const byte relayPin = 11;
const int threshold = 100;
void setup() {
pinMode(micPin, INPUT);
pinMode(relayPin, OUTPUT);
}
void loop() {
static uint8_t state = LOW;
static int last = 0;
int value = analogRead(micPin);
int loudness = abs(last-value);
if (last && loudness > threshold) {
state = state == HIGH ? LOW : HIGH;
digitalWrite(relayPin, state);
value = 0;
delay(100);
}
last = value;
delay(1);
}
Por lo demás, el código es prácticamente idéntico al ejemplo anterior. La única diferencia es el manejo del evento cuando la intensidad supera el umbral. En este caso, el estado del relé se invierte y el nuevo estado se escribe en la salida digital:
if (last && loudness > threshold) {
state = state == HIGH ? LOW : HIGH;
digitalWrite(relayPin, state);
value = 0;
delay(100);
}
Como antes, puedes cambiar el nivel de sonido necesario para activar el relé ajustando el parámetro threshold.
Conclusiones
Este artículo presentó el módulo de micrófono MAX4466 para detectar sonido con un Arduino, ESP32 o microcontroladores similares.
Usamos el MAX4466 para medir la intensidad del sonido, encender un LED por un tiempo fijo si el sonido supera un umbral y controlar un relé con palmadas. Si tienes alguna pregunta, no dudes en dejarla en la sección de comentarios.
¡Feliz bricolaje ; )

