Componenti · 11 min di lettura

Microfono I2S INMP441 ESP32: leggere audio, misurare dB e onda

Collega il microfono I2S INMP441 all'ESP32: tabella pin, lettura audio a 24 bit, calcolo dei dB, onda sul Serial Plotter e codice per Raspberry Pi Pico.

L'INMP441 è un piccolo modulo con microfono MEMS che converte il suono in digitale al suo interno e invia campioni a 24 bit direttamente tramite il bus I2S. La coppia INMP441 ESP32 è il modo più semplice per ottenere un audio pulito senza microfono analogico, amplificatore e ADC. Collega il modulo all'ESP32 con sei fili, acquisisci 16 000 campioni al secondo con poche righe di codice I2S, calcola dai campioni il livello sonoro dell'ambiente in decibel (dB) e guarda l'onda sonora dal vivo sul Serial Plotter.

In questa guida vedrai passo dopo passo come funziona l'INMP441, a cosa servono le tre linee dell'I2S, un codice pronto che compila sia con il core Arduino per ESP32 2.x sia con il 3.x, la differenza tra dBFS e dB SPL e la formula di un vero fonometro. Alla fine troverai l'uso con Raspberry Pi Pico e MicroPython, la differenza rispetto al economico sensore sonoro KY-038 e gli errori di collegamento più comuni.

Scheda di sviluppo ESP32 per leggere il microfono INMP441
Per leggere l'INMP441 serve una scheda con hardware I2S: l'ESP32 ha due unità I2S e i segnali possono essere instradati su qualsiasi GPIO.

Cos'è l'INMP441 e come funziona?

L'INMP441 è un microfono MEMS omnidirezionale prodotto da TDK InvenSense. MEMS significa un piccolo condensatore formato da una membrana microscopica e una piastra fissa ricavate dal silicio: quando l'onda sonora fa vibrare la membrana, la capacità cambia. In un microfono a elettrete classico questa variazione esce come una debole tensione analogica che devi amplificare, filtrare e misurare con un ADC. Dentro l'INMP441 invece ci sono preamplificatore, filtro anti-aliasing, ADC sigma-delta a 24 bit e interfaccia I2S. Quindi dal microfono non esce più una tensione, ma numeri che arrivano seguendo un segnale di clock. In questo modo sul cavo non si accumula rumore analogico, la qualità dell'ADC della scheda perde importanza e qualsiasi microcontrollore a 3,3 V ottiene la stessa qualità audio. Il piccolo foro sul modulo è l'ingresso del suono: se monti la scheda in una scatola, fai attenzione a non coprirlo.

CaratteristicaValore
TipoMicrofono MEMS omnidirezionale a uscita digitale
InterfacciaI2S, 24 bit, MSB first, complemento a due
Alimentazione1,8–3,3 V
CorrenteCirca 1,4 mA
Sensibilità−26 dBFS (1 kHz, 94 dB SPL)
Rapporto segnale/rumore (SNR)61 dBA
Risposta in frequenza60 Hz – 15 kHz
Pressione sonora massima (AOP)120 dB SPL
Frequenza SCKCirca 0,5–3,2 MHz (campionamento circa 7,8–50 kHz)
Pin del moduloVDD, GND, SD, L/R, WS, SCK

Cos'è l'I2S? Audio digitale con tre linee

L'I2S (Inter-IC Sound) è un bus seriale sviluppato per trasportare campioni audio tra i chip e, nonostante il nome simile, non ha nulla a che fare con l'I2C. Ha tre linee: SCK (bit clock) indica quando leggere ogni bit di dati, WS (word select, detta anche LRCLK) indica se in quel momento viene inviato il canale sinistro o destro, SD è il dato vero e proprio. In questa configurazione l'ESP32 è il master: genera entrambi i clock e il microfono, seguendo il clock, mette i dati sulla linea SD. Nell'INMP441 ogni frame è composto da 64 impulsi SCK: 32 bit per il canale sinistro e 32 bit per il destro. Per questo la frequenza di campionamento è SCK / 64; per 16 kHz l'ESP32 genera un bit clock di circa 1,024 MHz. Il microfono scrive la misura a 24 bit nello slot a 32 bit del proprio canale, partendo dal bit più significativo; gli 8 bit restanti sono zero. Ecco perché nel codice spostiamo il valore di 8 bit a destra.

