Componentes · 11 min de leitura

Microfone I2S INMP441 com ESP32: ler áudio, medir dB e plotar a forma de onda

Ligue o microfone I2S INMP441 a um ESP32: tabela de ligação, áudio de 24 bits via I2S, cálculo do nível em dB, forma de onda no Plotter Serial e código MicroPython para o Pico.

O INMP441 é um pequeno módulo de microfone MEMS que converte o som para digital dentro do próprio chip e envia amostras de 24 bits diretamente pelo barramento I2S. A dupla INMP441 ESP32 é o jeito mais fácil de obter áudio limpo sem microfone analógico, amplificador ou ADC. Você liga o módulo ao ESP32 com seis fios, captura 16.000 amostras por segundo com poucas linhas de código I2S, calcula o nível sonoro do ambiente em decibéis (dB) a partir dessas amostras e acompanha a forma de onda do som ao vivo no Plotter Serial.

Neste guia você vai ver passo a passo como o INMP441 funciona, o que fazem as três linhas do I2S, um código pronto que compila tanto no core 2.x quanto no 3.x do ESP32 para Arduino, a diferença entre dBFS e dB SPL e a fórmula de um decibelímetro de verdade. No final você também encontra o uso com MicroPython no Raspberry Pi Pico, a diferença em relação ao barato sensor de som analógico KY-038 e os erros de ligação mais comuns.

Placa de desenvolvimento ESP32 para ler o microfone INMP441
Para ler o INMP441 você precisa de uma placa com hardware I2S; o ESP32 tem duas unidades I2S e os sinais podem ser roteados para qualquer GPIO que você quiser.

O que é o INMP441 e como ele funciona?

O INMP441 é um microfone MEMS omnidirecional fabricado pela TDK InvenSense. MEMS, aqui, significa um minúsculo capacitor formado por uma membrana microscópica e uma placa fixa gravadas no silício: conforme as ondas sonoras fazem a membrana vibrar, a capacitância muda. Um microfone de eletreto clássico entrega essa variação como uma tensão analógica fraca, e você precisa amplificá-la, filtrá-la e medi-la com um ADC. Dentro do INMP441, porém, estão juntos um pré-amplificador, um filtro anti-aliasing, um ADC sigma-delta de 24 bits e a interface I2S. Ou seja, o que sai do microfone já não é uma tensão, e sim números que seguem um sinal de clock. Assim, nenhum ruído analógico é captado nos fios, a qualidade do ADC da sua placa deixa de importar e qualquer microcontrolador de 3,3 V adequado obtém a mesma qualidade de som. O pequeno furo no módulo é a entrada de som do microfone; tome cuidado para não tampá-lo ao montar a placa em uma caixa.

CaracterísticaValor
TipoMicrofone MEMS, omnidirecional, com saída digital
InterfaceI2S, 24 bits, MSB primeiro, complemento de dois
Alimentação1,8–3,3 V
CorrenteCerca de 1,4 mA
Sensibilidade−26 dBFS (1 kHz, 94 dB SPL)
Relação sinal-ruído (SNR)61 dBA
Resposta em frequência60 Hz – 15 kHz
Ponto de sobrecarga acústica (AOP)120 dB SPL
Frequência do SCKCerca de 0,5–3,2 MHz (amostragem de cerca de 7,8–50 kHz)
Pinos do móduloVDD, GND, SD, L/R, WS, SCK

O que é I2S? Áudio digital em três linhas

I2S (Inter-IC Sound) é um barramento serial criado para transportar amostras de áudio entre chips e, apesar do nome parecido, não tem nada a ver com o I2C. Ele tem três linhas: SCK (clock de bit) indica quando cada bit de dado deve ser lido, WS (word select, também chamado de LRCLK) indica se naquele momento está sendo enviado o canal esquerdo ou o direito, e SD é o próprio dado. Nesta montagem o ESP32 é o mestre (master): ele gera os dois clocks, e o microfone segue o clock e coloca os dados na linha SD. No INMP441 cada quadro tem 64 pulsos de SCK: 32 bits para o canal esquerdo e 32 bits para o direito. Por isso a taxa de amostragem é SCK / 64; para amostrar a 16 kHz, o ESP32 gera um clock de bit de cerca de 1,024 MHz. O microfone escreve sua medição de 24 bits, com o MSB primeiro, no espaço de 32 bits do seu canal, e os 8 bits restantes ficam em zero. É por isso que o código desloca o valor 8 bits para a direita.

