INMP441 ESP32 I2S Mikrofon: Ses Okuma, dB Ölçme ve Dalga Formu
INMP441 dijital I2S mikrofonu ESP32'ye bağla: pin tablosu, I2S sürücüsüyle 24 bit ses okuma, dB seviyesi hesaplama, Serial Plotter dalga formu ve Pico kodu.
INMP441, sesi kendi içinde dijitale çeviren ve I2S veri yoluyla doğrudan 24 bitlik örnekler gönderen küçük bir MEMS mikrofon modülüdür. INMP441 ESP32 ikilisi, analog mikrofon, yükselteç ve ADC uğraşı olmadan temiz ses okumanın en kolay yoludur. Modülü ESP32'ye altı kabloyla bağlar, birkaç satırlık I2S koduyla saniyede 16 000 örnek alır, bu örneklerden ortamın ses seviyesini desibel (dB) olarak hesaplayabilir ve sesin dalga formunu Serial Plotter'da canlı izleyebilirsin.
Bu rehberde INMP441'in nasıl çalıştığını, I2S'in üç hattının ne iş yaptığını, ESP32 Arduino çekirdeğinin hem 2.x hem 3.x sürümlerinde derlenen hazır kodu, dBFS ile dB SPL arasındaki farkı ve gerçek bir ses seviyesi ölçerin formülünü adım adım göreceksin. Sonunda Raspberry Pi Pico ile MicroPython kullanımını, ucuz analog KY-038 ses sensörü ile farkını ve en sık yapılan bağlantı hatalarını da bulacaksın.

