In questo tutorial imparerai a rilevare il suono con un microfono MAX4466 e un Arduino o ESP32. Useremo il MAX4466 per misurare il livello sonoro, accendere un LED se è troppo forte e controllare un dispositivo, ad esempio una lampada, con gli applausi.
Cominciamo con i componenti necessari.
Componenti richiesti
Ti serviranno un Arduino, ESP32, ESP8266 o un microcontrollore simile e il modulo microfono MAX4466. Per realizzare gli esempi avrai inoltre bisogno di un modulo relè, dei cavi, resistori e LED.

Arduino Uno

Microfono MAX4466

Modulo relè

Set di cavi Dupont

Breadboard

Cavo USB per Arduino UNO

Kit di resistori & LED
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.
Caratteristiche del modulo microfono MAX4466
Il modulo microfono MAX4466 è una scheda breakout con un microfono elettrete 20-20KHz e il MAX4466 IC preamplificatore. Sul retro della scheda c’è un piccolo trimmer che permette di regolare il guadagno da 25x a 125x. La foto qui sotto mostra il fronte e il retro della scheda:

Il modulo funziona a 2.4…5.5V con una corrente di alimentazione a riposo molto bassa di <24μA. Per ottenere buone prestazioni, usa l’alimentazione più ‘silenziosa’ disponibile. Questo sarebbe il pin 3.3V di un Arduino o ESP32.
Nota che la tensione massima in uscita sul pin OUT va da 0 V a VCC. Se colleghi l’uscita all’Analog-Digital-Converter (ADC) del tuo microcontrollore assicurati che possa gestire la tensione massima in uscita! L’uscita avrà un offset di VCC/2. Quindi, quando è completamente silenzioso, la tensione di uscita sarà VCC/2 V.
Per maggiori dettagli tecnici consulta il Datasheet del MAX4466 linkato qui sotto:
Collegare il MAX4466 a Arduino/ESP32
Collegare il modulo MAX4466 a un Arduino UNO è semplice. Collega GND a GND, VCC a 3.3V e il pin di uscita OUT del MAX4466 all’ingresso analogico A0 come mostrato sotto:

Potresti anche collegare il pin VCC del modulo MAX4466 a 5V e otterresti una migliore risoluzione sull’ingresso analogico A0, ma l’ingresso risulterebbe un po’ più rumoroso.
Se usi un ESP32 devi alimentare il modulo MAX4466 a 3.3V, poiché la massima uscita del modulo dipende da VCC e con 5V di alimentazione la tensione sull’ingresso analogico sarebbe troppo alta!
Esempi di codice
Nelle sezioni seguenti trovi tre esempi di codice su come usare il MAX4466.
Codice: Visualizzare le misurazioni del MAX4466
In questo primo esempio mostriamo le letture del MAX4466 sul Serial Monitor o sul Plotter:
const byte micPin = A0;
void setup() {
Serial.begin(115200);
pinMode(micPin, INPUT);
}
void loop() {
int value = analogRead(micPin);
Serial.println(value);
delay(100);
}
Il codice è molto semplice. Per prima cosa definiamo il pin a cui è collegato il microfono MAX4466 (micPin = A0).
Nella setup funzione inizializziamo la comunicazione seriale e dichiariamo il micPin come input. Nella funzione loop leggiamo il segnale del microfono da micPin e stampiamo il valore misurato dal sensore sul serial monitor.
Il plot seguente mostra l’uscita sul Serial Plotter quando si battono le mani tre volte. Si possono vedere chiaramente i tre picchi nel segnale nel grafico:

Ho usato un ESP32 per questo plot, che offre una risoluzione migliore sull’ingresso analogico. Se usi un Arduino UNO vedrai valori tra 0 e 1024 sull’asse y.
Nota che il segnale a silenzio completo è circa la metà del massimo dell’ingresso analogico. Nel caso dell’ESP32, dove l’ingresso analogico ha una risoluzione da 0 a 4095, il valore è approssimativamente intorno a 2000. Nel caso di un Arduino UNO il valore a silenzio sarà circa 500.
Se guardi di nuovo il grafico noterai che i picchi possono essere positivi e negativi. Questo perché il microfono MAX4466 misura essenzialmente la variazione di pressione dell’aria causata da un suono. A seconda del punto della funzione d’onda in cui viene presa la misura, la pressione può essere bassa o alta.
Questo significa che, se vogliamo misurare l’intensità del suono, non possiamo prendere solo il valore massimo ma dobbiamo calcolare la differenza rispetto alla linea di base (silenzio). Ed è proprio quello che faremo nel prossimo esempio per controllare un LED.
Codice: Accendere un LED se il suono è troppo forte
In questo esempio accenderemo un LED se il microfono rileva un suono forte. Di seguito lo schema di collegamento. È lo stesso di prima con l’aggiunta di un LED collegato al pin 11. Nota che avrai bisogno di un resistore da 220 Ω per il LED per limitare la corrente.

Il codice seguente legge il segnale del microfono, calcola un valore di intensità sonora e se l’intensità supera una certa soglia accende il LED per un secondo:
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);
}
Il codice inizia definendo i pin per il microfono e il LED, e la soglia di intensità. Nella funzione setup dichiariamo il pin del microfono come input e il pin del LED come output.
Nella setup funzione dichiariamo una variabile statica last che tiene traccia del last (valore precedente) registrato dal microfono. Calcolando la differenza assoluta abs tra il last e il valore attuale value, otteniamo una misura dell’intensità sonora:
int loudness = abs(last-value);
Se abbiamo un last valore e il loudness è maggiore della threshold, accendiamo il LED per un secondo e poi lo spegniamo di nuovo:
if (last && loudness > threshold) {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
}
Puoi regolare quanto deve essere forte un suono per attivare il LED modificando la soglia. Una soglia più bassa rende il rilevamento più sensibile, per esempio. Allo stesso modo, puoi cambiare il delay per accendere il LED per un tempo più lungo o più breve.
Questo circuito è adatto come semplice luce senza contatto o sistema d’allarme che attiva una lampada quando viene rilevato un suono.
Codice: Controllare un relè/luce con gli applausi
In questo esempio attiviamo un relè quando viene rilevato il primo applauso e lo disattiviamo al secondo applauso. Di seguito lo schema di collegamento per questo esempio. Sostituisce essenzialmente il LED dell’esempio precedente con un relè.

Il pin DC+ (VCC) del relè è collegato a 5V e il pin DC- (GND) è collegato a GND. Il pin di ingresso IN è collegato al pin 11 dell’Arduino.
Il relè può essere usato per commutare dispositivi ad alta tensione e corrente come una lampada, come mostrato nel circuito.Fai molta attenzione quando lavori con tensioni di 110 o 220 V!Assicurati anche che il tuo relè sia classificato per sopportare la potenza dei dispositivi che vuoi controllare.
Se vuoi saperne di più sui relè dai un’occhiata al nostro How To Use A Relay With Arduino o al Interfacing a Relay Module With ESP32 tutorial. Anche il tutorial su How To Control a Fan using Arduino potrebbe essere utile.
Di seguito il codice per questo esempio. Come prima misura l’intensità sonora ma tiene anche traccia del state del relè (HIGH o LOW). Se il loudnes supera la threshold il state dello stato del relè viene cambiato. Questo significa che battendo le mani due volte, per esempio, prima il relè si accende e poi si spegne. Non c’è più un tempo di attivazione fisso, come nell’esempio precedente.
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);
}
Per il resto il codice è praticamente identico all’esempio precedente. L’unica differenza è la gestione dell’evento quando l’intensità supera la soglia. In questo caso lo stato del relè viene invertito e il nuovo stato viene scritto sull’uscita digitale:
if (last && loudness > threshold) {
state = state == HIGH ? LOW : HIGH;
digitalWrite(relayPin, state);
value = 0;
delay(100);
}
Come prima, puoi modificare il livello sonoro necessario per attivare il relè regolando il threshold parametro.
Conclusioni
Questo articolo ha introdotto il modulo microfono MAX4466 per rilevare il suono con Arduino, ESP32 o microcontrollori simili.
Abbiamo usato il MAX4466 per misurare l’intensità del suono, accendere un LED per un periodo fisso se il suono supera una certa soglia, e commutare un relè con gli applausi. Se hai domande, sentiti libero di lasciarle nella sezione commenti.
Buon smanettamento ; )