Pino do INMP441Função
VDDAlimentação, 1,8–3,3 V
GNDTerra
SCKEntrada do clock de bit (vem da placa)
WSEntrada do clock de seleção de canal (vem da placa)
SDSaída de dados de áudio seriais (do microfone para a placa)
L/RSeleção de canal: GND = canal esquerdo, VDD = canal direito

Ligação do INMP441: ESP32 e Raspberry Pi Pico

Pino do INMP441ESP32Raspberry Pi Pico
VDD3V33V3(OUT) (pino 36)
GNDGNDGND
SCKGPIO 32GP16
WSGPIO 25GP17
SDGPIO 33GP18
L/RGNDGND
Nunca ligue o INMP441 em 5 V; o limite máximo absoluto de alimentação é de cerca de 3,6 V, e 5 V pode danificar o microfone de forma permanente. Pelo mesmo motivo, o Arduino Uno e o Nano não servem para este módulo: eles não têm hardware I2S, trabalham com lógica de 5 V e 2 KB de RAM não bastam para um buffer de áudio. O segundo erro comum é deixar o pino L/R desconectado; um pino flutuando deixa o canal indefinido e as leituras saem zeradas ou aleatórias.

No ESP32, os sinais I2S podem ser roteados para qualquer pino pela matriz de GPIO; os números 32, 25 e 33 da tabela não são obrigatórios, apenas escolhas seguras. Só fique longe dos pinos de strapping, que definem o comportamento na inicialização (GPIO 0, 2, 5, 12, 15), e dos GPIO 6–11, reservados para a memória flash. Os GPIO 34–39 são somente entrada, então servem para a linha SD, mas não podem ser usados para SCK e WS. No Pico a regra é diferente: o driver I2S do MicroPython usa PIO e o pino WS precisa ser o número seguinte ao pino SCK (como GP16 e GP17). Mantenha os fios com menos de 10–15 cm; um sinal de clock na faixa de megahertz se deforma em jumpers longos. Você pode conferir a disposição dos pinos da sua placa na ferramenta Pinagem.

Passo a passo: sua primeira leitura de áudio com o ESP32

  1. Verifique se o pacote de placas ESP32 está instalado no Arduino IDE e escolha ESP32 Dev Module em Ferramentas > Placa. Se você não sabe como instalar, veja O que é ESP32?.
  2. Encaixe o módulo na protoboard; ligue VDD ao 3V3, GND ao GND e L/R também ao GND.
  3. Ligue SCK ao GPIO 32, WS ao GPIO 25 e SD ao GPIO 33, e mantenha os fios curtos.
  4. Carregue o código abaixo. Nenhuma biblioteca extra é necessária: a ESP_I2S no core 3.x e a driver/i2s.h no core 2.x já vêm incluídas no pacote da placa.
  5. Abra o Monitor Serial a 115200 baud; em um cômodo silencioso você deve ver valores de cerca de 35–50 dB e, ao falar, algo em torno de 55–70 dB.
  6. Abra Ferramentas > Plotter Serial para acompanhar ao vivo as curvas de dBFS e dB SPL; bata palmas perto do microfone e veja a curva saltar.

Código para ESP32: medindo o nível sonoro (dB) com o INMP441

O código verifica a versão do core ESP32 para Arduino com ESP_ARDUINO_VERSION_MAJOR. Na versão 3.x ele usa a nova biblioteca ESP_I2S e, na 2.x, o driver I2S clássico do ESP-IDF. Os dois caminhos oferecem as mesmas funções micBegin() e micRead(), então o cálculo dentro de loop() não muda. A cada ciclo são lidas 512 amostras, ou seja, 32 ms de áudio a 16 kHz; o offset DC é removido, o valor RMS é calculado e convertido para decibéis.

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}
Trecho do códigoO que faz
SAMPLE_RATE = 16000 (taxa de amostragem)Captura 16.000 amostras por segundo; a frequência do SCK fica em 16.000 × 64 = 1,024 MHz. É suficiente para fala; para música você pode escolher 44.100 (SCK de cerca de 2,82 MHz).
Largura de dados de 32 bitsO INMP441 espera 64 pulsos de SCK por quadro de WS; se você escolher 16 bits, o quadro fica mais curto e os dados perdem o sentido.
MONO + LEFT / ONLY_LEFT (só o canal esquerdo)Apenas o canal esquerdo é lido; como o pino L/R está ligado ao GND, o microfone usa o espaço do canal esquerdo.
samples[i] >>= 8 (deslocamento de bits)Extrai a medição de 24 bits do espaço de 32 bits; o valor fica entre −8.388.608 e +8.388.607.
Subtração da médiaRemove o pequeno offset DC do sinal; caso contrário, o RMS sai maior do que deveria.
rms (valor eficaz)A raiz quadrada da média dos quadrados das amostras; representa a potência média do som.
dbfs + DB_OFFSET (conversão para dB SPL)Converte o resultado para dB SPL usando a sensibilidade de −26 dBFS @ 94 dB SPL informada no datasheet.