INMP441 nedir, nasıl çalışır?
INMP441, TDK InvenSense tarafından üretilen, her yönden eşit duyan (omnidirectional) bir MEMS mikrofondur. MEMS, silisyum üzerine işlenmiş mikroskobik bir zar ve sabit bir plakadan oluşan küçük bir kondansatör demektir: ses dalgası zarı titrettikçe kapasite değişir. Klasik bir elektret mikrofonda bu değişim zayıf bir analog gerilim olarak dışarı verilir; senin yükseltmen, filtrelemen ve ADC ile ölçmen gerekir. INMP441'in içinde ise ön yükselteç, örtüşme önleyici (anti-aliasing) filtre, 24 bitlik sigma-delta ADC ve I2S arayüzü bir aradadır. Yani mikrofondan çıkan şey artık gerilim değil, saat sinyaline uyarak gelen sayılardır. Bu sayede kablo üzerinde analog gürültü toplanmaz, kartın ADC kalitesi önemini kaybeder ve 3,3 V'luk her uygun mikrodenetleyici aynı ses kalitesini alır. Modül kartındaki küçük delik mikrofonun ses girişidir; kartı bir kutuya monte ederken bu deliği kapatmamaya dikkat et.
| Özellik | Değer |
|---|---|
| Tip | MEMS, yönsüz, dijital çıkışlı mikrofon |
| Arayüz | I2S, 24 bit, en anlamlı bit önce, ikiye tümleyen |
| Besleme | 1,8–3,3 V |
| Akım | Yaklaşık 1,4 mA |
| Hassasiyet | −26 dBFS (1 kHz, 94 dB SPL) |
| Sinyal/gürültü oranı (SNR) | 61 dBA |
| Frekans yanıtı | 60 Hz – 15 kHz |
| Maksimum ses basıncı (AOP) | 120 dB SPL |
| SCK frekansı | Yaklaşık 0,5–3,2 MHz (örnekleme yaklaşık 7,8–50 kHz) |
| Modül pinleri | VDD, GND, SD, L/R, WS, SCK |
I2S nedir? Üç hatla dijital ses
I2S (Inter-IC Sound), ses örneklerini yongalar arasında taşımak için geliştirilmiş seri bir veri yoludur ve adı benzese de I2C ile ilgisi yoktur. Üç hattı vardır: SCK (bit saati) her veri bitinin ne zaman okunacağını söyler, WS (word select, LRCLK da denir) o anda sol kanalın mı sağ kanalın mı gönderildiğini belirtir, SD ise verinin kendisidir. Bu düzende ESP32 ana cihazdır (master): iki saati de o üretir, mikrofon da saate uyarak veriyi SD hattına koyar. INMP441'de her çerçeve 64 SCK darbesinden oluşur: 32 bit sol kanal, 32 bit sağ kanal. Bu yüzden örnekleme hızı SCK / 64'tür; 16 kHz örnekleme için ESP32 yaklaşık 1,024 MHz'lik bir bit saati üretir. Mikrofon kendi kanalının 32 bitlik yuvasına 24 bitlik ölçümü en anlamlı bit önce yazar, kalan 8 bit sıfırdır. Kodda değeri 8 bit sağa kaydırmamızın sebebi budur.
| INMP441 pini | Görevi |
|---|---|
| VDD | Besleme, 1,8–3,3 V |
| GND | Toprak |
| SCK | Bit saati girişi (karttan gelir) |
| WS | Kanal seçme saati girişi (karttan gelir) |
| SD | Seri ses verisi çıkışı (mikrofondan karta) |
| L/R | Kanal seçimi: GND = sol kanal, VDD = sağ kanal |
INMP441 pin bağlantısı: ESP32 ve Raspberry Pi Pico
| INMP441 pini | 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 |
ESP32'de I2S sinyalleri GPIO matrisi üzerinden istediğin pine yönlendirilebilir; tablodaki 32, 25 ve 33 numaraları zorunlu değil, sadece güvenli seçimlerdir. Yalnız açılışta kartın davranışını belirleyen strapping pinlerinden (GPIO 0, 2, 5, 12, 15) ve flaş belleğe ayrılmış GPIO 6–11'den uzak dur. GPIO 34–39 yalnız giriş olduğu için SD hattına uyar ama SCK ve WS için kullanılamaz. Pico'da kural farklıdır: MicroPython I2S sürücüsü PIO kullanır ve WS pini, SCK pininden bir fazla olmak zorundadır (GP16 ve GP17 gibi). Kabloları 10–15 cm'den kısa tut; megahertz düzeyindeki saat sinyali uzun jumper kablolarda bozulur. Kartının pin düzenini pin haritası aracında kontrol edebilirsin.
Adım adım: ESP32 ile ilk ses okuma
- Arduino IDE'de ESP32 kart paketinin kurulu olduğundan emin ol ve Araçlar > Kart menüsünden ESP32 Dev Module seç. Kurulumu bilmiyorsan ESP32 Nedir? yazısına bak.
- Modülü breadboard'a tak; VDD'yi 3V3'e, GND'yi GND'ye, L/R'yi de GND'ye bağla.
- SCK'yi GPIO 32'ye, WS'yi GPIO 25'e, SD'yi GPIO 33'e bağla ve kabloları kısa tut.
- Aşağıdaki kodu yükle. Ek kütüphane gerekmez: 3.x çekirdeğinde ESP_I2S, 2.x çekirdeğinde driver/i2s.h zaten kart paketine dahildir.
- Seri Monitör'ü 115200 baud ile aç; sessiz bir odada yaklaşık 35–50 dB, konuşurken 55–70 dB civarında değerler görmelisin.
- Araçlar > Seri Çizici'yi açarak dBFS ve dB SPL eğrilerini canlı izle; mikrofonun yanında alkışla ve eğrinin sıçradığını gör.
ESP32 kodu: INMP441 ile ses seviyesi (dB) ölçme
Kod, ESP32 Arduino çekirdeğinin sürümünü ESP_ARDUINO_VERSION_MAJOR ile kontrol eder. 3.x sürümünde yeni ESP_I2S kütüphanesini, 2.x sürümünde ise ESP-IDF'nin klasik I2S sürücüsünü kullanır. İki yol da aynı micBegin() ve micRead() fonksiyonlarını sunduğu için loop() içindeki hesap değişmez. Her döngüde 512 örnek, yani 16 kHz'te 32 ms'lik ses okunur, DC kayması çıkarılır, RMS değeri bulunur ve desibele çevrilir.
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}| Kod parçası | Ne yapar? |
|---|---|
| SAMPLE_RATE = 16000 | Saniyede 16 000 örnek alınır; SCK frekansı 16 000 × 64 = 1,024 MHz olur. Konuşma için yeterlidir, müzik için 44 100 seçebilirsin (SCK yaklaşık 2,82 MHz). |
| 32 bit veri genişliği | INMP441 her WS çerçevesinde 64 SCK darbesi bekler; 16 bit seçersen çerçeve kısalır ve veri anlamsızlaşır. |
| MONO + LEFT / ONLY_LEFT | Yalnızca sol kanal okunur; L/R pini GND'ye bağlı olduğu için mikrofon sol yuvayı kullanır. |
| samples[i] >>= 8 | 32 bitlik yuvadaki 24 bitlik ölçümü ayıklar; değer −8 388 608 ile +8 388 607 arasında olur. |
| Ortalamayı çıkarma | Sinyaldeki küçük DC kaymasını siler; aksi hâlde RMS gereğinden büyük çıkar. |
| rms | Örneklerin karelerinin ortalamasının karekökü; sesin ortalama gücünü temsil eder. |
| dbfs + DB_OFFSET | Veri sayfasındaki −26 dBFS @ 94 dB SPL hassasiyetiyle sonucu dB SPL'ye çevirir. |
Ses seviyesi nasıl hesaplanır? dBFS ve dB SPL
Ses basıncı çok geniş bir aralıkta değiştiği için logaritmik desibel ölçeği kullanılır: genliğin iki katına çıkması yaklaşık 6 dB, on katına çıkması 20 dB artış demektir. Mikrofonun verdiği sayılar önce dBFS (tam ölçeğe göre desibel) cinsine çevrilir: dBFS = 20 × log10(RMS / tam ölçek RMS). Tam ölçek, tepe noktası en büyük 24 bitlik değer olan 8 388 608'e ulaşan bir sinüsün RMS değeridir, yani 8 388 608 / √2 ≈ 5 931 642. Bu ölçekte 0 dBFS mikrofonun taşma sınırıdır, daha küçük her ses negatif bir değer alır. Fiziksel ses basıncına, yani dB SPL'ye geçmek için veri sayfasındaki hassasiyet kullanılır: INMP441, 94 dB SPL'lik 1 kHz'lik bir sesi −26 dBFS olarak verir. Buradan dB SPL = dBFS + 94 − (−26) = dBFS + 120 formülü çıkar. Örneğin RMS değeri 5 932 çıktıysa dBFS = 20 × log10(0,001) = −60 olur ve ses seviyesi yaklaşık 60 dB SPL, yani normal bir konuşma düzeyidir.
| Ses kaynağı | Yaklaşık dB SPL | INMP441'de dBFS |
|---|---|---|
| Mikrofonun kendi gürültü tabanı | 33 | −87 |
| Sessiz oda | 40 | −80 |
| Normal konuşma (1 m) | 60 | −60 |
| Yoğun trafik, elektrikli süpürge | 70–80 | −50 ile −40 |
| Uzun süre maruz kalınırsa işitme riski | 85 | −35 |
| Ölçüm referansı (kalibratör) | 94 | −26 |
| Matkap, konser sahnesi önü | 100–110 | −20 ile −10 |
| Mikrofonun üst sınırı (AOP) | 120 | 0 |
Serial Plotter'da dalga formu çizmek
Desibel değeri sesin ne kadar yüksek olduğunu söyler; sesin şeklini görmek içinse ham örnekleri çizdirmen gerekir. Aynı taslakta yalnızca loop() fonksiyonunu aşağıdakiyle değiştir. Burada önemli bir sınır var: 115200 baud'luk seri hat saniyede yaklaşık 11 500 karakter taşır ve bu, saniyede 16 000 örneği yazdırmaya yetmez. Bu yüzden kod 512 örneklik bir bloğu ard arda yazdırır; blok yazılırken gelen ses kaçırılır ama çizicide gördüğün her parça kesintisiz, gerçek bir 32 ms'lik kesittir.
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}Mikrofona ıslık çaldığında çizicide düzgüne yakın bir sinüs görürsün. 1 kHz'lik bir ıslıkta bir periyot 1 ms sürer ve 16 kHz örneklemede 16 noktaya karşılık gelir; bir periyottaki nokta sayısını sayarak frekansı kabaca kestirebilirsin. Konuşma birçok frekansın karışımı olduğu için düzensiz, zarflı bir dalga çizer; alkış ise kısa ve çok yüksek bir sivri tepe üretir. Çizici ekseni otomatik ölçeklediği için sessizlikte küçük gürültü dalgalanmaları büyük görünebilir, bu normaldir. Seri Monitör ve Seri Çizici kullanımının ayrıntıları için Arduino Serial Monitor yazısına bakabilirsin.
Raspberry Pi Pico ile INMP441 (MicroPython)
Raspberry Pi Pico'da ayrı bir I2S birimi yoktur, ama programlanabilir PIO blokları I2S'i donanım hızında taklit eder ve MicroPython'un machine.I2S sınıfı bu işi senin yerine yapar. Ek dosya kurman gerekmez; güncel bir MicroPython sürümünün yüklü olması yeterlidir. Kodda bits=32 ve format=I2S.MONO seçilir, okunan örnekler yine 8 bit sağa kaydırılıp aynı formülle desibele çevrilir. Python döngüleri C'den yavaş olduğu için blok boyutunu 512 örnekte tutmak iyi bir dengedir; hesap sürerken gelen birkaç milisaniyelik sesin kaçması ölçüm sonucunu pek etkilemez. Arduino IDE ile Pico programlıyorsan arduino-pico çekirdeğindeki I2S kütüphanesi de aynı işi görür; orada da WS (LRCLK) pini BCLK pininin bir fazlası olmalıdır. MicroPython'a yeniysen önce Raspberry Pi Pico Nedir? yazısına göz at.
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 ile KY-038 analog ses sensörü farkı

