Komponen · 10 mnt baca

Mikrofon I2S INMP441 dengan ESP32: Membaca Audio, Mengukur dB, dan Menggambar Gelombang

Hubungkan mikrofon I2S INMP441 ke ESP32: tabel pengkabelan, audio 24-bit lewat I2S, menghitung level dB, bentuk gelombang di Serial Plotter, dan kode MicroPython untuk Pico.

INMP441 adalah modul mikrofon MEMS kecil yang mengubah suara menjadi digital di dalam chip-nya sendiri dan mengirim sampel 24-bit langsung lewat bus I2S. Pasangan INMP441 ESP32 adalah cara termudah untuk mendapatkan audio yang bersih tanpa repot dengan mikrofon analog, penguat, atau ADC. Kamu cukup menghubungkan modul ke ESP32 dengan enam kabel, mengambil 16.000 sampel per detik dengan beberapa baris kode I2S, menghitung level suara sekitar dalam desibel (dB) dari sampel-sampel itu, lalu melihat bentuk gelombang suara secara langsung di Serial Plotter.

Di panduan ini kamu akan melihat langkah demi langkah cara kerja INMP441, fungsi tiga jalur I2S, kode siap pakai yang bisa dikompilasi di core Arduino ESP32 versi 2.x maupun 3.x, perbedaan dBFS dan dB SPL, serta rumus pengukur level suara yang sesungguhnya. Di bagian akhir ada juga cara memakai MicroPython di Raspberry Pi Pico, perbedaannya dengan sensor suara KY-038 analog yang murah, dan kesalahan pengkabelan yang paling sering terjadi.

Board pengembangan ESP32 untuk membaca mikrofon INMP441
Untuk membaca INMP441 kamu butuh board yang punya hardware I2S; ESP32 punya dua unit I2S dan sinyalnya bisa diarahkan ke GPIO mana pun yang kamu mau.

Apa itu INMP441 dan bagaimana cara kerjanya?

INMP441 adalah mikrofon MEMS omnidirectional (menangkap suara sama baiknya dari segala arah) buatan TDK InvenSense. MEMS di sini berarti kapasitor kecil yang terdiri dari membran mikroskopis dan pelat tetap yang dibentuk di atas silikon: ketika gelombang suara menggetarkan membran, kapasitansinya berubah. Mikrofon electret klasik mengeluarkan perubahan ini sebagai tegangan analog yang lemah, dan kamu harus menguatkan, menyaring, lalu mengukurnya dengan ADC. Di dalam INMP441, preamplifier, filter anti-aliasing, ADC sigma-delta 24-bit, dan antarmuka I2S sudah tergabung jadi satu. Jadi yang keluar dari mikrofon bukan lagi tegangan, melainkan angka-angka yang mengikuti sinyal clock. Dengan begitu tidak ada derau analog yang tertangkap di kabel, kualitas ADC board-mu tidak lagi berpengaruh, dan mikrokontroler 3,3 V apa pun yang cocok akan mendapat kualitas suara yang sama. Lubang kecil di modul adalah lubang masuk suara mikrofon; hati-hati jangan sampai tertutup ketika kamu memasang board di dalam casing.

FiturNilai
TipeMikrofon MEMS, omnidirectional, output digital
AntarmukaI2S, 24-bit, MSB lebih dulu, komplemen dua
Catu daya1,8–3,3 V
ArusSekitar 1,4 mA
Sensitivitas−26 dBFS (1 kHz, 94 dB SPL)
Rasio sinyal terhadap derau (SNR)61 dBA
Respons frekuensi60 Hz – 15 kHz
Titik kelebihan beban akustik (AOP)120 dB SPL
Frekuensi SCKSekitar 0,5–3,2 MHz (sampling sekitar 7,8–50 kHz)
Pin modulVDD, GND, SD, L/R, WS, SCK

Apa itu I2S? Audio digital lewat tiga jalur