Pin INMP441Funzione
VDDAlimentazione, 1,8–3,3 V
GNDMassa
SCKIngresso bit clock (arriva dalla scheda)
WSIngresso clock di selezione canale (arriva dalla scheda)
SDUscita dati audio seriali (dal microfono alla scheda)
L/RSelezione canale: GND = canale sinistro, VDD = canale destro

Collegamento dei pin INMP441: ESP32 e Raspberry Pi Pico

Pin INMP441ESP32Raspberry Pi Pico
VDD3V33V3(OUT) (pin 36)
GNDGNDGND
SCKGPIO 32GP16
WSGPIO 25GP17
SDGPIO 33GP18
L/RGNDGND
Non collegare mai l'INMP441 a 5 V: il limite assoluto di alimentazione è circa 3,6 V e i 5 V possono danneggiare il microfono in modo permanente. Per lo stesso motivo Arduino Uno e Nano non sono adatti a questo modulo: queste schede non hanno hardware I2S, lavorano con logica a 5 V e 2 KB di RAM non bastano per un buffer audio. Il secondo errore frequente è lasciare il pin L/R scollegato: un pin flottante rende il canale indeterminato e le letture risultano zero o casuali.

Sull'ESP32 i segnali I2S possono essere instradati su qualsiasi pin tramite la matrice GPIO; i numeri 32, 25 e 33 della tabella non sono obbligatori, sono solo scelte sicure. Evita però i pin di strapping che determinano il comportamento della scheda all'avvio (GPIO 0, 2, 5, 12, 15) e i GPIO 6–11 riservati alla memoria flash. I GPIO 34–39 sono solo ingressi, quindi vanno bene per la linea SD ma non si possono usare per SCK e WS. Sul Pico la regola è diversa: il driver I2S di MicroPython usa il PIO e il pin WS deve essere il pin SCK più uno (come GP16 e GP17). Tieni i cavi sotto i 10–15 cm; un clock nell'ordine dei megahertz si deteriora sui jumper lunghi. Puoi controllare la piedinatura della tua scheda con lo strumento mappa dei pin.

Passo dopo passo: la prima lettura audio con ESP32

  1. Assicurati che il pacchetto schede ESP32 sia installato nell'IDE Arduino e scegli ESP32 Dev Module da Strumenti > Scheda. Se non sai come installarlo, leggi l'articolo Cos'è l'ESP32?.
  2. Inserisci il modulo nella breadboard; collega VDD a 3V3, GND a GND e anche L/R a GND.
  3. Collega SCK al GPIO 32, WS al GPIO 25 e SD al GPIO 33, tenendo i cavi corti.
  4. Carica il codice qui sotto. Non serve nessuna libreria aggiuntiva: ESP_I2S nel core 3.x e driver/i2s.h nel core 2.x sono già inclusi nel pacchetto schede.
  5. Apri il Monitor Seriale a 115200 baud; in una stanza silenziosa dovresti vedere valori intorno a 35–50 dB, mentre parli circa 55–70 dB.
  6. Apri Strumenti > Serial Plotter per seguire dal vivo le curve dBFS e dB SPL; batti le mani vicino al microfono e guarda la curva schizzare.

Codice ESP32: misurare il livello sonoro (dB) con l'INMP441

Il codice controlla la versione del core Arduino per ESP32 con ESP_ARDUINO_VERSION_MAJOR. Nella versione 3.x usa la nuova libreria ESP_I2S, nella 2.x il driver I2S classico di ESP-IDF. Poiché entrambi i percorsi offrono le stesse funzioni micBegin() e micRead(), il calcolo dentro loop() non cambia. A ogni ciclo vengono letti 512 campioni, cioè 32 ms di audio a 16 kHz, si rimuove l'offset DC, si calcola il valore RMS e lo si converte in decibel.

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}
Parte del codiceCosa fa?
SAMPLE_RATE = 16000Acquisisce 16 000 campioni al secondo; la frequenza SCK diventa 16 000 × 64 = 1,024 MHz. Basta per la voce; per la musica puoi scegliere 44 100 (SCK circa 2,82 MHz).
Larghezza dati a 32 bitL'INMP441 si aspetta 64 impulsi SCK per ogni frame WS; se scegli 16 bit il frame si accorcia e i dati perdono senso.
MONO + LEFT / ONLY_LEFTViene letto solo il canale sinistro; poiché il pin L/R è a GND, il microfono usa lo slot sinistro.
samples[i] >>= 8Estrae la misura a 24 bit dallo slot a 32 bit; il valore va da −8 388 608 a +8 388 607.
Sottrazione della mediaElimina il piccolo offset DC del segnale; altrimenti l'RMS risulta più grande del dovuto.
rmsRadice quadrata della media dei quadrati dei campioni; rappresenta la potenza media del suono.
dbfs + DB_OFFSETConverte il risultato in dB SPL usando la sensibilità del datasheet di −26 dBFS a 94 dB SPL.