KY-038, elektret bir mikrofon kapsülü, eşik ayarı için bir trimpot ve LM393 karşılaştırıcısından oluşan ucuz bir modüldür. Dijital çıkışı (DO), ses belirlediğin eşiği geçtiğinde durum değiştirir; analog çıkışı (AO) ise kapsülün ham gerilimini verir ve kartın ADC'siyle okunur. Bu yapı alkış algılamak ya da ortamda ses olup olmadığını anlamak için yeterlidir. Fakat modülde yükselteç olmadığı için sinyal çok zayıftır: Arduino Uno'nun 10 bitlik ADC'si konuşmada yalnızca birkaç basamaklık değişim görür, ESP32'nin ADC'si de gürültülüdür. INMP441 ise ölçümü mikrofonun içinde 24 bitle yapar; arada analog kablo, yükselteç ya da ADC olmadığı için gürültü tabanından taşma sınırına kadar yaklaşık 87 dB'lik bir aralığı temiz biçimde kaydeder. Özetle KY-038 bir ses anahtarıdır, INMP441 ise gerçek bir mikrofondur. Analog okumanın sınırlarını ADC rehberinde ayrıntılı olarak bulabilirsin.
| Özellik | INMP441 | KY-038 |
|---|---|---|
| Mikrofon türü | MEMS, dijital çıkışlı | Elektret kapsül, analog |
| Çıkış | I2S, 24 bitlik örnekler | AO analog gerilim + DO eşik çıkışı |
| Besleme | 1,8–3,3 V | 3,3–5 V |
| Uyumlu kartlar | ESP32, Pico ve I2S destekli kartlar | Uno dahil her kart |
| Ses kalitesi | Kayıt ve analiz için yeterli (60 Hz – 15 kHz) | Yalnızca kaba seviye |
| dB ölçümü | Formülle yapılabilir | Güvenilir değil |
| Tipik kullanım | Gürültü ölçer, ses kaydı, FFT, ses komutu | Alkış anahtarı, ses var/yok alarmı |
INMP441 ile proje fikirleri
- Müziğe duyarlı LED: Ses seviyesini WS2812B şeridinde yanan LED sayısına çevir; ayrıntılar için müziğe duyarlı LED ve WS2812B NeoPixel yazılarına bak.
- Sınıf gürültü trafik lambası: 55 dB altında yeşil, 55–70 dB arasında sarı, üstünde kırmızı yanan bir uyarı lambası yap.
- Web'den canlı gürültü paneli: dB değerini WebSocket ile tarayıcıya gönder ve telefondan grafik olarak izle; temel yapı ESP32 Web Server ve WebSocket yazısında.
- Akıllı ev gürültü sensörü: Ölçümleri MQTT üzerinden Home Assistant'a aktar; ESP32 MQTT ve Home Assistant rehberi işini kolaylaştırır.
- Bebek ağlama ya da köpek havlama uyarısı: Ses belirli bir süre eşiği aşarsa telefonuna Telegram botu ile mesaj gönder.
- Ses kaydedici: Örnekleri 16 bitlik WAV dosyası olarak SD kart modülüne yaz ve bilgisayarda dinle.
- Islıkla kontrol: FFT ile baskın frekansı bul ve belirli bir ıslık tonunda bir LED ya da röle tetikle.
Sık yapılan hatalar ve çözümleri
| Belirti | Olası sebep | Çözüm |
|---|---|---|
| dB SPL değeri −15,5 civarında sabit kalıyor | SD hattından hiç veri gelmiyor, tüm örnekler 0 | SD kablosunu ve L/R'nin GND'ye bağlı olduğunu kontrol et; olmazsa kanalı sağa çevir (3.x'te I2S_STD_SLOT_RIGHT, 2.x'te I2S_CHANNEL_FMT_ONLY_RIGHT) |
| Ses yükselince değer artmıyor, rastgele zıplıyor | SCK ile WS yer değiştirmiş ya da kablolar çok uzun | Pinleri tabloya göre düzelt, kabloları 10–15 cm'nin altına indir |
| Açılışta "CONFLICT! The new i2s driver can't work along with the legacy i2s driver" hatası | 3.x çekirdeğinde eski driver/i2s.h ile yeni sürücü birlikte kullanılmış | Tek sürücü kullan; buradaki #if yapısı doğru olanı otomatik seçer |
| dB değerleri desibelmetreden 10–20 dB farklı | Bit kaydırma yanlış, DC çıkarılmamış ya da kalibrasyon yapılmamış | Kaydırmayı 8 bit yap, ortalamayı çıkar, sabit bir tonla kalibre et |
| Pico'da I2S oluşturulurken ValueError | WS pini SCK pininin bir fazlası değil | SCK = GP16, WS = GP17 gibi ardışık pinler kullan |
| Mikrofon ısınıyor ya da hiç yanıt vermiyor | VDD 5 V'a bağlanmış | Hemen 3V3'e geçir; mikrofon zarar görmüş olabilir, yenisini dene |
| Seri Çizici'de dalga kesik kesik görünüyor | Seri hat saniyede 16 000 örneği taşıyamıyor | Normaldir; daha akıcı görüntü için baud hızını 921600'e çıkar |
INMP441, birkaç kablo ve kısa bir kodla ESP32'ye gerçek bir dijital mikrofon kazandırır; ses seviyesi ölçmekten müziğe duyarlı ışıklara kadar pek çok projenin temelidir. Analog bir sensörle yetinmek yerine sesi sayılarla işlemek istediğin her durumda ilk tercih budur. BlueGrays uygulamasında ESP32 ile LED, buzzer, WS2812B şerit ve web sunucusu projelerine adım adım devre şeması ve kodla bakabilir, bu mikrofonu o projelerin üzerine kolayca ekleyebilirsin.
Sıkça sorulan sorular
INMP441 Arduino Uno ile çalışır mı?
Hayır, pratikte çalışmaz. Arduino Uno ve Nano'da I2S donanımı yoktur, 5 V lojikle çalışırlar ve 2 KB RAM ses arabelleği için yetersizdir. INMP441 için ESP32, ESP32-S3, Raspberry Pi Pico ya da I2S destekli 3,3 V'luk bir kart kullanmalısın.
INMP441'in L/R pini ne işe yarar?
L/R pini mikrofonun stereo çerçevede hangi kanalı kullanacağını seçer: GND'ye bağlıysa sol, 3,3 V'a bağlıysa sağ kanal. İki INMP441'in SCK, WS ve SD hatlarını ortak bağlayıp birini sola, diğerini sağa ayarlarsan tek I2S hattından stereo ses alırsın. Pini boşta bırakma; okumalar sıfır ya da kararsız gelir.
INMP441 ile ses kaydı yapılabilir mi?
Evet. 24 bitlik örnekleri 16 bite indirip WAV başlığıyla SD karta yazarsan bilgisayarda dinlenebilen bir kayıt elde edersin. 16 kHz örnekleme konuşma için yeterlidir; bir dakikalık 16 bit mono kayıt yaklaşık 1,9 MB yer tutar.
INMP441 ile desibel ölçümü ne kadar doğru?
Veri sayfasındaki −26 dBFS hassasiyetiyle yapılan hesap, kalibrasyon olmadan da birkaç dB içinde sonuç verir; mikrofonların hassasiyet toleransı ±1 dB'dir. Hesap A ağırlıklı olmadığı için alçak frekanslı uğultunun yoğun olduğu ortamlarda desibelmetreden yüksek çıkabilir. Bilinen bir ses kaynağıyla kalibre edersen oda gürültüsü için gayet iyi sonuç alırsın, ama resmi bir ölçüm cihazının yerini tutmaz.
INMP441 mi KY-038 mi almalıyım?
Yalnızca alkış ya da yüksek ses algılayıp bir şeyi tetikleyeceksen KY-038 yeterlidir ve her kartla çalışır. Ses seviyesini dB olarak ölçmek, ses kaydetmek, frekans analizi yapmak ya da müziğe duyarlı ışık yapmak istiyorsan INMP441 çok daha temiz ve doğru sonuç verir.
ESP32'de INMP441 neden hep 0 okuyor?
En sık sebepler L/R pininin boşta kalması, koddaki kanalın mikrofonun ayarıyla uyuşmaması ve SD kablosunun yanlış pine takılmasıdır. Önce L/R'yi GND'ye bağla, sonra koddaki kanalı sağa çevirerek dene. Bit genişliğinin 32 bit olduğundan ve modülün 3V3 ile beslendiğinden de emin ol.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
ESP32 ile LED Yakma
ESP32 ile temel GPIO çıkışı kullanımını öğretir. Bir LED'i dijital pinden açıp kapatarak yanıp sönme efekti elde ederiz. Arduino UNO'daki klasik blink projesinin ESP32 versiyonu; Arduino ortamındaki temel blink komutları aynıdır, ancak ESP32'nin pin yerleşimi ve 3,3 V GPIO seviyeleri Arduino UNO'dan farklıdır.