I2S (Inter-IC Sound) adalah bus serial yang dirancang untuk membawa sampel audio antar-chip, dan walaupun namanya mirip, tidak ada hubungannya dengan I2C. Bus ini punya tiga jalur: SCK (bit clock) menentukan kapan setiap bit data harus dibaca, WS (word select, disebut juga LRCLK) menunjukkan apakah yang sedang dikirim pada momen itu kanal kiri atau kanal kanan, dan SD adalah datanya sendiri. Dalam susunan ini ESP32 adalah master: ia yang menghasilkan kedua clock, dan mikrofon mengikuti clock tersebut lalu menaruh data di jalur SD. Pada INMP441 setiap frame terdiri dari 64 pulsa SCK: 32 bit untuk kanal kiri dan 32 bit untuk kanal kanan. Karena itu sample rate-nya adalah SCK / 64; untuk sampling 16 kHz, ESP32 menghasilkan bit clock sekitar 1,024 MHz. Mikrofon menulis hasil pengukuran 24-bit-nya dengan MSB lebih dulu ke slot 32-bit milik kanalnya, dan 8 bit sisanya bernilai nol. Itulah sebabnya kode menggeser nilainya 8 bit ke kanan.

Pin INMP441Fungsi
VDDCatu daya, 1,8–3,3 V
GNDGround
SCKInput bit clock (datang dari board)
WSInput clock pemilih kanal (datang dari board)
SDOutput data audio serial (dari mikrofon ke board)
L/RPemilih kanal: GND = kanal kiri, VDD = kanal kanan

Pengkabelan INMP441: ESP32 dan Raspberry Pi Pico

Pin INMP441ESP32Raspberry Pi Pico
VDD3V33V3(OUT) (pin 36)
GNDGNDGND
SCKGPIO 32GP16
WSGPIO 25GP17
SDGPIO 33GP18
L/RGNDGND
Jangan pernah menghubungkan INMP441 ke 5 V; batas mutlak catu dayanya sekitar 3,6 V dan 5 V bisa merusak mikrofon secara permanen. Dengan alasan yang sama, Arduino Uno dan Nano tidak cocok untuk modul ini: keduanya tidak punya hardware I2S, bekerja dengan logika 5 V, dan RAM 2 KB tidak cukup untuk buffer audio. Kesalahan kedua yang sering terjadi adalah membiarkan pin L/R mengambang; pin yang mengambang membuat kanalnya tidak jelas dan hasil pembacaan jadi nol atau acak.

Di ESP32, sinyal I2S bisa diarahkan ke pin mana pun lewat matriks GPIO; angka 32, 25, dan 33 di tabel tidak wajib, hanya pilihan yang aman. Cukup hindari pin strapping yang menentukan perilaku board ketika boot (GPIO 0, 2, 5, 12, 15) dan GPIO 6–11 yang dipakai untuk memori flash. GPIO 34–39 hanya bisa jadi input, jadi cocok untuk jalur SD tetapi tidak bisa dipakai untuk SCK dan WS. Aturan di Pico berbeda: driver I2S MicroPython memakai PIO dan pin WS harus satu nomor lebih tinggi dari pin SCK (misalnya GP16 dan GP17). Buat kabel lebih pendek dari 10–15 cm; sinyal clock di kisaran megahertz akan rusak di kabel jumper yang panjang. Kamu bisa mengecek susunan pin board-mu di alat diagram pin.

Langkah demi langkah: pembacaan audio pertamamu dengan ESP32

  1. Pastikan paket board ESP32 sudah terinstal di Arduino IDE dan pilih ESP32 Dev Module di Tools > Board. Kalau belum tahu cara instalnya, lihat Apa Itu ESP32?.
  2. Pasang modul di breadboard; hubungkan VDD ke 3V3, GND ke GND, dan L/R ke GND.
  3. Hubungkan SCK ke GPIO 32, WS ke GPIO 25, dan SD ke GPIO 33, lalu buat kabelnya tetap pendek.
  4. Upload kode di bawah. Tidak perlu library tambahan: ESP_I2S di core 3.x dan driver/i2s.h di core 2.x sudah termasuk dalam paket board.
  5. Buka Serial Monitor di 115200 baud; di ruangan yang sepi kamu seharusnya melihat nilai sekitar 35–50 dB, dan sekitar 55–70 dB ketika berbicara.
  6. Buka Tools > Serial Plotter untuk melihat kurva dBFS dan dB SPL secara langsung; tepuk tangan di dekat mikrofon dan lihat kurvanya melonjak.