Come si calcola il livello sonoro? dBFS e dB SPL

Poiché la pressione sonora varia in un intervallo molto ampio, si usa la scala logaritmica dei decibel: raddoppiare l'ampiezza equivale a circa +6 dB, moltiplicarla per dieci a +20 dB. I numeri forniti dal microfono vengono prima convertiti in dBFS (decibel rispetto al fondo scala): dBFS = 20 × log10(RMS / RMS di fondo scala). Il fondo scala è l'RMS di una sinusoide il cui picco raggiunge il massimo valore a 24 bit, 8 388 608, cioè 8 388 608 / √2 ≈ 5 931 642. In questa scala 0 dBFS è il limite di saturazione del microfono e ogni suono più debole ha un valore negativo. Per passare alla pressione sonora fisica, cioè ai dB SPL, si usa la sensibilità del datasheet: l'INMP441 restituisce un suono a 1 kHz di 94 dB SPL come −26 dBFS. Da qui si ricava la formula dB SPL = dBFS + 94 − (−26) = dBFS + 120. Per esempio, se l'RMS risulta 5 932, dBFS = 20 × log10(0,001) = −60 e il livello sonoro è circa 60 dB SPL, cioè una normale conversazione.

Sorgente sonoradB SPL circadBFS sull'INMP441
Rumore di fondo del microfono stesso33−87
Stanza silenziosa40−80
Conversazione normale (1 m)60−60
Traffico intenso, aspirapolvere70–80da −50 a −40
Rischio per l'udito con esposizione prolungata85−35
Riferimento di misura (calibratore)94−26
Trapano, davanti al palco di un concerto100–110da −20 a −10
Limite superiore del microfono (AOP)1200
Questa formula si basa solo sul valore del datasheet; la sensibilità può variare di ±1 dB da microfono a microfono e il calcolo non è pesato A. Per un risultato più preciso misura un suono costante (per esempio un tono a 1 kHz) contemporaneamente con l'INMP441 e con un fonometro o un'app per smartphone, poi somma o sottrai la differenza al numero 120 nel codice. Per rendere i valori più stabili fai la media delle ultime misure; la media mobile descritta nell'articolo filtraggio dei dati dei sensori è utile anche qui.

Disegnare la forma d'onda sul Serial Plotter

Il valore in decibel ti dice quanto è forte il suono; per vederne la forma devi tracciare i campioni grezzi. Nello stesso sketch sostituisci solo la funzione loop() con quella qui sotto. C'è un limite importante: una linea seriale a 115200 baud trasporta circa 11 500 caratteri al secondo e non basta per stampare 16 000 campioni al secondo. Per questo il codice stampa di seguito un blocco di 512 campioni; l'audio che arriva mentre il blocco viene scritto va perso, ma ogni tratto che vedi nel plotter è un vero segmento continuo di 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}

Se fischi nel microfono vedrai nel plotter una sinusoide quasi regolare. In un fischio a 1 kHz un periodo dura 1 ms e corrisponde a 16 punti con campionamento a 16 kHz; contando i punti di un periodo puoi stimare la frequenza. La voce è un miscuglio di molte frequenze e disegna un'onda irregolare con un inviluppo; un applauso produce un picco breve e molto alto. Poiché il plotter scala l'asse automaticamente, in silenzio le piccole oscillazioni di rumore possono sembrare grandi: è normale. Per i dettagli sull'uso di Monitor Seriale e Serial Plotter consulta l'articolo Arduino Serial Monitor.

Raspberry Pi Pico con INMP441 (MicroPython)