Buzzer Kullanımı
Kapı zili ya da alarm sesi nasıl çıkar, hiç merak ettin mi? Arduino küçük bir buzzer'ı kısa aralıklarla öttürür: bip, sus, bip, sus. Sesin elektrikle nasıl üretildiğini görür, ileride melodi çalan pro

ESP32 PWM ile LED Soldurma (Fade)
LED'in parlaklığını yumuşak şekilde 0'dan max'a, max'tan 0'a değiştirme. Arduino'daki gibi analogWrite() ile PWM kontrolü yapıyoruz — ESP32 Arduino Core 3.0+ ile aynı syntax sorunsuz çalışır. Pin tanımı + pinMode + analogWrite yeterli.

ESP32 Buzzer ile Melodi Çalma
Pasif buzzer ile basit bir melodi (Twinkle Twinkle Little Star) çalma. Arduino'daki gibi tone() ve noTone() fonksiyonlarıyla nota çalıyoruz — ESP32 Arduino Core 3.0+ ile aynı syntax çalışır. Pasif buzzer kullanılmalı (aktif buzzer melodi çalmaz).

ESP32 WS2812B NeoPixel Şerit Kontrolü
WS2812B (NeoPixel) adreslenebilir LED'ler, tek bir veri pini üzerinden zincirleme kontrol edilebilen akıllı RGB LED'lerdir. Bu projede 8 LED'lik bir WS2812B şeridi Adafruit_NeoPixel kütüphanesi ile kontrol edip akıcı bir gökkuşağı animasyonu üreteceğiz. ESP32'nin 3.3V mantık seviyesi çoğu WS2812B partisinde sorunsuz çalışsa da, kararsızlık durumunda 470Ω seri direnç ve 1000µF kondansatör çözümünü göstereceğiz. Animasyon, HSV renk uzayında ton (hue) değerini kaydırarak elde edilir.