Kode ESP32: mengukur level suara (dB) dengan INMP441

Kode ini mengecek versi core Arduino ESP32 dengan ESP_ARDUINO_VERSION_MAJOR. Di versi 3.x ia memakai library ESP_I2S yang baru, sedangkan di 2.x ia memakai driver I2S klasik dari ESP-IDF. Kedua jalur menyediakan fungsi micBegin() dan micRead() yang sama, jadi perhitungan di loop() tidak berubah. Setiap perulangan membaca 512 sampel, yaitu 32 ms audio pada 16 kHz, membuang offset DC, mencari nilai RMS, lalu mengubahnya ke desibel.

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}
Bagian kodeFungsinya
SAMPLE_RATE = 16000Mengambil 16.000 sampel per detik; frekuensi SCK menjadi 16.000 × 64 = 1,024 MHz. Cukup untuk suara bicara; untuk musik kamu bisa memilih 44.100 (SCK sekitar 2,82 MHz).
Lebar data 32-bitINMP441 mengharapkan 64 pulsa SCK di setiap frame WS; kalau kamu memilih 16 bit, frame-nya jadi lebih pendek dan datanya tidak bermakna.
MONO + LEFT / ONLY_LEFTHanya kanal kiri yang dibaca; karena pin L/R terhubung ke GND, mikrofon memakai slot kiri.
samples[i] >>= 8Mengambil hasil pengukuran 24-bit dari slot 32-bit; nilainya berada di antara −8.388.608 dan +8.388.607.
Mengurangi rata-rataMembuang offset DC kecil di sinyal; kalau tidak, RMS-nya jadi lebih besar dari seharusnya.
rmsAkar kuadrat dari rata-rata kuadrat sampel; mewakili daya rata-rata suara.
dbfs + DB_OFFSETMengubah hasilnya ke dB SPL memakai sensitivitas datasheet −26 dBFS @ 94 dB SPL.

Bagaimana level suara dihitung? dBFS dan dB SPL

Karena tekanan suara berubah dalam rentang yang sangat lebar, dipakailah skala desibel yang logaritmik: amplitudo dua kali lipat berarti sekitar +6 dB, dan amplitudo sepuluh kali lipat berarti +20 dB. Angka dari mikrofon pertama-tama diubah ke dBFS (desibel relatif terhadap skala penuh): dBFS = 20 × log10(RMS / RMS skala penuh). Skala penuh adalah RMS dari gelombang sinus yang puncaknya mencapai nilai 24-bit terbesar, 8.388.608, yaitu 8.388.608 / √2 ≈ 5.931.642. Di skala ini 0 dBFS adalah batas clipping mikrofon, dan setiap suara yang lebih pelan mendapat nilai negatif. Untuk beralih ke tekanan suara fisik, yaitu dB SPL, dipakai sensitivitas dari datasheet: INMP441 mengeluarkan suara 1 kHz sebesar 94 dB SPL sebagai −26 dBFS. Dari sini didapat rumus dB SPL = dBFS + 94 − (−26) = dBFS + 120. Contohnya, kalau nilai RMS-nya 5932, maka dBFS = 20 × log10(0,001) = −60 dan level suaranya sekitar 60 dB SPL, yaitu level orang berbicara normal.

Sumber suaraPerkiraan dB SPLdBFS di INMP441
Derau dasar mikrofon itu sendiri33−87
Ruangan sepi40−80
Berbicara normal (1 m)60−60
Lalu lintas padat, penyedot debu70–80−50 sampai −40
Risiko gangguan pendengaran jika terpapar lama85−35
Referensi pengukuran (kalibrator)94−26
Bor listrik, depan panggung konser100–110−20 sampai −10
Batas atas mikrofon (AOP)1200
Rumus ini hanya bergantung pada nilai datasheet; sensitivitas bisa meleset ±1 dB dari satu mikrofon ke mikrofon lain, dan perhitungannya tidak memakai pembobotan A. Untuk hasil yang lebih akurat, ukur suara yang stabil (misalnya nada 1 kHz) secara bersamaan dengan INMP441 dan dengan sound level meter atau aplikasi pengukur desibel di ponsel, lalu tambahkan atau kurangkan selisihnya ke angka 120 di kode. Supaya nilainya tampil lebih tenang, ambil rata-rata dari beberapa pengukuran terakhir; rata-rata bergerak di artikel menyaring data sensor juga berguna di sini.

