Parçalar · 8 dk okuma

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 mikrofonu okumak için ESP32 geliştirme kartı
INMP441'i okumak için I2S donanımı olan bir kart gerekir; ESP32'de iki I2S birimi vardır ve sinyaller istediğin GPIO'ya yönlendirilebilir.

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.

ÖzellikDeğer
TipMEMS, yönsüz, dijital çıkışlı mikrofon
ArayüzI2S, 24 bit, en anlamlı bit önce, ikiye tümleyen
Besleme1,8–3,3 V
AkımYaklaşı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 pinleriVDD, 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 piniGörevi
VDDBesleme, 1,8–3,3 V
GNDToprak
SCKBit saati girişi (karttan gelir)
WSKanal seçme saati girişi (karttan gelir)
SDSeri ses verisi çıkışı (mikrofondan karta)
L/RKanal seçimi: GND = sol kanal, VDD = sağ kanal

INMP441 pin bağlantısı: ESP32 ve Raspberry Pi Pico

INMP441 piniESP32Raspberry Pi Pico
VDD3V33V3(OUT) (pin 36)
GNDGNDGND
SCKGPIO 32GP16
WSGPIO 25GP17
SDGPIO 33GP18
L/RGNDGND
INMP441'i asla 5 V'a bağlama; besleme için mutlak sınır yaklaşık 3,6 V'tur ve 5 V mikrofonu kalıcı olarak bozabilir. Aynı sebeple Arduino Uno ve Nano bu modül için uygun değildir: bu kartlarda I2S donanımı yoktur, 5 V lojikle çalışırlar ve 2 KB RAM ses arabelleği için yetmez. İkinci sık hata L/R pinini boşta bırakmaktır; boşta kalan pin kanalı belirsizleştirir ve okumalar sıfır ya da rastgele gelir.

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

  1. 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.
  2. Modülü breadboard'a tak; VDD'yi 3V3'e, GND'yi GND'ye, L/R'yi de GND'ye bağla.
  3. SCK'yi GPIO 32'ye, WS'yi GPIO 25'e, SD'yi GPIO 33'e bağla ve kabloları kısa tut.
  4. 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.
  5. 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.
  6. 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.

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}
Kod parçasıNe yapar?
SAMPLE_RATE = 16000Saniyede 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ğiINMP441 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_LEFTYalnızca sol kanal okunur; L/R pini GND'ye bağlı olduğu için mikrofon sol yuvayı kullanır.
samples[i] >>= 832 bitlik yuvadaki 24 bitlik ölçümü ayıklar; değer −8 388 608 ile +8 388 607 arasında olur.
Ortalamayı çıkarmaSinyaldeki 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_OFFSETVeri 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 SPLINMP441'de dBFS
Mikrofonun kendi gürültü tabanı33−87
Sessiz oda40−80
Normal konuşma (1 m)60−60
Yoğun trafik, elektrikli süpürge70–80−50 ile −40
Uzun süre maruz kalınırsa işitme riski85−35
Ölçüm referansı (kalibratör)94−26
Matkap, konser sahnesi önü100–110−20 ile −10
Mikrofonun üst sınırı (AOP)1200
Bu formül yalnızca veri sayfası değerine dayanır; hassasiyet her mikrofonda ±1 dB sapabilir ve hesap A ağırlıklı değildir. Daha doğru sonuç için sabit bir sesi (örneğin 1 kHz'lik bir ton) hem INMP441 ile hem de bir desibelmetre ya da telefondaki ses ölçer uygulamasıyla aynı anda ölç, aradaki farkı koddaki 120 sayısına ekle ya da çıkar. Değerleri daha sakin göstermek için son birkaç ölçümün ortalamasını al; sensör verisi filtreleme yazısındaki hareketli ortalama burada da işe yarar.

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.

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}

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.

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 ile KY-038 analog ses sensörü farkı

KY-038 analog ses sensörü modülü
KY-038: elektret kapsül, eşik ayarı için trimpot ve LM393 karşılaştırıcısı bulunan analog ses sensörü.

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.

ÖzellikINMP441KY-038
Mikrofon türüMEMS, dijital çıkışlıElektret kapsül, analog
ÇıkışI2S, 24 bitlik örneklerAO analog gerilim + DO eşik çıkışı
Besleme1,8–3,3 V3,3–5 V
Uyumlu kartlarESP32, Pico ve I2S destekli kartlarUno dahil her kart
Ses kalitesiKayıt ve analiz için yeterli (60 Hz – 15 kHz)Yalnızca kaba seviye
dB ölçümüFormülle yapılabilirGüvenilir değil
Tipik kullanımGürültü ölçer, ses kaydı, FFT, ses komutuAlkış 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

BelirtiOlası sebepÇözüm
dB SPL değeri −15,5 civarında sabit kalıyorSD hattından hiç veri gelmiyor, tüm örnekler 0SD 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ıyorSCK ile WS yer değiştirmiş ya da kablolar çok uzunPinleri 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 ValueErrorWS pini SCK pininin bir fazlası değilSCK = GP16, WS = GP17 gibi ardışık pinler kullan
Mikrofon ısınıyor ya da hiç yanıt vermiyorVDD 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üyorSeri hat saniyede 16 000 örneği taşıyamıyorNormaldir; daha akıcı görüntü için baud hızını 921600'e çıkar
Bağlantıyı test etmenin en hızlı yolu dB kodunu yükleyip mikrofona hafifçe üflemektir. Değer 40'larda dolaşıp üflediğinde 90'ların üstüne çıkıyorsa her şey doğrudur. Değer −15,5 civarında hiç kıpırdamıyorsa veri gelmiyor demektir; kodla uğraşmadan önce L/R ve SD kablolarını kontrol et.

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.

Tüm projeleri gör
ESP32 ile LED Yakma
#103Başlangıç

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.

4.7(37)
100
Buzzer Kullanımı
#13Başlangıç

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

4.7(89)
162
ESP32 PWM ile LED Soldurma (Fade)
#110Başlangıç

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.

4.8(36)
55
ESP32 Buzzer ile Melodi Çalma
#114Başlangıç
Premium

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

4.8(30)
55
ESP32 WS2812B NeoPixel Şerit Kontrolü
#126Orta
Premium

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.

4.9(19)
30
ESP32 Async Web Server (LCD'de IP Göstergeli)
#129İleri

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.

4.8(16)
26
ESP32 WebSocket Sayaç (2 Buton + LCD + Web Realtime)
#130İleri
Premium

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.

4.5(14)
23
ESP32 HTTPClient + Hava Durumu API (SSD1306 OLED Ekranlı)
#134İleri
Premium

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

4.3(10)
20