Il Raspberry Pi Pico non ha un'unità I2S dedicata, ma i blocchi PIO programmabili emulano l'I2S a velocità hardware e la classe machine.I2S di MicroPython fa il lavoro al posto tuo. Non serve installare file aggiuntivi: basta una versione recente di MicroPython. Nel codice si scelgono bits=32 e format=I2S.MONO, i campioni letti vengono di nuovo spostati di 8 bit a destra e convertiti in decibel con la stessa formula. Poiché i cicli Python sono più lenti del C, mantenere il blocco a 512 campioni è un buon compromesso; perdere qualche millisecondo di audio durante il calcolo non influisce molto sul risultato. Se programmi il Pico con l'IDE Arduino, anche la libreria I2S del core arduino-pico fa lo stesso lavoro; anche lì il pin WS (LRCLK) deve essere il pin BCLK più uno. Se sei nuovo di MicroPython, dai prima un'occhiata a Cos'è il 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))

Differenza tra INMP441 e sensore sonoro analogico KY-038

Modulo sensore sonoro analogico KY-038
KY-038: sensore sonoro analogico con capsula a elettrete, trimmer per la soglia e comparatore LM393.

Il KY-038 è un modulo economico composto da una capsula microfonica a elettrete, un trimmer per regolare la soglia e un comparatore LM393. L'uscita digitale (DO) cambia stato quando il suono supera la soglia impostata; l'uscita analogica (AO) fornisce la tensione grezza della capsula e si legge con l'ADC della scheda. Questa struttura basta per rilevare un applauso o capire se nell'ambiente c'è rumore. Ma poiché il modulo non ha amplificatore, il segnale è molto debole: l'ADC a 10 bit dell'Arduino Uno vede appena qualche gradino di variazione con la voce e anche l'ADC dell'ESP32 è rumoroso. L'INMP441 invece esegue la misura a 24 bit dentro il microfono; senza cavo analogico, amplificatore o ADC in mezzo, registra in modo pulito un intervallo di circa 87 dB dal rumore di fondo al limite di saturazione. In breve, il KY-038 è un interruttore sonoro, l'INMP441 è un vero microfono. I limiti della lettura analogica li trovi in dettaglio nella guida all'ADC.

CaratteristicaINMP441KY-038
Tipo di microfonoMEMS, uscita digitaleCapsula a elettrete, analogico
UscitaI2S, campioni a 24 bitAO tensione analogica + DO uscita a soglia
Alimentazione1,8–3,3 V3,3–5 V
Schede compatibiliESP32, Pico e schede con I2SQualsiasi scheda, Uno compreso
Qualità audioAdeguata per registrazione e analisi (60 Hz – 15 kHz)Solo livello approssimativo
Misura dei dBPossibile con la formulaNon affidabile
Uso tipicoFonometro, registrazione audio, FFT, comandi vocaliInterruttore a applauso, allarme suono presente/assente

Idee di progetto con l'INMP441

  • LED reattivo alla musica: trasforma il livello sonoro nel numero di LED accesi su una striscia WS2812B; per i dettagli guarda gli articoli LED reattivo alla musica e WS2812B NeoPixel.
  • Semaforo del rumore in classe: realizza una lampada che si accende verde sotto i 55 dB, gialla tra 55 e 70 dB e rossa oltre.
  • Pannello del rumore dal vivo sul web: invia il valore in dB al browser con WebSocket e seguilo come grafico dal telefono; la struttura di base è nell'articolo ESP32 Web Server e WebSocket.
  • Sensore di rumore per la casa intelligente: invia le misure a Home Assistant tramite MQTT; la guida ESP32 MQTT e Home Assistant ti semplifica il lavoro.
  • Avviso di pianto del bambino o abbaio del cane: se il suono supera la soglia per un certo tempo, manda un messaggio al telefono con un bot Telegram.
  • Registratore audio: scrivi i campioni come file WAV a 16 bit su un modulo scheda SD e ascoltali sul computer.
  • Controllo con il fischio: trova la frequenza dominante con la FFT e attiva un LED o un relè con un certo tono di fischio.

Errori comuni e come risolverli