Menggambar bentuk gelombang di Serial Plotter

Nilai desibel memberi tahu seberapa keras suaranya; untuk melihat bentuk suaranya kamu perlu menggambar sampel mentahnya. Di sketch yang sama, ganti hanya fungsi loop() dengan yang di bawah. Ada batasan penting di sini: jalur serial 115200 baud membawa sekitar 11.500 karakter per detik, dan itu tidak cukup untuk mencetak 16.000 sampel per detik. Karena itu kode mencetak satu blok 512 sampel secara berurutan; suara yang datang selama blok dicetak akan terlewat, tetapi setiap potongan yang kamu lihat di plotter adalah irisan 32 ms yang nyata dan tidak terputus.

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}

Ketika kamu bersiul ke mikrofon, kamu akan melihat gelombang sinus yang hampir mulus di plotter. Untuk siulan 1 kHz, satu periode berlangsung 1 ms dan setara dengan 16 titik pada sampling 16 kHz; dengan menghitung jumlah titik dalam satu periode, kamu bisa memperkirakan frekuensinya secara kasar. Karena suara bicara adalah campuran banyak frekuensi, bentuk gelombangnya tidak beraturan dan berselubung; tepuk tangan menghasilkan lonjakan pendek yang sangat tinggi. Karena plotter menskalakan sumbunya secara otomatis, fluktuasi derau kecil bisa terlihat besar ketika suasana sepi, dan itu normal. Untuk detail pemakaian Serial Monitor dan Serial Plotter, lihat artikel Serial Monitor Arduino.

INMP441 dengan Raspberry Pi Pico (MicroPython)

Raspberry Pi Pico tidak punya unit I2S khusus, tetapi blok PIO yang bisa diprogram mampu meniru I2S dengan kecepatan hardware, dan kelas machine.I2S di MicroPython mengerjakannya untukmu. Kamu tidak perlu menginstal file tambahan; cukup pastikan versi MicroPython yang terbaru sudah terpasang. Di kode dipilih bits=32 dan format=I2S.MONO, sampel yang terbaca kembali digeser 8 bit ke kanan dan diubah ke desibel dengan rumus yang sama. Karena perulangan Python lebih lambat dari C, menjaga ukuran blok di 512 sampel adalah keseimbangan yang baik; suara beberapa milidetik yang terlewat selama perhitungan berjalan hampir tidak memengaruhi hasilnya. Kalau kamu memprogram Pico dengan Arduino IDE, library I2S di core arduino-pico juga melakukan hal yang sama; di sana pun pin WS (LRCLK) harus satu nomor lebih tinggi dari pin BCLK. Kalau kamu baru mengenal MicroPython, baca dulu Apa Itu 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 vs sensor suara analog KY-038

Modul sensor suara analog KY-038
KY-038: sensor suara analog dengan kapsul electret, trimpot untuk mengatur ambang, dan komparator LM393.

KY-038 adalah modul murah yang terdiri dari kapsul mikrofon electret, trimpot untuk mengatur ambang, dan komparator LM393. Output digitalnya (DO) berubah status ketika suara melewati ambang yang kamu atur; output analognya (AO) memberikan tegangan mentah dari kapsul dan dibaca dengan ADC board. Desain ini cukup untuk mendeteksi tepuk tangan atau mengetahui ada tidaknya suara di ruangan. Tetapi karena modul ini tidak punya penguat, sinyalnya sangat lemah: ADC 10-bit Arduino Uno hanya melihat perubahan beberapa langkah ketika ada orang berbicara, dan ADC ESP32 cukup berderau. Sebaliknya, INMP441 melakukan pengukuran di dalam mikrofon dengan 24 bit; karena tidak ada kabel analog, penguat, atau ADC di antaranya, ia merekam rentang sekitar 87 dB, dari derau dasar sampai batas clipping, dengan bersih. Singkatnya, KY-038 adalah sakelar suara, sedangkan INMP441 adalah mikrofon sungguhan. Batasan pembacaan analog bisa kamu temukan secara detail di panduan ADC.

