Parçalar · 13 dk okuma

Arduino Ses Sensörü (KY-038): Alkışla Lamba ve Ses Seviyesi

Arduino ses sensörü KY-038 ve KY-037 nasıl çalışır? Potansiyometre ayarı, tepe-tepe ses ölçümü, çift alkışla lamba, LED bar, ESP32 ve Pico kodu, dB gerçeği.

Arduino ses sensörü denince akla ilk gelen modül KY-038'dir: küçük bir elektret mikrofonu, bir LM393 karşılaştırıcıyı ve hassasiyet ayarı için mavi bir potansiyometreyi aynı kartta birleştiren ucuz bir parçadır. Büyük mikrofonlu kardeşi KY-037 de aynı şekilde çalışır. Kullanmak için kütüphane gerekmez: DO pini ses belirli bir eşiği aştığında durum değiştirir ve digitalRead() ile okunur; AO pini ise mikrofonun ham sinyalini verir ve analogRead() ile okunur. Alkışla yanan lambalar, gürültü uyarıcıları ve sese tepki veren ışıklar bu modülle yapılır.

Ancak bu sensörün önemli bir sınırı var ve birçok anlatım bunu atlıyor: KY-038 bir ses var mı, yok mu dedektörüdür; ses kaydetmez, konuşmayı tanımaz ve desibel ölçemez. Bu yazıda modülün içindeki devrenin nasıl çalıştığını, potansiyometrenin doğru ayarını, analog okumanın neden çoğu zaman hiç değişmiyormuş gibi göründüğünü ve sesin şiddetini tepe-tepe genlik yöntemiyle nasıl doğru ölçeceğini öğreneceksin. Ardından çift alkışla lamba açıp kapatan bir devre ve 8 LED'li bir ses seviyesi göstergesi kuracak, aynı işleri ESP32 ve Raspberry Pi Pico ile yapacak ve gerçek ses ölçümü için hangi modüllere geçmen gerektiğini göreceksin.

KY-038 ses sensörü modülü (elektret mikrofon ve LM393)
KY-038 ses sensörü: sağda elektret mikrofon, ortada LM393 karşılaştırıcı ve mavi hassasiyet potansiyometresi, solda AO, G, + ve DO pinleri.

Ses sensörü nedir, nasıl çalışır?

Kartın ucundaki gümüş renkli silindir bir elektret kondenser mikrofondur. İçinde ince bir zar ile kalıcı elektrik yükü taşıyan bir plaka karşılıklı durur ve küçük bir kondansatör oluşturur. Ses, havadaki basınç dalgalanmasıdır; bu dalgalanma zarı ileri geri oynattıkça kondansatörün kapasitesi değişir ve çok küçük bir gerilim değişimi oluşur. Kapsülün içindeki minik bir JFET transistör bu sinyali tamponlar; bu yüzden elektret mikrofon bir direnç üzerinden beslenir ve kutupludur. Sonuçta mikrofon ucunda, sabit bir DC gerilimin üzerine binmiş ve yalnızca birkaç milivoltluk bir ses dalgası elde edilir.

Kartın ortasındaki 8 bacaklı LM393 yongası iki karşılaştırıcı (comparator) içerir ve modül bunlardan birini kullanır. Karşılaştırıcı iki gerilime bakar: mikrofondan gelen sinyal ile potansiyometrenin belirlediği eşik. Sinyal eşiği geçtiği anda çıkış durum değiştirir, DO pini ve kart üzerindeki ikinci LED buna göre tepki verir. Burada çok önemli bir ayrıntı var: karşılaştırıcı bir yükselteç değildir. Sinyali büyütmez, yalnızca "eşikten büyük mü, küçük mü" sorusunu cevaplar. AO pinine ise mikrofonun yükseltilmemiş ham sinyali gelir; analog okumanın zayıf olmasının sebebi budur.