Como o nível sonoro é calculado? dBFS e dB SPL

Como a pressão sonora varia numa faixa muito ampla, usa-se a escala logarítmica de decibéis: dobrar a amplitude significa cerca de +6 dB, e multiplicá-la por dez significa +20 dB. Os números do microfone são primeiro convertidos para dBFS (decibéis em relação ao fundo de escala): dBFS = 20 × log10(RMS / RMS de fundo de escala). O fundo de escala é o RMS de uma senoide cujo pico atinge o maior valor de 24 bits, 8.388.608, ou seja, 8.388.608 / √2 ≈ 5.931.642. Nessa escala, 0 dBFS é o limite de saturação do microfone, e qualquer som mais baixo recebe um valor negativo. Para chegar à pressão sonora física, o dB SPL, usa-se a sensibilidade do datasheet: o INMP441 entrega um som de 1 kHz a 94 dB SPL como −26 dBFS. Daí vem a fórmula dB SPL = dBFS + 94 − (−26) = dBFS + 120. Por exemplo, se o valor RMS for 5.932, então dBFS = 20 × log10(0,001) = −60 e o nível sonoro fica em cerca de 60 dB SPL, que é o nível de uma conversa normal.

Fonte sonoradB SPL aprox.dBFS no INMP441
Piso de ruído do próprio microfone33−87
Cômodo silencioso40−80
Conversa normal (1 m)60−60
Trânsito intenso, aspirador de pó70–80−50 a −40
Risco auditivo com exposição prolongada85−35
Referência de medição (calibrador)94−26
Furadeira, frente do palco de um show100–110−20 a −10
Limite superior do microfone (AOP)1200
Essa fórmula se baseia apenas no valor do datasheet; a sensibilidade pode variar ±1 dB de um microfone para outro, e o cálculo não tem ponderação A. Para um resultado mais preciso, meça um som constante (por exemplo, um tom de 1 kHz) ao mesmo tempo com o INMP441 e com um decibelímetro ou um app de decibéis no celular, e some ou subtraia a diferença do número 120 no código. Para deixar os valores mais estáveis, tire a média das últimas medições; a média móvel do post filtragem de dados de sensores também funciona aqui.

Plotando a forma de onda no Plotter Serial

O valor em decibéis diz o quanto o som está alto; para ver o formato do som, você precisa plotar as amostras brutas. No mesmo sketch, substitua apenas a função loop() pela de baixo. Há um limite importante aqui: uma linha serial de 115200 baud transporta cerca de 11.500 caracteres por segundo, o que não basta para imprimir 16.000 amostras por segundo. Por isso o código imprime um bloco de 512 amostras em sequência; o som que chega enquanto o bloco está sendo impresso é perdido, mas cada trecho que você vê no plotter é uma fatia real e contínua 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}

Ao assobiar perto do microfone, você verá no plotter uma senoide quase perfeita. Num assobio de 1 kHz, um período dura 1 ms e corresponde a 16 pontos com amostragem de 16 kHz; contando os pontos de um período, dá para estimar a frequência por alto. Como a fala é uma mistura de muitas frequências, ela desenha uma onda irregular, com envoltória; já uma palma produz um pico curto e muito alto. Como o plotter ajusta a escala do eixo automaticamente, pequenas oscilações de ruído podem parecer grandes no silêncio, o que é normal. Para detalhes de uso do Monitor Serial e do Plotter Serial, veja o post Monitor Serial do Arduino.

INMP441 com o Raspberry Pi Pico (MicroPython)