FiturINMP441KY-038
Jenis mikrofonMEMS, output digitalKapsul electret, analog
OutputI2S, sampel 24-bitTegangan analog AO + output ambang DO
Catu daya1,8–3,3 V3,3–5 V
Board yang kompatibelESP32, Pico, dan board yang mendukung I2SBoard apa saja, termasuk Uno
Kualitas suaraCukup untuk rekaman dan analisis (60 Hz – 15 kHz)Hanya level kasar
Pengukuran dBBisa dengan rumusTidak bisa diandalkan
Pemakaian umumPengukur kebisingan, rekaman audio, FFT, perintah suaraSaklar tepuk, alarm ada/tidak ada suara

Ide proyek dengan INMP441

  • LED yang bereaksi terhadap suara: ubah level suara menjadi jumlah LED yang menyala di strip WS2812B; untuk detailnya lihat artikel LED reaktif musik dan WS2812B NeoPixel.
  • Lampu lalu lintas kebisingan kelas: buat lampu peringatan yang menyala hijau di bawah 55 dB, kuning di antara 55–70 dB, dan merah di atasnya.
  • Dasbor kebisingan langsung di web: kirim nilai dB ke browser lewat WebSocket dan pantau sebagai grafik dari ponselmu; struktur dasarnya ada di Web Server dan WebSocket ESP32.
  • Sensor kebisingan rumah pintar: kirim hasil pengukuran ke Home Assistant lewat MQTT; panduan MQTT dan Home Assistant akan memudahkanmu.
  • Peringatan bayi menangis atau anjing menggonggong: kalau suara melewati ambang selama waktu tertentu, kirim pesan ke ponselmu dengan bot Telegram.
  • Perekam suara: tulis sampel sebagai file WAV 16-bit ke modul kartu SD lalu dengarkan di komputer.
  • Kendali dengan siulan: cari frekuensi dominan dengan FFT dan picu LED atau relay pada nada siulan tertentu.

Kesalahan umum dan cara mengatasinya

GejalaKemungkinan penyebabSolusi
Nilai dB SPL tetap di sekitar −15,5Tidak ada data yang datang dari jalur SD, semua sampel bernilai 0Cek kabel SD dan pastikan L/R terhubung ke GND; kalau belum berhasil, ganti kanal ke kanan (I2S_STD_SLOT_RIGHT di 3.x, I2S_CHANNEL_FMT_ONLY_RIGHT di 2.x)
Nilai tidak naik ketika suara makin keras, malah melompat acakSCK dan WS tertukar atau kabelnya terlalu panjangPerbaiki pin sesuai tabel dan pendekkan kabel di bawah 10–15 cm
Error “CONFLICT! The new i2s driver can't work along with the legacy i2s driver” ketika startdriver/i2s.h yang lama dipakai bersamaan dengan driver baru di core 3.xPakai satu driver saja; struktur #if di sini memilih yang benar secara otomatis
Nilai dB berbeda 10–20 dB dari sound level meterPergeseran bit salah, DC tidak dibuang, atau belum dikalibrasiAtur pergeseran ke 8 bit, kurangi rata-ratanya, kalibrasi dengan nada yang stabil
ValueError ketika membuat I2S di PicoPin WS bukan satu nomor lebih tinggi dari pin SCKPakai pin berurutan seperti SCK = GP16, WS = GP17
Mikrofon jadi panas atau sama sekali tidak meresponsVDD terhubung ke 5 VSegera pindahkan ke 3V3; mikrofon mungkin sudah rusak, coba yang baru
Bentuk gelombang terlihat terputus-putus di Serial PlotterJalur serial tidak sanggup membawa 16.000 sampel per detikIni normal; untuk tampilan yang lebih mulus, naikkan baud rate ke 921600
Cara tercepat menguji koneksi adalah meng-upload kode dB lalu meniup mikrofon pelan-pelan. Kalau nilainya berkisar di angka 40-an dan naik di atas 90 ketika kamu meniup, semuanya sudah benar. Kalau nilainya sama sekali tidak bergerak dari sekitar −15,5, berarti tidak ada data yang masuk; cek kabel L/R dan SD sebelum mengutak-atik kode.