ÖzellikDeğer
MikrofonElektret kondenser kapsül, her yönden ses alır
KarşılaştırıcıLM393 (çift karşılaştırıcı, biri kullanılır)
Besleme3,3–5 V
AkımBirkaç mA (LED'lerle birlikte yaklaşık 5–10 mA)
ÇıkışlarAO: ham mikrofon sinyali, DO: eşik çıkışı
Hassasiyet ayarıMavi, çok turlu trimpot (genellikle 3296 tipi)
LED'lerBiri güç, diğeri DO durumu
Pin sırasıAO, G, +, DO

KY-038 ve KY-037 farkı

KY-038 ve KY-037 aynı devreyi, aynı LM393'ü ve aynı pin sırasını kullanır; bu yazıdaki bütün kodlar ikisinde de değiştirmeden çalışır. Fark mikrofon kapsülündedir: KY-037 daha büyük bir kapsül taşır ve "yüksek hassasiyetli ses sensörü" diye satılır, KY-038 ise daha küçük kapsüllüdür ve sensör setlerinde en sık karşılaşılan modeldir. Pratikte iki model de yakındaki yüksek sesleri iyi algılar, odanın öbür ucundaki konuşmayı ise algılamaz. Piyasada ayrıca yalnızca dijital çıkışı olan 3 pinli LM393 ses modülleri de bulunur; bunların çıkışı çoğu kartta ses gelince LOW olur.

ModelPinlerMikrofonNot
KY-038AO, G, +, DOKüçük kapsülSensör setlerindeki en yaygın model
KY-037AO, G, +, DOBüyük kapsülAynı devre ve aynı kod; genellikle biraz daha duyarlı
3 pinli LM393 ses modülüVCC, GND, OUTKüçük kapsülYalnızca dijital çıkış; OUT genellikle sesle LOW olur

Ses sensörü bağlantısı: Arduino Uno, ESP32 ve Pico

Modül piniArduino UnoESP32Raspberry Pi Pico
+5V3V33V3(OUT), pin 36
GGNDGNDGND, pin 38
AOA0GPIO 34 (ADC1)GP26 (ADC0), pin 31
DOD2GPIO 27GP15, pin 20
ESP32 ve Pico'nun pinleri 3,3 V'a göre tasarlanmıştır. Ses sensörünü bu kartlarda 5V, VIN ya da VBUS pininden değil, 3V3 pininden besle; aksi halde DO çıkışı 5 V'a çıkar ve giriş pinine zarar verebilir. ESP32'de AO için ADC1 pinlerinden birini (GPIO 32–39) seç: ADC2 pinleri Wi-Fi açıkken analogRead() ile okunamaz.

Dijital çıkış (DO) ve potansiyometre ayarı

DO pini bir evet/hayır cevabıdır. Birçok KY-038 kartında ses eşiği aştığında DO HIGH olur ve ikinci LED yanar; bazı klon kartlarda ve 3 pinli modüllerde ise tam tersi olur. Bu yüzden kodlarda sesin geldiği seviyeyi SOUND_ACTIVE adlı bir sabitte tutacağız. İkinci önemli nokta: DO bir alkış boyunca tek ve uzun bir darbe vermez. Ses dalgası saniyede yüzlerce kez eşiğin üstüne çıkıp altına indiği için çıkış da aynı hızla açılıp kapanır; tek bir alkış, toplam birkaç on milisaniye süren ve çok kısa darbelerden oluşan bir darbe yağmuru üretir. Çoğu kartta karşılaştırıcıya histerezis eklenmediğinden, eşiğe yakın seslerde çıkış ayrıca titrer. Bu yüzden DO'yu delay() içermeyen hızlı bir döngüyle ya da kesmeyle okumalı ve birbirine yakın darbeleri tek bir olay saymalısın.

  1. Modülü bağla ve sensörü kullanılacağı yere, normal ortam gürültüsünün olduğu bir anda yerleştir; ayarı her zaman gerçek ortamda yap.
  2. Kart üzerindeki DO LED'ine bak. Sessizken sürekli yanıyorsa eşik fazla hassastır; potansiyometreyi küçük bir tornavidayla LED sönene kadar çevir.
  3. LED hiç yanmıyorsa ters yöne çevirerek LED'in yanmaya başladığı sınır noktasını bul.
  4. Bu sınırdan, LED'in sönük kaldığı yöne doğru yarım ya da bir tur geri gel. Böylece buzdolabı ya da fan gibi sürekli gürültüler tetikleme yapmaz.
  5. Yaklaşık bir metreden alkışla: LED kısa bir an yanmalı. Normal konuşmada da yanıyorsa biraz daha az hassas tarafa, alkışta yanmıyorsa biraz daha hassas tarafa çevir.
Bu kartlardaki mavi potansiyometre genellikle 3296 tipi çok turlu bir trimpottur ve bir uçtan diğerine yaklaşık 25 tur döner. Birkaç tur çevirip LED'de hiçbir değişiklik görmüyorsan bozuk değildir, yalnızca daha fazla çevirmen gerekir. Uca geldiğinde vida boşa dönmeye başlar; zorlamana gerek yoktur.
Arduino (C++)
1// KY-038 DO testi: sesi algıla ve dahili LED'i yak / KY-038 DO test: detect sound and light the built-in LED
2const int SOUND_DO = 2;               // modülün DO pini / module DO pin
3const int SOUND_ACTIVE = HIGH;        // ses gelince HIGH; kartın tersse LOW / HIGH on sound; LOW if your board is inverted
4const unsigned long HOLD_MS = 200;    // yeni olay için gereken sessizlik / silence needed for a new event
5
6unsigned long lastSound = 0;
7unsigned long events = 0;
8
9void setup() {
10  Serial.begin(9600);
11  pinMode(SOUND_DO, INPUT);
12  pinMode(LED_BUILTIN, OUTPUT);
13}
14
15void loop() {
16  unsigned long now = millis();
17  if (digitalRead(SOUND_DO) == SOUND_ACTIVE) {
18    if (now - lastSound > HOLD_MS) {  // sessizlikten sonra ilk darbe / first pulse after silence
19      events++;
20      Serial.print(F("Ses algilandi / Sound detected #"));
21      Serial.println(events);
22    }
23    lastSound = now;                  // darbe yağmuru süreyi uzatır / the pulse burst extends the time
24  }
25  digitalWrite(LED_BUILTIN, now - lastSound < HOLD_MS ? HIGH : LOW);  // LED en az 200 ms yanar / LED stays on at least 200 ms
26}

Kod DO pinini her döngüde delay() olmadan okur. DO her aktif olduğunda lastSound zamanı yenilenir; yeni bir olay ancak 200 ms'lik bir sessizlikten sonra sayılır, böylece bir alkışın darbe yağmuru Seri Monitör'de tek satır olarak görünür. Dahili LED de en az 200 ms yanık tutulur; yoksa milisaniyelik darbeleri gözünle göremezsin. Sessiz ortamda sayaç durmadan artıyorsa ya eşik çok hassastır ya da kartın DO çıkışı ters çalışıyordur; ikinci durumda SOUND_ACTIVE değerini LOW yap.

Analog okuma (AO) neden zayıf?

Yeni başlayanların çoğu AO'yu A0'a bağlayıp analogRead() değerini yazdırır ve sonuçta 500 civarında, sesle neredeyse hiç değişmeyen bir sayı görür. Sensör bozuk değildir; sorun ölçeğin kendisidir. Arduino Uno'nun 10 bitlik ADC'si 0–5 V aralığını 1024 adıma böler, yani bir adım yaklaşık 4,9 mV eder. Mikrofonun ürettiği sinyal ise normal seslerde bu adımdan çok daha küçüktür:

SesYaklaşık seviyeMikrofon çıkışı (tepe-tepe)Uno'da ADC adımı
Fısıltı30 dB SPL~0,01 mV0
Normal konuşma (1 m)60 dB SPL~0,4 mV0 (görünmez)
Yüksek sesli TV, trafik80 dB SPL~3,6 mV0–1
Çok yüksek ses (1 Pa)94 dB SPL~18 mV3–4
Yakında sert alkış ya da korna110 dB SPL~110 mV~23

Tablo, tipik bir elektret kapsülün duyarlılığı olan −44 dBV/Pa değeriyle ve sinüs biçimli bir ses varsayılarak hesaplandı. Kartın mikrofon besleme direncine göre gerçek değerler birkaç kat büyük olabilir ama sonuç değişmez: AO yalnızca yakın ve yüksek sesleri net görür, normal konuşma ve fısıltı ise Uno'nun çözünürlüğünün altında kalır. ADC'nin nasıl çalıştığını ADC nedir? yazısında ayrıntılı bulabilirsin.

İkinci sebep sesin doğasıdır. Ses, bir DC seviyenin etrafında yukarı aşağı salınan bir dalgadır. Tek bir analogRead() bu dalganın rastgele bir anını yakalar: tepeye, çukura ya da tam orta noktaya denk gelebilir. Bu yüzden tek bir okumanın büyüklüğü sesin şiddeti hakkında hiçbir şey söylemez. Üçüncü sebep hızdır: Uno bir analog okumayı yaklaşık 100 mikrosaniyede yapar, yani saniyede en fazla 10.000 civarında örnek alır. Bu, ses seviyesini izlemek için yeterlidir ama ses kaydetmek ya da frekans analizi yapmak için yetersizdir. Son olarak USB'den gelen 5 V gerilimdeki gürültü de doğrudan AO'ya karışır. Bu sorunların ilk ikisini doğru ölçüm yöntemiyle çözebilirsin.

Tepe-tepe genlik ölçme: sesin şiddetini doğru okumak

Doğru yöntem, kısa bir zaman penceresi boyunca olabildiğince çok örnek alıp en büyük ve en küçük değeri bulmaktır. İkisinin farkı tepe-tepe genliktir (peak-to-peak) ve DC seviyeden bağımsız olarak sesin ne kadar güçlü olduğunu gösterir. Pencere için 50 ms iyi bir seçimdir: insan kulağının duyabildiği en düşük frekans olan 20 Hz'in bir periyodu tam 50 ms'dir, yani en kalın sesin bile bir tam dalgası pencereye sığar. Uno bu sürede 450–500 civarında örnek alır.

Arduino (C++)
1// Tepe-tepe genlik ölçümü (Seri Çizici için) / Peak-to-peak amplitude (for the Serial Plotter)
2const int SOUND_AO = A0;                 // modülün AO pini / module AO pin
3const unsigned long WINDOW_MS = 50;      // 50 ms = 20 Hz'in bir periyodu / one period of 20 Hz
4
5void setup() {
6  Serial.begin(115200);
7}
8
9void loop() {
10  int minV = 1023, maxV = 0;
11  long sum = 0;
12  int count = 0;
13  unsigned long start = millis();
14  while (millis() - start < WINDOW_MS) { // yaklaşık 450-500 örnek / about 450-500 samples
15    int v = analogRead(SOUND_AO);
16    if (v < minV) minV = v;
17    if (v > maxV) maxV = v;
18    sum += v;
19    count++;
20  }
21  int p2p = maxV - minV;                 // tepe-tepe genlik / peak-to-peak amplitude
22  float mv = p2p * 5000.0 / 1024.0;      // milivolt karşılığı / in millivolts
23
24  Serial.print(F("p2p:"));
25  Serial.print(p2p);
26  Serial.print(F(" ortalama_avg:"));     // AO'nun DC seviyesi; istemezsen bu iki satırı sil / DC level of AO; delete these two lines if not needed
27  Serial.print(sum / count);
28  Serial.print(F(" mV:"));
29  Serial.println(mv, 1);
30}

Kodu yükledikten sonra Araçlar menüsünden Seri Çizici'yi (Serial Plotter) aç ve hızı 115200 yap. Sessiz bir odada p2p genellikle 0–3 arasında kalır; mikrofonun yanında konuşunca birkaç birim, yakından alkışlayınca onlarca birim yükselir. ortalama_avg değeri AO'nun DC seviyesidir ve grafiğin ölçeğini büyüttüğü için p2p'yi rahat izlemek istersen ortalama_avg ile ilgili iki satırı silebilirsin. Bazı kartlarda potansiyometre bu DC seviyeyi de kaydırır; ortalama 0'a ya da 1023'e yapışmışsa sinyal kırpılıyordur, potansiyometreyi değer ortalara gelene kadar çevir. Seri Çizici'yi ilk kez kullanıyorsan Arduino Seri Monitör yazısına göz at.

Adım adım: çift alkışla lamba açıp kapatmak

Alkışla lamba, ses sensörünün en bilinen projesidir; ama tek alkışla çalışan bir devre kapı çarpması, düşen bir kitap ya da öksürükle de tetiklenir ve lamba durmadan yanıp söner. Çözüm, belirli bir ritmi aramaktır: aşağıdaki kod yalnızca birbirinden 0,12 ile 0,7 saniye arayla gelen tam iki alkışa tepki verir. Tek bir ses ya da üç ve daha fazla ses (müzik, alkış tufanı, köpek havlaması) yok sayılır.

  1. KY-038'in + pinini 5V'a, G pinini GND'ye, DO pinini D2'ye bağla.
  2. Röle modülünün VCC pinini 5V'a, GND pinini GND'ye, IN pinini D7'ye bağla. Rölenin çalışma mantığını ve yük tarafının bağlantısını Röle Modülü Nedir? yazısında bulabilirsin; ilk denemeleri lamba yerine rölenin kendi LED'iyle yap.
  3. Kodu yükle ve Seri Monitör'ü 9600 baud hızında aç.
  4. Sensöre bir iki metreden iki kez alkışla. Her alkış için Seri Monitör'de yalnızca bir "Alkis" satırı görmelisin; tek alkış birden fazla sayılıyorsa potansiyometreyi biraz daha az hassas tarafa çevir.
  5. Lambanın ikinci alkıştan yaklaşık 0,7 saniye sonra durum değiştirdiğini gör.
Arduino (C++)
1// Çift alkışla lamba (röle) / Double-clap lamp (relay)
2const int SOUND_DO = 2;                     // KY-038 DO pini / KY-038 DO pin
3const int RELAY = 7;                        // röle modülü IN / relay module IN
4const int SOUND_ACTIVE = HIGH;              // kartın tersse LOW / LOW if your board is inverted
5const int RELAY_ON = LOW;                   // aktif LOW röle modülü / active-LOW relay module
6const int RELAY_OFF = HIGH;
7const unsigned long QUIET_GAP_MS = 120;     // yeni alkış için gereken sessizlik / silence needed before a new clap
8const unsigned long CLAP_WINDOW_MS = 700;   // dizinin bittiğine karar verme süresi / time to decide the series is over
9const unsigned long LOCKOUT_MS = 1000;      // röle tıkırtısını yok say / ignore the relay click
10
11int clapCount = 0;
12unsigned long lastPulse = 0;                // DO'nun son aktif olduğu an / last time DO was active
13unsigned long lastToggle = 0;               // lambanın son değiştiği an / last time the lamp changed
14bool lampOn = false;
15
16void setup() {
17  Serial.begin(9600);
18  pinMode(SOUND_DO, INPUT);
19  pinMode(RELAY, OUTPUT);
20  digitalWrite(RELAY, RELAY_OFF);           // lamba kapalı başlar / lamp starts off
21}
22
23void loop() {
24  unsigned long now = millis();
25
26  if (digitalRead(SOUND_DO) == SOUND_ACTIVE) {
27    bool locked = now - lastToggle < LOCKOUT_MS;
28    if (!locked && now - lastPulse >= QUIET_GAP_MS) {  // sessizlikten sonra ilk darbe = yeni alkış / first pulse after silence = new clap
29      clapCount++;
30      Serial.print(F("Alkis / Clap: "));
31      Serial.println(clapCount);
32    }
33    lastPulse = now;                        // aynı alkışın darbeleri süreyi uzatır / pulses of the same clap extend the time
34  }
35
36  if (clapCount > 0 && now - lastPulse > CLAP_WINDOW_MS) {  // dizi bitti / the series is over
37    if (clapCount == 2) {                   // yalnız tam iki alkış / exactly two claps only
38      lampOn = !lampOn;
39      digitalWrite(RELAY, lampOn ? RELAY_ON : RELAY_OFF);
40      lastToggle = now;
41      if (lampOn) Serial.println(F("Lamba ACIK / Lamp ON"));
42      else Serial.println(F("Lamba KAPALI / Lamp OFF"));
43    }
44    clapCount = 0;                          // 1, 3 ve fazlası yok sayılır / 1, 3 or more are ignored
45  }
46}
SabitDeğerGörevi
SOUND_ACTIVEHIGHDO'nun ses gelince aldığı seviye; kartın ters çalışıyorsa LOW yap
QUIET_GAP_MS120 msYeni bir alkış sayılması için gereken sessizlik; aynı alkışın darbe yağmuru ve yankısı tek alkış sayılır
CLAP_WINDOW_MS700 msSon sesten sonra bu kadar sessizlik olunca dizi bitmiş sayılır ve alkışlar değerlendirilir
LOCKOUT_MS1000 msLamba değiştikten sonra rölenin tıkırtısı yeni bir alkış sanılmasın diye sesler yok sayılır
RELAY_ON / RELAY_OFFLOW / HIGHAktif LOW röle modülü için; aktif HIGH bir kartta yer değiştir

Kod delay() kullanmaz, her şeyi millis() ile ölçer; bu sayede alkışların zamanlaması kaçmaz. Bu yaklaşımın mantığını millis ve delay farkı yazısında ayrıntılı anlattık. Lambanın ikinci alkıştan hemen sonra değil de 0,7 saniye sonra değişmesi bilinçli bir tercihtir: kod, üçüncü bir alkış gelip gelmeyeceğini bekler. Daha hızlı tepki istiyorsan CLAP_WINDOW_MS değerini 400–500 ms'ye indirebilirsin, ama o zaman iki alkışı daha hızlı vurman gerekir. Odan çok yankılıysa ve tek alkış iki kez sayılıyorsa QUIET_GAP_MS değerini 150–200 ms'ye çıkar.

Röleyle 220 V şebeke gerilimi anahtarlamak öldürücü olabilir. Bağlantıyı fiş prizden çekiliyken yap, açıkta kablo ucu bırakma ve devreyi yalıtkan, kapalı bir kutuya yerleştir; emin değilsen önce 12 V'luk bir LED şeritle dene. Sensörü de röleden uzağa yerleştir: rölenin tıkırtısı mikrofona çok yakınsa kilitleme süresine rağmen sorun çıkarabilir.

Ses seviyesi göstergesi: 8 LED'li bar (VU metre)

Tepe-tepe değerini doğrudan LED'lere bağlamak işe yarar ama doğal görünmez, çünkü kulağımız sesi logaritmik algılar: genliği iki katına çıkan bir ses bize iki kat yüksek gelmez. Bu yüzden ses ölçümünde desibel (dB) kullanılır. Genlik için formül dB = 20 × log10(p2p / referans) şeklindedir; genliğin iki katı +6 dB, on katı +20 dB eder. Aşağıdaki kod açılışta bir saniye boyunca odanın gürültü tabanını ölçer ve onu referans alır; her LED tabanın 3 dB üstünü temsil eder. LED'leri D3–D10 pinlerine, her birini 220 Ω'luk bir dirençle bağla; farklı renk LED'ler için doğru direnci LED direnci hesaplayıcı ile bulabilirsin.

Arduino (C++)
1// 8 LED'li ses seviyesi göstergesi (VU metre) / 8-LED sound level bar (VU meter)
2const int SOUND_AO = A0;                    // modülün AO pini / module AO pin
3const int LED_PINS[8] = {3, 4, 5, 6, 7, 8, 9, 10};  // her LED 220 Ω ile / each LED with 220 Ω
4const float DB_PER_LED = 3.0;               // her LED 3 dB / each LED is 3 dB
5const unsigned long FALL_MS = 80;           // LED'ler bu aralıkla birer birer söner / LEDs drop one by one at this rate
6
7float noiseFloor = 1.0;                     // sessiz ortamın p2p değeri / quiet-room p2p
8int shown = 0;                              // yanan LED sayısı / number of lit LEDs
9unsigned long lastFall = 0;
10
11int readPeakToPeak() {
12  int minV = 1023, maxV = 0;
13  unsigned long start = millis();
14  while (millis() - start < 50) {           // 50 ms pencere / 50 ms window
15    int v = analogRead(SOUND_AO);
16    if (v < minV) minV = v;
17    if (v > maxV) maxV = v;
18  }
19  return maxV - minV;
20}
21
22void setup() {
23  Serial.begin(115200);
24  for (int i = 0; i < 8; i++) pinMode(LED_PINS[i], OUTPUT);
25  long sum = 0;
26  for (int i = 0; i < 20; i++) sum += readPeakToPeak();  // 1 sn sessizlik ölç / measure 1 s of silence
27  noiseFloor = sum / 20.0;
28  if (noiseFloor < 1.0) noiseFloor = 1.0;
29}
30
31void loop() {
32  int p2p = readPeakToPeak();
33  if (p2p < 1) p2p = 1;
34  float db = 20.0 * log10(p2p / noiseFloor);  // tabana göre göreceli dB / relative dB above the floor
35  int level = constrain((int)(db / DB_PER_LED), 0, 8);
36
37  unsigned long now = millis();
38  if (level >= shown) {                     // yükselişte anında / rise instantly
39    shown = level;
40    lastFall = now;
41  } else if (now - lastFall >= FALL_MS) {   // inişte yavaşça / fall slowly
42    shown--;
43    lastFall = now;
44  }
45  for (int i = 0; i < 8; i++) digitalWrite(LED_PINS[i], i < shown ? HIGH : LOW);
46
47  Serial.print(F("dB:"));
48  Serial.println(db, 1);
49}

Açılışta bir saniye sessiz kalmaya dikkat et; o sırada konuşursan taban yüksek ölçülür ve gösterge az tepki verir. Göstergenin yükselişi anında, inişi ise her 80 ms'de bir LED olacak şekilde yavaştır; gerçek VU metreler de bu yüzden kıpır kıpır değil, akıcı görünür. KY-038'in analog sinyali zayıf olduğundan LED başına 2–3 dB uygundur; aynı kodu MAX4466 gibi yükselteçli bir mikrofonla kullanırsan DB_PER_LED değerini 4–6 dB'e çıkarabilirsin. Renkli bir gösterge için LED'ler yerine bir NeoPixel halka da kullanabilirsin; ayrıntılar WS2812B NeoPixel LED yazısında.

ESP32 ile ses sensörü: kesmeyle alkış algılama

ESP32'nin ADC'si 12 bittir ve 0–4095 arası değer verir; 3,3 V'luk aralıkta bir adım yaklaşık 0,8 mV eder, yani Uno'dan yaklaşık 6 kat daha ince bir çözünürlük sunar. Buna karşılık ESP32'nin ADC'si daha gürültülüdür, bu yüzden sessiz odadaki p2p değeri de daha yüksek çıkar; göreceli dB hesabı bu farkı kendiliğinden dengeler. Aşağıdaki kodda DO pini bir kesmeye (interrupt) bağlanır: loop() AO'dan 50 ms'lik ses seviyesi ölçümü yaparken bile alkış darbeleri kaçırılmaz. Kesme fonksiyonu IRAM_ATTR ile RAM'e yerleştirilir ve kısa tutulur; hem kesmenin hem loop()'un kullandığı değişkenler volatile tanımlanır ve bir kritik bölümle korunur.

Arduino (C++)
1// ESP32: kesmeyle çift alkış + ses seviyesi / ESP32: double clap via interrupt + sound level
2const int SOUND_AO = 34;                    // ADC1 pini, Wi-Fi açıkken de çalışır / ADC1 pin, works with Wi-Fi on
3const int SOUND_DO = 27;                    // modülün DO pini / module DO pin
4const int RELAY = 26;                       // röle modülü IN / relay module IN
5const int SOUND_ACTIVE = HIGH;              // kartın tersse LOW / LOW if your board is inverted
6const int RELAY_ON = LOW;                   // aktif LOW röle / active-LOW relay
7const int RELAY_OFF = HIGH;
8const unsigned long QUIET_GAP_MS = 120;     // yeni alkış için sessizlik / silence before a new clap
9const unsigned long CLAP_WINDOW_MS = 700;   // dizinin bitmesi / end of the series
10const unsigned long LOCKOUT_MS = 1000;      // röle tıkırtısını yok say / ignore the relay click
11
12portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;  // kesme ile loop arasında kilit / lock between ISR and loop
13volatile int clapCount = 0;
14volatile unsigned long lastPulse = 0;
15volatile unsigned long lastToggle = 0;
16bool lampOn = false;
17float noiseFloor = 1.0;
18
19void IRAM_ATTR onSound() {                  // kısa tutulur, RAM'den çalışır / kept short, runs from RAM
20  unsigned long now = millis();
21  portENTER_CRITICAL_ISR(&mux);
22  if (now - lastToggle >= LOCKOUT_MS && now - lastPulse >= QUIET_GAP_MS) clapCount++;
23  lastPulse = now;
24  portEXIT_CRITICAL_ISR(&mux);
25}
26
27int readPeakToPeak() {
28  int minV = 4095, maxV = 0;
29  unsigned long start = millis();
30  while (millis() - start < 50) {           // 50 ms pencere / 50 ms window
31    int v = analogRead(SOUND_AO);           // 0-4095 (12 bit)
32    if (v < minV) minV = v;
33    if (v > maxV) maxV = v;
34  }
35  return maxV - minV;
36}
37
38void setup() {
39  Serial.begin(115200);
40  pinMode(SOUND_DO, INPUT);
41  pinMode(RELAY, OUTPUT);
42  digitalWrite(RELAY, RELAY_OFF);
43  long sum = 0;
44  for (int i = 0; i < 20; i++) sum += readPeakToPeak();  // 1 sn sessiz ortam / 1 s of quiet room
45  noiseFloor = sum / 20.0;
46  if (noiseFloor < 1.0) noiseFloor = 1.0;
47  attachInterrupt(digitalPinToInterrupt(SOUND_DO), onSound, SOUND_ACTIVE == HIGH ? RISING : FALLING);
48}
49
50void loop() {
51  int p2p = readPeakToPeak();               // bu sırada alkışları kesme yakalar / the interrupt catches claps meanwhile
52  float db = 20.0 * log10((p2p < 1 ? 1 : p2p) / noiseFloor);
53  Serial.printf("p2p:%d dB:%.1f\n", p2p, db);
54
55  portENTER_CRITICAL(&mux);
56  unsigned long now = millis();
57  int claps = clapCount;
58  bool finished = claps > 0 && now - lastPulse > CLAP_WINDOW_MS;
59  if (finished) clapCount = 0;              // dizi bitti, sayacı sıfırla / series over, reset the counter
60  portEXIT_CRITICAL(&mux);
61
62  if (finished && claps == 2) {             // yalnız tam iki alkış / exactly two claps only
63    lampOn = !lampOn;
64    digitalWrite(RELAY, lampOn ? RELAY_ON : RELAY_OFF);
65    portENTER_CRITICAL(&mux);
66    lastToggle = millis();
67    portEXIT_CRITICAL(&mux);
68    Serial.println(lampOn ? "Lamba ACIK / Lamp ON" : "Lamba KAPALI / Lamp OFF");
69  }
70}

Kod, Uno'daki çift alkış mantığının aynısını kesme içinde çalıştırır ve yaklaşık 50 ms'de bir ses seviyesini dB olarak yazdırır. Röle modülünün IN pinini GPIO 26'ya bağla; 5 V ile beslenen aktif LOW röle modüllerinin bazıları ESP32'nin 3,3 V'luk HIGH seviyesinde tam bırakmaz, bu durumda 3,3 V ile sürülebilen bir modül seç. ESP32'nin asıl gücü Wi-Fi'dir: ses seviyesi birkaç saniye boyunca belirli bir eşiğin üstünde kalırsa (örneğin bebek ağlıyorsa ya da köpek havlıyorsa) telefonuna bildirim gönderebilirsin. Bunun için ESP32 Telegram bot yazısındaki yöntemi, ev otomasyonu sistemine bağlamak için de ESP32 MQTT ve Home Assistant yazısını kullanabilirsin.

Raspberry Pi Pico ve MicroPython ile ses sensörü

Raspberry Pi Pico'da modülü 3V3(OUT) pininden besle, AO'yu GP26'ya, DO'yu GP15'e bağla; lamba yerine GP14'e 220 Ω'luk dirençle bir LED tak. Pico'nun ADC'si 12 bittir ama MicroPython'da read_u16() değeri 0–65535 aralığına ölçekler; bu yüzden p2p sayıları Uno'dakinden çok daha büyük görünür, göreceli dB hesabı ise aynı kalır. DO pini için Pin.irq() ile bir kesme tanımlanır.

MicroPython
1# Raspberry Pi Pico: çift alkış + ses seviyesi / double clap + sound level
2from machine import Pin, ADC
3import time, math
4
5sound_ao = ADC(26)                  # GP26 = ADC0, modülün AO pini / module AO pin
6sound_do = Pin(15, Pin.IN)          # modülün DO pini / module DO pin
7lamp = Pin(14, Pin.OUT, value=0)    # LED (220 Ω ile) / LED (with 220 Ω)
8
9QUIET_GAP_MS = 120                  # yeni alkış için sessizlik / silence before a new clap
10CLAP_WINDOW_MS = 700                # dizinin bitmesi / end of the series
11LOCKOUT_MS = 1000                   # değişimden sonra sesleri yok say / ignore sounds after a toggle
12
13claps = 0
14last_pulse = time.ticks_ms()
15last_toggle = time.ticks_ms()
16
17def on_sound(pin):                  # kesme fonksiyonu / interrupt handler
18    global claps, last_pulse
19    now = time.ticks_ms()
20    if (time.ticks_diff(now, last_toggle) >= LOCKOUT_MS
21            and time.ticks_diff(now, last_pulse) >= QUIET_GAP_MS):
22        claps += 1
23    last_pulse = now
24
25# DO sesle LOW oluyorsa IRQ_FALLING yaz / use IRQ_FALLING if DO goes LOW on sound
26sound_do.irq(trigger=Pin.IRQ_RISING, handler=on_sound)
27
28def peak_to_peak(window_ms=50):     # 50 ms boyunca en büyük - en küçük / max - min over 50 ms
29    lo, hi = 65535, 0
30    start = time.ticks_ms()
31    while time.ticks_diff(time.ticks_ms(), start) < window_ms:
32        v = sound_ao.read_u16()     # 0-65535
33        if v < lo:
34            lo = v
35        if v > hi:
36            hi = v
37    return hi - lo
38
39noise_floor = max(1, sum(peak_to_peak() for _ in range(20)) / 20)  # 1 sn sessizlik / 1 s of silence
40
41while True:
42    p2p = peak_to_peak()
43    db = 20 * math.log10(max(p2p, 1) / noise_floor)   # göreceli dB / relative dB
44    print("p2p:", p2p, "dB:", round(db, 1))
45
46    now = time.ticks_ms()
47    if claps and time.ticks_diff(now, last_pulse) > CLAP_WINDOW_MS:
48        if claps == 2:              # yalnız tam iki alkış / exactly two claps only
49            lamp.toggle()
50            last_toggle = now
51            print("Lamba / Lamp:", "ON" if lamp.value() else "OFF")
52        claps = 0

Kodu Thonny'de çalıştırdığında p2p ve dB değerlerini kabuk (Shell) penceresinde görürsün; Görünüm menüsünden Çizici'yi açarsan değerleri grafik olarak izleyebilirsin. Kartının DO çıkışı sesle LOW oluyorsa IRQ_RISING yerine IRQ_FALLING yaz. Programın Pico'ya güç verildiğinde kendiliğinden başlaması için dosyayı Pico'ya main.py adıyla kaydet. MicroPython'a yeniysen MicroPython temelleri yazısı iyi bir başlangıçtır.

Ses sensörü ile desibel ölçülür mü?

Kısa cevap: hayır. İnternette KY-038'in tepe-tepe değerini map() ile 49–90 dB gibi bir aralığa çeviren çok sayıda kod bulursun; bunlar ölçüm değil, tahmindir. Gerçek bir ses basıncı seviyesi (dB SPL) ölçmek için mikrofonun duyarlılığının bilinmesi ve sistemin 94 dB'lik bir kalibratörle ayarlanması, sinyalin doğrusal olarak yükseltilmesi, RMS değerinin belirli bir süre boyunca (hızlı ayarda 125 ms, yavaş ayarda 1 s) hesaplanması ve kulağın duyarlılığını taklit eden A ağırlıklandırma filtresinin uygulanması gerekir. Ses seviyesi ölçerler bu yüzden IEC 61672 standardına göre üretilir.

KY-038 bu şartların hiçbirini karşılamaz: kartın kazancı belli değildir, mikrofon kapsüllerinin duyarlılığı kendi aralarında birkaç dB farklıdır, potansiyometre ve besleme gerilimi sinyal seviyesini değiştirir ve Uno'da normal seslerin tamamı birkaç ADC adımına sıkışır. Yapabileceğin en dürüst şey göreceli ölçümdür: "şu an ortam, sessiz odaya göre 12 dB daha gürültülü" demek. Bu bile bir gürültü uyarıcısı, sınıf trafik lambası ya da VU metre için fazlasıyla yeterlidir. Tek bir noktada bir telefon uygulamasıyla karşılaştırıp kaba bir kalibrasyon yapabilirsin, ama bu kalibrasyon başka ses seviyelerinde ve başka bir kartta geçerliliğini kaybeder.

Alternatifler: MAX4466, MAX9814 ve INMP441

ModülÇıkışKazançDesibel ölçümüUygun kart
KY-038 / KY-037AO (ham) + DO (eşik)YokHayırHepsi
MAX4466Analog, VCC/2 merkezli25–125 kat, ayarlanabilirYalnızca göreceliHepsi
MAX9814Analog, 1,25 V merkezli, en fazla 2 Vpp40 / 50 / 60 dB + otomatik kazanç (AGC)Hayır, AGC seviyeyi sıkıştırırHepsi
INMP441Dijital I2S, 24 bitGerekmezYaklaşık dB SPLESP32, Pico (Uno değil)
Hazır ses seviyesi modülü (ör. DFRobot SEN0232)Analog, doğrudan dBAFabrikada kalibreEvet, 30–130 dBA, ±1,5 dBHepsi

MAX4466, aynı tür elektret mikrofonu ayarlanabilir kazançlı bir op-amp ile birleştirir. Çıkışı sessizken besleme geriliminin yarısında durur ve yakındaki normal konuşmada yüzlerce milivoltluk bir sinyal verir; yani KY-038'in birkaç ADC adımlık sinyali onlarca, hatta yüzlerce adıma çıkar. Bu yazıdaki tepe-tepe ve VU metre kodları MAX4466 ile hiç değiştirmeden çalışır. Kazancın nasıl hesaplandığını merak ediyorsan op-amp kazanç hesaplayıcısını ve Op-amp nedir? yazısını incele. Modülü Uno'nun daha temiz olan 3.3V pininden beslemek gürültüyü azaltır. MAX9814 ise otomatik kazanç kontrolüyle uzaktaki konuşmayı bile duyulur seviyeye çıkarır; ses kaydı ve konuşma algılama için harikadır, ama sessiz ve gürültülü ortamları birbirine yaklaştırdığı için seviye ölçümüne uygun değildir.

INMP441 ise analog değil, dijital bir MEMS mikrofondur: sesi kendi içinde 24 bitlik sayılara çevirir ve I2S hattıyla gönderir, böylece kablolardaki gürültü ölçüme karışmaz. Asıl avantajı, duyarlılığının üretici tarafından dar bir toleransla belirtilmesidir: 94 dB SPL'lik bir ses −26 dBFS olarak okunur. Bu sayede ölçtüğün RMS değerini dBFS'ye çevirip 120 eklediğinde yaklaşık dB SPL değerini elde edersin. I2S için ESP32 ya da Pico gerekir; Arduino Uno'da I2S donanımı yoktur. INMP441'li hobi modülleri ucuz ve kolay bulunur; ICS-43434 ve SPH0645 de benzer I2S mikrofonlardır. Gerçekten doğru bir gürültü ölçümü gerekiyorsa en kolay yol, A ağırlıklı ve kalibre çıkış veren hazır bir ses seviyesi modülüdür; örneğin DFRobot SEN0232'nin çıkış gerilimini 50 ile çarptığında doğrudan dBA değerini bulursun.

Ses sensörü ile proje fikirleri

  • Alkışla lamba: Yukarıdaki çift alkış koduna bir röle modülü ekleyip masa lambanı ya da LED şeridini yönet; üç alkışa ikinci bir cihaz ata.
  • Sınıf gürültü trafik lambası: Göreceli dB değerine göre yeşil, sarı ve kırmızı LED yakan, öğretmenlerin sevdiği bir gürültü göstergesi.
  • Bebek ve evcil hayvan uyarıcısı: Ses 5 saniyeden uzun süre yüksek kalırsa ESP32 ile telefonuna Telegram mesajı gönder.
  • Sese tepki veren ışıklar: Müziğin ritmine göre parlayan bir NeoPixel halka ya da şerit.
  • Kapı vuruşu algılayıcı: Kapıya vurulduğunda buzzer ya da LED ile haber veren bir düzenek; vuruşu ses yerine titreşimle yakalamak için SW-420 titreşim sensörü de iyi bir seçenektir.
  • Akıllı ev senaryoları: Sesi hareket ve ışık sensörleriyle birleştirip odada kimse yokken ışıkları kapatan bir sistem; fikirler için Arduino akıllı ev projesi yazısına bak.

Sık yapılan hatalar ve çözümleri

BelirtiOlası sebepÇözüm
DO LED'i sürekli yanıyorEşik çok hassas ya da ortamda sürekli bir gürültü var (fan, buzdolabı)Potansiyometreyi sessiz ortamda LED sönene kadar çevir, sensörü gürültü kaynağından uzaklaştır
Alkışlayınca hiçbir şey olmuyorEşik çok yüksek ya da DO yanlış pine bağlıÖnce kart üzerindeki LED'in alkışta yandığını gör, sonra kabloyu ve koddaki pin numarasını kontrol et
Sessizken sayaç artıyor, sesle duruyorKartın DO çıkışı LOW-aktifSOUND_ACTIVE değerini LOW yap, Pico'da IRQ_FALLING kullan
analogRead hep 500 civarında, sesle 1–2 değişiyorAO yükseltilmemiş ve tek okuma yapılıyorTepe-tepe yöntemini kullan, sesi yaklaştır ya da MAX4466'ya geç
AO hep 0 ya da 1023AO ile DO karıştırılmış ya da DC seviye kenara kaymışKabloları kontrol et, potansiyometreyle ortalamayı ortaya getir
Tek alkış iki kez sayılıyorOda yankılı ya da QUIET_GAP_MS kısaQUIET_GAP_MS değerini 150–200 ms yap, eşiği biraz daha az hassas yap
Lamba kendi kendine açılıp kapanıyorRöle tıkırtısı, kapı çarpması ya da müzikLOCKOUT_MS değerini artır, sensörü röleden uzaklaştır, çift alkış şartını koru
ESP32'de Wi-Fi açılınca AO okunmuyorAO bir ADC2 pinine bağlıAO'yu GPIO 32–39 arasındaki bir ADC1 pinine taşı
Ses sensörünü test etmenin pratik bir yolu telefonundaki bir ton üreteci uygulamasıdır. 1 kHz'lik sabit bir ton çal ve telefonu mikrofondan 10, 20 ve 40 cm uzakta tut: açık alanda mesafe her iki katına çıktığında ses basıncı yarıya iner, yani p2p değeri yaklaşık yarıya inmeli ve dB değeri yaklaşık 6 dB düşmelidir. Bu basit deney hem bağlantını hem de kodunu doğrular.

KY-038, birkaç kablo ve doğru yazılmış bir kodla elektroniğin birçok temel konusunu aynı anda öğretir: karşılaştırıcılar, analog-dijital dönüşüm, kesmeler, zamanlama ve desibel hesabı. DO ile alkış algılamaya başla, tepe-tepe yöntemiyle ses seviyesini ölç, gerçek ses ölçümü gerektiğinde MAX4466 ya da INMP441'e geç. BlueGrays uygulamasında röleyle lamba yakma, yürüyen LED, ESP32 akıllı aydınlatma ve NeoPixel şerit projelerini devre şemaları ve adım adım kodlarıyla bulabilirsin; ses sensörünü bu projelere eklemek, onları alkışla ya da sesle çalışan sistemlere dönüştürmenin en kolay yoludur.

Sıkça sorulan sorular

Arduino ses sensörü nasıl çalışır?

Ses sensörü, elektret mikrofonun ürettiği küçük gerilimi LM393 karşılaştırıcıyla potansiyometrenin belirlediği eşikle karşılaştırır. Ses eşiği aşınca DO pini durum değiştirir ve kart üzerindeki LED yanar. AO pini ise mikrofonun yükseltilmemiş ham sinyalini verir ve analogRead() ile okunur.

KY-038 ile KY-037 arasındaki fark nedir?

İkisi de aynı LM393 devresini ve aynı AO, G, +, DO pin sırasını kullanır, kodları da aynıdır. KY-037 daha büyük bir mikrofon kapsülü taşır ve genellikle biraz daha duyarlıdır; KY-038 daha küçüktür ve sensör setlerinde daha yaygındır.

Ses sensörünün hassasiyeti nasıl ayarlanır?

Mavi potansiyometreyi sessiz ortamda DO LED'inin yanıp söndüğü sınır noktasına getir, sonra LED sönük kalacak yöne yarım ya da bir tur geri çevir. Potansiyometre çok turlu olduğu için değişiklik görmek için birkaç tur çevirmen gerekebilir. Ayarı her zaman sensörün kullanılacağı ortamda yap.

Ses sensörü ile desibel ölçülebilir mi?

KY-038 ve KY-037 ile gerçek desibel (dB SPL) ölçülemez; kartın kazancı ve mikrofonun duyarlılığı belli değildir, kalibrasyon ve A ağırlıklandırma yoktur. Yalnızca sessiz ortama göre göreceli dB hesaplanabilir. Gerçek ölçüm için INMP441 gibi duyarlılığı bilinen bir I2S mikrofon ya da kalibre bir ses seviyesi modülü kullan.

Ses sensörünün analog değeri neden değişmiyor?

AO çıkışı yükseltilmemiş mikrofon sinyalidir ve normal seslerde Uno'nun 4,9 mV'luk ADC adımından küçüktür. Ayrıca tek bir analogRead() ses dalgasının rastgele bir anını okur. 50 ms boyunca örnek alıp en büyük ve en küçük değerin farkını (tepe-tepe) hesaplarsan değişimi net görürsün.

Ses sensörü ESP32 ve Raspberry Pi Pico ile çalışır mı?

Evet, modül 3,3 V ile de çalışır; ESP32 ve Pico'da onu 3V3 pininden beslemelisin ki DO çıkışı 3,3 V'u aşmasın. ESP32'de AO'yu Wi-Fi ile çakışmayan ADC1 pinlerinden birine (GPIO 32–39), Pico'da GP26, GP27 ya da GP28'e bağla.

Tüm projeleri gör
Buton İle Led Yakma (On Off)
#10Başlangıç

Buton İle Led Yakma (On Off)

Bir butona bir kez basınca ışık yanar, bir daha basınca söner; tıpkı odandaki lamba düğmesi gibi. Arduino her basışı fark edip LED'in durumunu tersine çevirir, düğme içindeki minik titreşimler ışığı k

4.8(100)
162
ESP32 Buton ile LED Kontrol (Toggle)
#105Başlangıç

ESP32 Buton ile LED Kontrol (Toggle)

Butona her basıldığında LED'in durumu değişir: açıksa kapanır, kapalıysa açılır. Klasik toggle (geçiş) pattern'i. Debounce (sıçrama önleme) ile butonun mekanik gürültüsünü temizleyerek tek basışta tek değişim sağlarız.

4.6(39)
57
Yürüyen Led
#5Orta

Yürüyen Led

Sıra sıra yanıp sönen, koşar gibi ilerleyen ışıklar. Arduino altı LED'i tek tek yakar; her biri kısa bir an parlayıp söner ve ışık baştan sona yürür, sonra yeniden başlar. Birden çok ışığı tek bir düz

4.6(85)
201
220V Ampülü Buton(On-Off) İle Yakma
#20İleri
Premium

220V Ampülü Buton(On-Off) İle Yakma

Evdeki gerçek bir ampulü küçük bir butonla açıp kapatmak ister misin? Butona her bastığında Arduino röleyi çevirir ve ampul yanar, bir daha basınca söner. Röle, kartın zayıf sinyaliyle şebeke elektriğ

4.5(33)
44
Raspberry Pi Pico Buton ile LED Yakma (Toggle, GP14 + GP2)
#156Başlangıç
Premium

Raspberry Pi Pico Buton ile LED Yakma (Toggle, GP14 + GP2)

Buton ile LED — bir üst seviye! 🔁 #155'in aksine burada butonu basılı tutmana gerek yok. Bir kez bas ve bırak → LED açılır. Tekrar bas ve bırak → LED söner (toggle). Devre #155 ile aynı (LED GP14, Buton GP2), ama kod büyük fark içeriyor. Yeni öğrenme: **edge detection** (kenar algılama — pinin 1'den 0'a düştüğü an), **state tracking** (önceki durumu hafızada tut), **debounce** (buton mekanik "bounce" sonrası yanlış tetikleme önleme). MicroPython'ın `led.toggle()` metodu ile tek satırda değişim.

0.0(0)
9
ESP32 Akıllı Aydınlatma (PIR + LDR + Röle + OLED)
#141İleri
Premium

ESP32 Akıllı Aydınlatma (PIR + LDR + Röle + OLED)

ESP32, PIR hareket sensörü, LDR ışık sensörü ve röle modülü ile evinin koridorunu, tuvaletini veya kilerini akıllı aydınlatmaya dönüştürüyoruz. Klasik "karanlıkta hareket algılanınca ışık yansın" senaryosunu inşa ediyoruz — ortam aydınlıksa hareket olsa bile ışık yanmaz, böylece gündüz gereksiz yere yanmaz ve enerji tasarrufu sağlanır. Işık 30 saniye yanık kalır; hareket devam ederse timer otomatik sıfırlanır ve süre uzar. SSD1306 OLED ekranda büyük fontlarla durum (AÇIK / GÜNDÜZ / BEKLE), geri

4.3(6)
11
ESP32 Park Sensörü (HC-SR04 + 5 LED Bar + Buzzer + OLED)
#142İleri
Premium

ESP32 Park Sensörü (HC-SR04 + 5 LED Bar + Buzzer + OLED)

Otomobil park sensörünün ESP32 versiyonu! HC-SR04 ultrasonik sensör ile önündeki nesneye olan mesafeyi ölçüyoruz. Mesafe azaldıkça 5 LED'lik bar dolar (yeşil → sarı → kırmızı) ve buzzer bip aralığı kısalır. Çok yakınlaşınca (10 cm altında) sürekli alarm çalar ve tüm LED'ler yanar. SSD1306 OLED ekranda büyük fontla anlık cm değeri, durum metni (SAKIN / DIKKAT / YAKIN / DUR! / TEHLIKE) ve LED bar simülasyonu gösterilir. Klasik ve öğretici bir proje — HC-SR04 pulseIn, digital multi-output, buzzer P

0.0(0)
14
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