O Raspberry Pi Pico não tem uma unidade I2S dedicada, mas seus blocos programáveis PIO emulam o I2S na velocidade do hardware, e a classe machine.I2S do MicroPython faz esse trabalho por você. Não é preciso instalar nenhum arquivo extra; basta ter uma versão recente do MicroPython instalada. No código você escolhe bits=32 e format=I2S.MONO, e as amostras lidas são de novo deslocadas 8 bits para a direita e convertidas para decibéis com a mesma fórmula. Como os laços em Python são mais lentos que em C, manter o bloco em 512 amostras é um bom equilíbrio; perder alguns milissegundos de som enquanto o cálculo roda quase não afeta o resultado. Se você programa o Pico com o Arduino IDE, a biblioteca I2S do core arduino-pico faz o mesmo trabalho; lá também o pino WS (LRCLK) precisa ser o número seguinte ao pino BCLK. Se você é novo no MicroPython, dê uma olhada primeiro em O que é 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))

INMP441 x sensor de som analógico KY-038

Módulo sensor de som analógico KY-038
KY-038: sensor de som analógico com cápsula de eletreto, trimpot para ajuste do limiar e comparador LM393.

O KY-038 é um módulo barato formado por uma cápsula de microfone de eletreto, um trimpot para ajustar o limiar e um comparador LM393. Sua saída digital (DO) muda de estado quando o som ultrapassa o limiar que você definiu; a saída analógica (AO) entrega a tensão bruta da cápsula e é lida com o ADC da placa. Esse arranjo basta para detectar palmas ou saber se há som no ambiente. Mas, como o módulo não tem amplificador, o sinal é muito fraco: o ADC de 10 bits do Arduino Uno enxerga apenas alguns degraus de variação durante a fala, e o ADC do ESP32 é ruidoso. Já o INMP441 faz a medição dentro do próprio microfone com 24 bits; como não há cabo analógico, amplificador ou ADC no meio, ele registra com limpeza uma faixa de cerca de 87 dB, do piso de ruído até o limite de saturação. Resumindo, o KY-038 é um interruptor de som, enquanto o INMP441 é um microfone de verdade. Você encontra os limites da leitura analógica em detalhes no guia de ADC.

CaracterísticaINMP441KY-038
Tipo de microfoneMEMS, saída digitalCápsula de eletreto, analógico
SaídaI2S, amostras de 24 bitsTensão analógica AO + saída de limiar DO
Alimentação1,8–3,3 V3,3–5 V
Placas compatíveisESP32, Pico e placas com suporte a I2SQualquer placa, inclusive o Uno
Qualidade de somBoa o suficiente para gravação e análise (60 Hz – 15 kHz)Só um nível aproximado
Medição em dBPossível com a fórmulaNão confiável
Uso típicoMedidor de ruído, gravação de áudio, FFT, comandos de vozInterruptor por palmas, alarme de som presente/ausente

Ideias de projetos com o INMP441

  • LEDs que reagem ao som: transforme o nível sonoro na quantidade de LEDs acesos numa fita WS2812B; para detalhes, veja os posts LEDs que reagem à música e WS2812B NeoPixel.
  • Semáforo de ruído para a sala de aula: monte uma luz de aviso que fica verde abaixo de 55 dB, amarela entre 55–70 dB e vermelha acima disso.
  • Painel de ruído ao vivo na web: envie o valor em dB para o navegador via WebSocket e acompanhe em gráfico pelo celular; a estrutura básica está em Servidor web e WebSocket com ESP32.
  • Sensor de ruído para casa inteligente: envie as medições para o Home Assistant via MQTT; o guia ESP32 com MQTT e Home Assistant facilita o trabalho.
  • Alerta de choro de bebê ou latido de cachorro: se o som passar do limiar por um certo tempo, envie uma mensagem para o seu celular com um bot do Telegram.
  • Gravador de áudio: grave as amostras como arquivo WAV de 16 bits num módulo de cartão SD e ouça no computador.
  • Controle por assobio: encontre a frequência dominante com uma FFT e acione um LED ou relé com um tom de assobio específico.

Erros comuns e como resolvê-los