Dengan beberapa kabel dan sketch pendek, INMP441 memberi ESP32-mu mikrofon digital sungguhan; modul ini jadi dasar banyak proyek, dari mengukur level suara sampai lampu yang bereaksi terhadap suara. Setiap kali kamu ingin mengolah suara sebagai angka alih-alih puas dengan sensor analog, inilah pilihan pertama. Di aplikasi BlueGrays kamu bisa mengikuti skema rangkaian dan kode langkah demi langkah untuk proyek ESP32 dengan LED, buzzer, strip WS2812B, dan web server, lalu dengan mudah menambahkan mikrofon ini di atasnya.

Pertanyaan umum

Apakah INMP441 bisa dipakai dengan Arduino Uno?

Tidak, secara praktis tidak bisa. Arduino Uno dan Nano tidak punya hardware I2S, bekerja dengan logika 5 V, dan RAM 2 KB tidak cukup untuk buffer audio. Untuk INMP441 sebaiknya kamu memakai ESP32, ESP32-S3, Raspberry Pi Pico, atau board 3,3 V lain yang mendukung I2S.

Apa fungsi pin L/R pada INMP441?

Pin L/R memilih kanal mana di frame stereo yang dipakai mikrofon: kiri kalau terhubung ke GND, kanan kalau terhubung ke 3,3 V. Kalau kamu menyambungkan jalur SCK, WS, dan SD dari dua INMP441 secara bersama lalu mengatur satu ke kiri dan yang lain ke kanan, kamu mendapat audio stereo lewat satu bus I2S. Jangan biarkan pin ini mengambang; hasil pembacaan akan nol atau tidak stabil.

Apakah INMP441 bisa dipakai untuk merekam suara?

Bisa. Kalau kamu mengecilkan sampel 24-bit menjadi 16 bit lalu menulisnya ke kartu SD dengan header WAV, kamu mendapat rekaman yang bisa diputar di komputer. Sampling 16 kHz cukup untuk suara bicara; rekaman mono 16-bit selama satu menit memakan sekitar 1,9 MB.

Seberapa akurat pengukuran dB dengan INMP441?

Perhitungan dengan sensitivitas datasheet −26 dBFS memberi hasil dalam selisih beberapa dB bahkan tanpa kalibrasi; toleransi sensitivitas mikrofonnya ±1 dB. Karena perhitungannya tidak memakai pembobotan A, hasilnya bisa lebih tinggi dari sound level meter di lingkungan yang banyak dengungan frekuensi rendah. Kalau kamu mengkalibrasinya dengan sumber suara yang sudah diketahui, hasilnya sangat baik untuk kebisingan ruangan, tetapi tetap tidak menggantikan alat ukur resmi.

Sebaiknya aku beli INMP441 atau KY-038?

Kalau kamu hanya ingin mendeteksi tepuk tangan atau suara keras lalu memicu sesuatu, KY-038 sudah cukup dan bisa dipakai dengan board apa saja. Kalau kamu ingin mengukur level suara dalam dB, merekam audio, melakukan analisis frekuensi, atau membuat lampu yang bereaksi terhadap suara, INMP441 memberi hasil yang jauh lebih bersih dan akurat.

Kenapa INMP441 di ESP32 selalu membaca 0?

Penyebab paling umum adalah pin L/R yang mengambang, kanal di kode yang tidak cocok dengan pengaturan mikrofon, dan kabel SD yang tertancap di pin yang salah. Pertama hubungkan L/R ke GND, lalu coba ganti kanal di kode ke kanan. Pastikan juga lebar bitnya 32 bit dan modul mendapat daya dari 3V3.

Lihat semua proyek
LED Berkedip dengan ESP32
#103Pemula

LED Berkedip dengan ESP32

Mengajarkan penggunaan output GPIO dasar dengan ESP32. Kita membuat efek berkedip dengan menyalakan dan mematikan LED dari pin digital. Versi ESP32 dari proyek blink klasik di Arduino UNO; perintah blink dasar di lingkungan Arduino sama, tetapi susunan pin ESP32 dan level GPIO 3,3 V-nya berbeda dengan Arduino UNO.

4.7(37)
100
Menggunakan Buzzer
#13Pemula

Menggunakan Buzzer