SintomoCausa probabileSoluzione
Il valore dB SPL resta fisso intorno a −15,5Dalla linea SD non arrivano dati, tutti i campioni sono 0Controlla il cavo SD e che L/R sia a GND; se non basta, passa al canale destro (I2S_STD_SLOT_RIGHT nel 3.x, I2S_CHANNEL_FMT_ONLY_RIGHT nel 2.x)
Quando il suono aumenta il valore non sale, salta a casoSCK e WS sono scambiati o i cavi sono troppo lunghiCorreggi i pin secondo la tabella, porta i cavi sotto i 10–15 cm
All'avvio errore "CONFLICT! The new i2s driver can't work along with the legacy i2s driver"Nel core 3.x sono usati insieme il vecchio driver/i2s.h e il nuovo driverUsa un solo driver; la struttura #if del codice sceglie automaticamente quello giusto
I valori dB differiscono di 10–20 dB dal fonometroSpostamento di bit sbagliato, DC non rimosso o calibrazione non fattaImposta lo spostamento a 8 bit, sottrai la media, calibra con un tono costante
ValueError creando l'I2S sul PicoIl pin WS non è il pin SCK più unoUsa pin consecutivi, come SCK = GP16, WS = GP17
Il microfono si scalda o non risponde affattoVDD è stato collegato a 5 VPassa subito a 3V3; il microfono potrebbe essersi danneggiato, prova con uno nuovo
Nel Serial Plotter l'onda appare a trattiLa linea seriale non riesce a trasportare 16 000 campioni al secondoÈ normale; per una visualizzazione più fluida porta il baud rate a 921600
Il modo più rapido per testare il collegamento è caricare il codice dei dB e soffiare leggermente nel microfono. Se il valore gira sui 40 e soffiando supera i 90, tutto è corretto. Se resta fermo intorno a −15,5, i dati non arrivano; prima di lavorare sul codice controlla i cavi L/R e SD.

Con pochi cavi e un breve codice, l'INMP441 dà all'ESP32 un vero microfono digitale ed è la base di molti progetti, dalla misura del livello sonoro alle luci reattive alla musica. Ogni volta che vuoi elaborare il suono come numeri invece di accontentarti di un sensore analogico, è la prima scelta. Nell'app BlueGrays trovi passo dopo passo, con schema elettrico e codice, progetti ESP32 con LED, buzzer, strisce WS2812B e web server, a cui puoi aggiungere facilmente questo microfono.

Domande frequenti

L'INMP441 funziona con Arduino Uno?

No, in pratica non funziona. Arduino Uno e Nano non hanno hardware I2S, lavorano con logica a 5 V e i 2 KB di RAM non bastano per un buffer audio. Per l'INMP441 devi usare un ESP32, un ESP32-S3, un Raspberry Pi Pico o un'altra scheda a 3,3 V con supporto I2S.

A cosa serve il pin L/R dell'INMP441?

Il pin L/R seleziona quale canale del frame stereo usa il microfono: sinistro se è collegato a GND, destro se è collegato a 3,3 V. Se colleghi in comune le linee SCK, WS e SD di due INMP441 e ne imposti uno a sinistra e l'altro a destra, ottieni audio stereo da un'unica linea I2S. Non lasciare il pin scollegato: le letture risultano zero o instabili.

Si può registrare audio con l'INMP441?

Sì. Se riduci i campioni da 24 a 16 bit e li scrivi su scheda SD con un'intestazione WAV, ottieni una registrazione che si ascolta sul computer. Un campionamento a 16 kHz basta per la voce; un minuto di registrazione mono a 16 bit occupa circa 1,9 MB.

Quanto è precisa la misura dei decibel con l'INMP441?

Il calcolo con la sensibilità di −26 dBFS del datasheet dà un risultato entro pochi dB anche senza calibrazione; la tolleranza di sensibilità dei microfoni è di ±1 dB. Poiché il calcolo non è pesato A, in ambienti con molto rumore a bassa frequenza può risultare più alto del fonometro. Se calibri con una sorgente sonora nota ottieni ottimi risultati per il rumore di una stanza, ma non sostituisce uno strumento di misura ufficiale.

Devo comprare l'INMP441 o il KY-038?

Se devi solo rilevare un applauso o un suono forte per attivare qualcosa, il KY-038 basta e funziona con qualsiasi scheda. Se vuoi misurare il livello sonoro in dB, registrare audio, fare analisi in frequenza o luci reattive alla musica, l'INMP441 dà un risultato molto più pulito e preciso.

Perché l'INMP441 legge sempre 0 sull'ESP32?

Le cause più frequenti sono il pin L/R scollegato, il canale nel codice che non corrisponde all'impostazione del microfono e il cavo SD collegato al pin sbagliato. Collega prima L/R a GND, poi prova a cambiare il canale nel codice in destro. Verifica anche che la larghezza dei bit sia 32 bit e che il modulo sia alimentato a 3V3.

Vedi tutti i progetti
LED Lampeggiante con ESP32
#103Principiante