SintomaCausa provávelSolução
O valor de dB SPL fica parado em torno de −15,5Nenhum dado chega pela linha SD, todas as amostras são 0Confira o fio SD e se o L/R está ligado ao GND; se não resolver, mude o canal para o direito (I2S_STD_SLOT_RIGHT no 3.x, I2S_CHANNEL_FMT_ONLY_RIGHT no 2.x)
O valor não sobe com som mais alto, salta aleatoriamenteSCK e WS estão trocados ou os fios estão longos demaisCorrija os pinos conforme a tabela e encurte os fios para menos de 10–15 cm
Erro “CONFLICT! The new i2s driver can't work along with the legacy i2s driver” na inicialização (conflito entre os drivers novo e antigo)O antigo driver/i2s.h foi usado junto com o driver novo no core 3.xUse um único driver; a estrutura #if deste código escolhe o certo automaticamente
Os valores em dB diferem 10–20 dB do decibelímetroDeslocamento de bits errado, DC não removido ou calibração não feitaUse deslocamento de 8 bits, subtraia a média e calibre com um tom constante
ValueError ao criar o I2S no PicoO pino WS não é o número seguinte ao pino SCKUse pinos consecutivos, como SCK = GP16 e WS = GP17
O microfone esquenta ou não respondeO VDD foi ligado em 5 VPasse para o 3V3 imediatamente; o microfone pode ter sido danificado, então teste um novo
A forma de onda aparece picotada no Plotter SerialA linha serial não consegue transportar 16.000 amostras por segundoIsso é normal; para uma visualização mais fluida, aumente o baud rate para 921600
O jeito mais rápido de testar a ligação é carregar o código de dB e soprar de leve no microfone. Se o valor ficar na casa dos 40 e subir acima de 90 quando você sopra, está tudo certo. Se o valor não sair de perto de −15,5, nenhum dado está chegando; confira os fios L/R e SD antes de mexer no código.

Com alguns fios e um sketch curto, o INMP441 dá ao seu ESP32 um microfone digital de verdade; ele é a base de muitos projetos, da medição do nível sonoro a luzes que reagem à música. Sempre que você quiser processar o som como números em vez de se contentar com um sensor analógico, ele é a primeira escolha. No app BlueGrays você pode seguir esquemas do circuito e códigos passo a passo de projetos com ESP32 usando LEDs, buzzers, fitas WS2812B e servidores web, e adicionar este microfone a eles com facilidade.

Perguntas frequentes

O INMP441 funciona com o Arduino Uno?

Não, na prática não. O Arduino Uno e o Nano não têm hardware I2S, trabalham com lógica de 5 V e 2 KB de RAM não bastam para um buffer de áudio. Para o INMP441, use um ESP32, ESP32-S3, Raspberry Pi Pico ou outra placa de 3,3 V com suporte a I2S.

Para que serve o pino L/R do INMP441?

O pino L/R escolhe qual canal do quadro estéreo o microfone usa: esquerdo se estiver ligado ao GND, direito se estiver ligado ao 3,3 V. Se você ligar juntas as linhas SCK, WS e SD de dois INMP441 e configurar um para a esquerda e outro para a direita, obtém áudio estéreo por um único barramento I2S. Não deixe o pino desconectado; as leituras ficam zeradas ou instáveis.

Dá para gravar áudio com o INMP441?

Sim. Se você reduzir as amostras de 24 bits para 16 bits e gravá-las num cartão SD com um cabeçalho WAV, obtém uma gravação que pode ser tocada no computador. Amostragem de 16 kHz é suficiente para fala; um minuto de gravação mono de 16 bits ocupa cerca de 1,9 MB.

Qual a precisão da medição em dB com o INMP441?

Um cálculo usando a sensibilidade de −26 dBFS do datasheet dá resultados com erro de poucos dB mesmo sem calibração; a tolerância de sensibilidade do microfone é de ±1 dB. Como o cálculo não tem ponderação A, ele pode marcar mais que um decibelímetro em ambientes com muito ronco de baixa frequência. Se você calibrar com uma fonte sonora conhecida, terá resultados muito bons para o ruído de um cômodo, mas ele não substitui um instrumento de medição oficial.

Devo comprar o INMP441 ou o KY-038?

Se você só quer detectar uma palma ou um som alto e acionar algo, o KY-038 basta e funciona com qualquer placa. Se quer medir o nível sonoro em dB, gravar áudio, fazer análise de frequência ou montar luzes que reagem à música, o INMP441 dá resultados muito mais limpos e precisos.

Por que o INMP441 sempre lê 0 no ESP32?

As causas mais comuns são o pino L/R desconectado, um canal no código que não corresponde à configuração do microfone e o fio SD encaixado no pino errado. Primeiro ligue o L/R ao GND e depois tente mudar o canal no código para o direito. Confira também se a largura de bits é de 32 bits e se o módulo está alimentado pelo 3V3.

Ver todos os projetos
LED piscando com ESP32
#103Iniciante

LED piscando com ESP32