Pernah penasaran bagaimana bel pintu atau alarm mengeluarkan suaranya? Arduino membuat buzzer kecil berbunyi bip dengan jeda singkat: bip, jeda, bip, jeda. Kamu melihat bagaimana suara dibuat dengan l

4.7(89)
162
LED Fade dengan PWM ESP32
#110Pemula

LED Fade dengan PWM ESP32

Mengubah kecerahan LED secara halus dari 0 ke maksimum, dan dari maksimum ke 0. Kita mengendalikan PWM dengan analogWrite() seperti di Arduino; sintaks yang sama bekerja tanpa masalah di ESP32 Arduino Core 3.0+. Definisi pin + pinMode + analogWrite sudah cukup.

4.8(36)
55
Memutar Melodi dengan Buzzer ESP32
#114Pemula
Premium

Memutar Melodi dengan Buzzer ESP32

Memainkan melodi sederhana (Twinkle Twinkle Little Star) dengan buzzer pasif. Kita memainkan nada dengan fungsi tone() dan noTone() seperti di Arduino; ESP32 bekerja dengan sintaks yang sama di Arduino Core 3.0+. Harus memakai buzzer pasif (buzzer aktif tidak bisa memainkan melodi).

4.8(30)
55
Kendali Strip NeoPixel WS2812B ESP32
#126Menengah
Premium

Kendali Strip NeoPixel WS2812B ESP32

LED addressable WS2812B (NeoPixel) adalah LED RGB pintar yang bisa dikendalikan secara berantai lewat satu pin data. Di proyek ini, kita mengendalikan strip WS2812B 8 LED dengan library Adafruit_NeoPixel untuk membuat animasi pelangi yang halus. Meskipun level logika 3,3V ESP32 bekerja lancar dengan sebagian besar komponen WS2812B, kita menunjukkan solusi dengan resistor seri 470Ω dan kapasitor 1000µF untuk berjaga-jaga jika tidak stabil. Animasinya dibuat dengan menggeser nilai hue.

4.9(19)
30
Web Server Asinkron ESP32 (dengan Tampilan IP di LCD)
#129Mahir

Web Server Asinkron ESP32 (dengan Tampilan IP di LCD)

Di proyek ini, kita mengubah ESP32 menjadi web server asinkron yang bisa kamu kendalikan dari ponsel atau komputer di jaringan Wi-Fi yang sama. Berkat library ESPAsyncWebServer, server bisa memproses beberapa permintaan bersamaan (berbeda dengan WebServer.h klasik, yang memblokir pada satu permintaan). Kamu bisa membuka alamat IP ESP32 di browser dan mengklik tombol ON/OFF (rute /on dan /off) untuk menyalakan dan mematikan LED yang tersambung ke GPIO 5.

4.8(16)
26
Penghitung WebSocket ESP32 (2 Tombol + LCD + Web Real-Time)
#130Mahir
Premium

Penghitung WebSocket ESP32 (2 Tombol + LCD + Web Real-Time)

Di proyek ini, dua tombol yang tersambung ke ESP32 (GPIO 5 menghitung naik, GPIO 4 menghitung turun) mengubah sebuah penghitung. Nilainya langsung diperbarui di LCD I2C 16x2 sekaligus, lewat dukungan WebSocket ESPAsyncWebServer, di setiap browser yang tersambung tanpa memuat ulang halaman. Alih-alih polling HTTP, dipakai satu koneksi yang tetap terbuka, dan ESP32 mengirim nilai baru ke semua orang dengan ws.textAll().

4.5(14)
23
HTTPClient + API Cuaca ESP32 (dengan Layar OLED SSD1306)
#134Mahir
Premium

HTTPClient + API Cuaca ESP32 (dengan Layar OLED SSD1306)

Di proyek ini, kita memakai ESP32 untuk melakukan panggilan REST API ke API cuaca (wttr.in) lewat internet dengan HTTPClient.h. Berbeda dengan versi LCD I2C sebelumnya, di sini kita memakai layar OLED SSD1306 (128×64), yang memungkinkan font besar, ikon vektor, dan tampilan visual yang kaya di satu layar. Tujuh ikon vektor untuk kondisi cuaca (cerah, berawan sebagian, berawan, hujan, salju, badai, berkabut) digambar ketika program berjalan (tanpa file bitmap).

4.3(10)
20