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.

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.
| Fitur | Nilai |
|---|---|
| Tipe | Mikrofon MEMS, omnidirectional, output digital |
| Antarmuka | I2S, 24-bit, MSB lebih dulu, komplemen dua |
| Catu daya | 1,8–3,3 V |
| Arus | Sekitar 1,4 mA |
| Sensitivitas | −26 dBFS (1 kHz, 94 dB SPL) |
| Rasio sinyal terhadap derau (SNR) | 61 dBA |
| Respons frekuensi | 60 Hz – 15 kHz |
| Titik kelebihan beban akustik (AOP) | 120 dB SPL |
| Frekuensi SCK | Sekitar 0,5–3,2 MHz (sampling sekitar 7,8–50 kHz) |
| Pin modul | VDD, 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 INMP441 | Fungsi |
|---|---|
| VDD | Catu daya, 1,8–3,3 V |
| GND | Ground |
| SCK | Input bit clock (datang dari board) |
| WS | Input clock pemilih kanal (datang dari board) |
| SD | Output data audio serial (dari mikrofon ke board) |
| L/R | Pemilih kanal: GND = kanal kiri, VDD = kanal kanan |
Pengkabelan INMP441: ESP32 dan Raspberry Pi Pico
| Pin INMP441 | ESP32 | Raspberry Pi Pico |
|---|---|---|
| VDD | 3V3 | 3V3(OUT) (pin 36) |
| GND | GND | GND |
| SCK | GPIO 32 | GP16 |
| WS | GPIO 25 | GP17 |
| SD | GPIO 33 | GP18 |
| L/R | GND | GND |
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
- 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?.
- Pasang modul di breadboard; hubungkan VDD ke 3V3, GND ke GND, dan L/R ke GND.
- Hubungkan SCK ke GPIO 32, WS ke GPIO 25, dan SD ke GPIO 33, lalu buat kabelnya tetap pendek.
- 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.
- 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.
- 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.
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 kode | Fungsinya |
|---|---|
| SAMPLE_RATE = 16000 | Mengambil 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-bit | INMP441 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_LEFT | Hanya kanal kiri yang dibaca; karena pin L/R terhubung ke GND, mikrofon memakai slot kiri. |
| samples[i] >>= 8 | Mengambil hasil pengukuran 24-bit dari slot 32-bit; nilainya berada di antara −8.388.608 dan +8.388.607. |
| Mengurangi rata-rata | Membuang offset DC kecil di sinyal; kalau tidak, RMS-nya jadi lebih besar dari seharusnya. |
| rms | Akar kuadrat dari rata-rata kuadrat sampel; mewakili daya rata-rata suara. |
| dbfs + DB_OFFSET | Mengubah 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 suara | Perkiraan dB SPL | dBFS di INMP441 |
|---|---|---|
| Derau dasar mikrofon itu sendiri | 33 | −87 |
| Ruangan sepi | 40 | −80 |
| Berbicara normal (1 m) | 60 | −60 |
| Lalu lintas padat, penyedot debu | 70–80 | −50 sampai −40 |
| Risiko gangguan pendengaran jika terpapar lama | 85 | −35 |
| Referensi pengukuran (kalibrator) | 94 | −26 |
| Bor listrik, depan panggung konser | 100–110 | −20 sampai −10 |
| Batas atas mikrofon (AOP) | 120 | 0 |
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.
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?.
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

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.
| Fitur | INMP441 | KY-038 |
|---|---|---|
| Jenis mikrofon | MEMS, output digital | Kapsul electret, analog |
| Output | I2S, sampel 24-bit | Tegangan analog AO + output ambang DO |
| Catu daya | 1,8–3,3 V | 3,3–5 V |
| Board yang kompatibel | ESP32, Pico, dan board yang mendukung I2S | Board apa saja, termasuk Uno |
| Kualitas suara | Cukup untuk rekaman dan analisis (60 Hz – 15 kHz) | Hanya level kasar |
| Pengukuran dB | Bisa dengan rumus | Tidak bisa diandalkan |
| Pemakaian umum | Pengukur kebisingan, rekaman audio, FFT, perintah suara | Saklar 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
| Gejala | Kemungkinan penyebab | Solusi |
|---|---|---|
| Nilai dB SPL tetap di sekitar −15,5 | Tidak ada data yang datang dari jalur SD, semua sampel bernilai 0 | Cek 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 acak | SCK dan WS tertukar atau kabelnya terlalu panjang | Perbaiki 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 start | driver/i2s.h yang lama dipakai bersamaan dengan driver baru di core 3.x | Pakai satu driver saja; struktur #if di sini memilih yang benar secara otomatis |
| Nilai dB berbeda 10–20 dB dari sound level meter | Pergeseran bit salah, DC tidak dibuang, atau belum dikalibrasi | Atur pergeseran ke 8 bit, kurangi rata-ratanya, kalibrasi dengan nada yang stabil |
| ValueError ketika membuat I2S di Pico | Pin WS bukan satu nomor lebih tinggi dari pin SCK | Pakai pin berurutan seperti SCK = GP16, WS = GP17 |
| Mikrofon jadi panas atau sama sekali tidak merespons | VDD terhubung ke 5 V | Segera pindahkan ke 3V3; mikrofon mungkin sudah rusak, coba yang baru |
| Bentuk gelombang terlihat terputus-putus di Serial Plotter | Jalur serial tidak sanggup membawa 16.000 sampel per detik | Ini normal; untuk tampilan yang lebih mulus, naikkan baud rate ke 921600 |
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.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
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.

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

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.

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).

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.

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.

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().

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).
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