Ensina o uso básico de uma saída GPIO no ESP32. Fazemos um LED piscar ligando e desligando um pino digital. É a versão para ESP32 do clássico projeto blink do Arduino UNO: os comandos básicos de blink no ambiente Arduino são os mesmos, mas a disposição dos pinos e os níveis de 3,3 V dos GPIOs do ESP32 diferem dos do Arduino UNO.

4.7(37)
100
Uso do buzzer
#13Iniciante

Uso do buzzer

Já se perguntou como uma campainha ou um alarme produz som? O Arduino faz um pequeno buzzer emitir bipes em intervalos curtos: bipe, pausa, bipe, pausa. Você vê como a eletricidade produz som e dá o p

4.7(89)
162
Variação gradual do brilho do LED com PWM no ESP32
#110Iniciante

Variação gradual do brilho do LED com PWM no ESP32

Varie suavemente o brilho do LED de 0 ao máximo e do máximo a 0. Controlamos o PWM com analogWrite(), como no Arduino. A mesma sintaxe funciona sem problemas com ESP32 Arduino Core 3.0+. Basta definir o pino e usar pinMode e analogWrite.

4.8(36)
55
Melodia com buzzer e ESP32
#114Iniciante
Premium

Melodia com buzzer e ESP32

Toque uma melodia simples (Brilha, brilha, estrelinha) com um buzzer passivo. Usamos as funções tone() e noTone() para tocar as notas, como no Arduino. A mesma sintaxe funciona com ESP32 Arduino Core 3.0+. É preciso usar um buzzer passivo, pois o ativo não toca melodias.

4.8(30)
55
Controle de fita WS2812B NeoPixel com ESP32
#126Intermediário
Premium

Controle de fita WS2812B NeoPixel com ESP32

Os LEDs endereçáveis WS2812B (NeoPixel) são LEDs RGB inteligentes que podem ser controlados em cadeia por um único pino de dados. Neste projeto, vamos controlar uma fita WS2812B de 8 LEDs com a biblioteca Adafruit_NeoPixel para criar uma animação suave de arco-íris. Embora o nível lógico de 3,3V do ESP32 funcione sem problemas na maioria dos lotes de WS2812B, vamos mostrar uma solução com um resistor de 470Ω em série e um capacitor de 1.000µF para casos de instabilidade.

4.9(19)
30
Servidor web assíncrono com ESP32 (IP no LCD)
#129Avançado

Servidor web assíncrono com ESP32 (IP no LCD)

Neste projeto, transformamos o ESP32 em um servidor web assíncrono que você pode controlar pelo celular ou computador na mesma rede Wi-Fi. Com a biblioteca ESPAsyncWebServer, o servidor processa várias requisições ao mesmo tempo (ao contrário do WebServer.h tradicional, que bloqueia a execução ao processar uma requisição). Você poderá abrir o endereço IP do ESP32 no navegador e clicar nos botões ON/OFF (as rotas /on e /off) para ligar e desligar o LED conectado ao GPIO 5.

4.8(16)
26
Contador WebSocket com ESP32 (2 botões + LCD + web em tempo real)
#130Avançado
Premium

Contador WebSocket com ESP32 (2 botões + LCD + web em tempo real)

Neste projeto, dois botões conectados ao ESP32 (GPIO 5 aumenta, GPIO 4 diminui) alteram um contador. O valor é atualizado instantaneamente no LCD I2C 16x2 e, com o suporte a WebSocket do ESPAsyncWebServer, em todos os navegadores conectados, sem recarregar a página. Em vez de consultas periódicas por HTTP, usamos uma única conexão persistente, e o ESP32 envia o novo valor a todos com ws.textAll().

4.5(14)
23
ESP32 HTTPClient + API de clima (com display OLED SSD1306)
#134Avançado
Premium

ESP32 HTTPClient + API de clima (com display OLED SSD1306)

Neste projeto, usamos o ESP32 para fazer uma chamada REST à API de clima wttr.in pela internet com HTTPClient.h. Diferentemente da versão anterior com LCD I2C, aqui usamos um display OLED SSD1306 (128×64), que permite usar fontes grandes, ícones vetoriais e uma apresentação visual rica em uma única tela. Sete ícones vetoriais de condições do tempo (ensolarado, parcialmente nublado, nublado, chuvoso, com neve, com tempestade e com neblina) são desenhados durante a execução, sem arquivos bitmap.

4.3(10)
20