ESP32 Async Web Server (LCD'de IP Göstergeli)
Bu projede ESP32'yi aynı Wi-Fi ağındaki telefonunuzdan veya bilgisayarınızdan kontrol edebileceğiniz asenkron bir web sunucusuna dönüştürüyoruz. ESPAsyncWebServer kütüphanesi sayesinde sunucu birden fazla isteği aynı anda işleyebiliyor (klasik WebServer.h gibi tek istekte bloklamıyor). Tarayıcıdan ESP32'nin IP adresine bağlanıp ON/OFF butonlarına basarak (/on ve /off adresleri) GPIO 5'e bağlı LED'i açıp kapatabileceksiniz.

ESP32 WebSocket Sayaç (2 Buton + LCD + Web Realtime)
Bu projede ESP32'ye bağlı iki butonla (GPIO 5 artırır, GPIO 4 azaltır) bir sayaç değiştirilir. Değer hem 16x2 I2C LCD'de hem de ESPAsyncWebServer'ın WebSocket desteğiyle bağlı tüm tarayıcılarda anında güncellenir; sayfayı yenilemek gerekmez. HTTP polling yerine tek bir kalıcı bağlantı kullanılır ve ESP32 yeni değeri ws.textAll() ile herkese gönderir.

ESP32 HTTPClient + Hava Durumu API (SSD1306 OLED Ekranlı)
Bu projede ESP32 ile internet üzerinden hava durumu API'sine (wttr.in) HTTPClient.h kullanarak REST API çağrısı yapıyoruz. Bir önceki I2C LCD versiyonundan farklı olarak burada SSD1306 OLED (128×64) ekran kullanıyoruz — büyük font, vector ikonlar ve tek ekranda zengin görsel sunum mümkün oluyor. Hava durumu için 7 farklı vector ikon (güneşli, parçalı bulutlu, bulutlu, yağmurlu, karlı, fırtınalı, sisli) runtime'da çiziliyor (bitmap dosyası gerektirmez). Sıcaklık 3x büyük fontla ortada, hava dur
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