LED Lampeggiante con ESP32

Insegna l'uso di base delle uscite GPIO con l'ESP32. Otteniamo un effetto lampeggiante accendendo e spegnendo un LED dal pin digitale. Versione ESP32 del classico progetto blink su Arduino UNO; i comandi di base di blink nell'ambiente Arduino sono gli stessi, ma la disposizione dei pin e i livelli GPIO a 3,3 V dell'ESP32 sono diversi da quelli di Arduino UNO.

4.7(37)
100
Uso del cicalino
#13Principiante

Uso del cicalino

Ti sei mai chiesto come fa un campanello o un allarme a suonare? L'Arduino fa suonare un piccolo cicalino a intervalli brevi: bip, pausa, bip, pausa. Vedi come l'elettricità diventa suono e fai il pri

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

Dissolvenza LED ESP32 con PWM

Modificare la luminosità del LED in modo fluido da 0 a max, da max a 0. Controlliamo il PWM con analogWrite() come in Arduino - la stessa sintassi con ESP32 Arduino Core 3.0+ funziona senza problemi. La definizione del pin + pinMode + analogWrite è sufficiente.

4.8(36)
55
ESP32 Riproduzione di melodia con cicalino
#114Principiante
Premium

ESP32 Riproduzione di melodia con cicalino

Riproduzione di una semplice melodia (Twinkle Twinkle Little Star) con un buzzer passivo. Le note vengono riprodotte con le funzioni tone() e noTone() come in Arduino - la stessa sintassi funziona con ESP32 Arduino Core 3.0+. È necessario utilizzare un cicalino passivo (il cicalino attivo non riproduce la melodia).

4.8(30)
55
Controllo della striscia LED NeoPixel WS2812B con ESP32
#126Intermedio
Premium

Controllo della striscia LED NeoPixel WS2812B con ESP32

I LED indirizzabili WS2812B (NeoPixel) sono LED RGB intelligenti che possono essere controllati in cascata tramite un unico pin dati. In questo progetto controlleremo una striscia WS2812B da 8 LED utilizzando la libreria Adafruit_NeoPixel per creare un'animazione fluida dell'arcobaleno. Sebbene il livello logico a 3,3 V dell'ESP32 funzioni senza problemi con la maggior parte dei componenti WS2812B, in caso di instabilità mostreremo la soluzione con una resistenza in serie da 470 Ω e un condensat

4.9(19)
30
Server web asincrono ESP32 (con indicazione dell'IP sul display LCD)
#129Avanzato

Server web asincrono ESP32 (con indicazione dell'IP sul display LCD)

In questo progetto trasformiamo l'ESP32 in un server web asincrono che potrete controllare dal vostro telefono o computer collegato alla stessa rete Wi-Fi. Grazie alla libreria ESPAsyncWebServer, il server è in grado di elaborare più richieste contemporaneamente (a differenza del classico WebServer.h, che si blocca su una singola richiesta).

4.8(16)
26
Contatore WebSocket ESP32 (2 pulsanti + LCD + Web in tempo reale)
#130Avanzato
Premium

Contatore WebSocket ESP32 (2 pulsanti + LCD + Web in tempo reale)

In questo progetto due pulsanti collegati all'ESP32 (GPIO 5 incrementa, GPIO 4 decrementa) modificano un contatore. Il valore si aggiorna all'istante su un display LCD I2C 16x2 e, grazie al supporto WebSocket di ESPAsyncWebServer, in tutti i browser collegati senza ricaricare la pagina. Al posto del polling HTTP si usa un'unica connessione persistente e l'ESP32 invia il nuovo valore a tutti con ws.textAll().

4.5(14)
23
ESP32 HTTPClient + API meteo (con display OLED SSD1306)
#134Avanzato
Premium

ESP32 HTTPClient + API meteo (con display OLED SSD1306)

In questo progetto, utilizzando l'ESP32, effettuiamo una chiamata REST all'API meteo (wttr.in) tramite Internet utilizzando HTTPClient.h. A differenza della precedente versione con LCD I2C, qui utilizziamo un display OLED SSD1306 (128×64), che consente di utilizzare caratteri di grandi dimensioni, icone vettoriali e una ricca presentazione visiva su un unico schermo. Per le condizioni meteorologiche, 7 diverse icone vettoriali (soleggiato, parzialmente nuvoloso, nuvoloso, piovoso, nevoso, temp

4.3(10)
20