ESP32 ile Piezo Buzzer Uygulaması

Bu rehber, ESP32 geliştirme kartı kullanarak bir buton ile piezo buzzer’dan melodik ses çıkarma işlemini adım adım açıklar. Butona basıldığında önceden tanımlanmış bir melodinin çalınması prensibine dayanan bu proje, dijital giriş, ses üretimi ve dizi kullanımı konularını öğrenmek için ideal bir uygulamadır.

Adım 1 – Bileşenleri Tanıyın

Piezo Buzzer

Piezo buzzer, elektrik sinyallerini ses dalgalarına dönüştüren pasif bir bileşendir. Aktif buzzerlardan farklı olarak, pasif buzzerlar frekans kontrolü gerektirir; bu sayede farklı notalar ve melodiler üretilebilir.

Buton ve Pull-up Yapı

Buton, mekanik bir anahtar görevi görür. ESP32’nin dahili INPUT_PULLUP özelliği kullanıldığında, buton serbestken pin HIGH (3.3V), basıldığında LOW (0V) değerini döndürür. Bu yapı harici direnç ihtiyacını ortadan kaldırır.

pitches.h Kütüphanesi

pitches.h kütüphanesi, müzik notalarının frekans değerlerini önceden tanımlanmış sabitler olarak içerir (Örn: NOTE_C4, NOTE_E5). Bu kütüphaneyi kullanarak melodik sesler üretmek kolaylaşır.

pitches.h, Arduino ve ESP32 projelerinde piezo buzzer veya hoparlörden belirli notaları (frekansları) çıkartmak için kullanılan, standart bir “sabitler” (constants) dosyasıdır.
Aslında teknik olarak bir “kütüphane” (kod içeren .cpp dosyası) değil, sadece nota isimlerini karşılık gelen frekans değerleriyle eşleştiren bir header (başlık) dosyasıdır.
Neden Kullanılır?
Buzzer’dan “Do” notası almak için işlemciye “262 Hertz sinyal üret” demek yerine, NOTE_C4 yazmanıza olanak tanır. Kodun okunabilirliğini artırır ve müzik notalarını dijital dünyaya tercüme eder.

/*************************************************
 * Public Constants
 *************************************************/

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

pitches.h files oluşturmak için aşağıdaki işlemi yapabilirsiniz.

Adım 2 – GPIO Pin Atamaları

Projede kullanılan pin atamaları:

  • GPIO 16: Buton bağlantısı için dijital giriş pini
  • GPIO 21: Piezo buzzer bağlantısı için dijital çıkış pini

Bu pinler ihtiyaç doğrultusunda değiştirilebilir. Ancak GPIO 6-11 (SPI flash), GPIO 34-39 (sadece giriş) gibi özel işlevli pinlerden kaçınılmalıdır.

Adım 3 – Devre Bağlantısı

Buton Bağlantısı (GPIO 16):

  1. Butonun bir bacağını ESP32 GPIO 16 pinine bağlayın.
  2. Butonun diğer bacağını GND (Toprak) pinine bağlayın.

Piezo Buzzer Bağlantısı (GPIO 21):

  1. Piezo buzzer’ın pozitif (+) bacağını ESP32 GPIO 21 pinine bağlayın.
  2. Piezo buzzer’ın negatif (-) bacağını GND pinine bağlayın.

Not: Pasif piezo buzzer kullanıldığından polarite dikkate alınmalıdır. Aktif buzzer kullanılıyorsa sadece digitalWrite() ile ses üretilebilir, melodi çalınamaz.

Adım 4 – Arduino IDE Hazırlığı

Arduino IDE’yi açın ve aşağıdaki ayarları kontrol edin:

  • Board: ESP32 geliştirme kartınızın modeli (Örn: DOIT ESP32 DEVKIT V1)
  • Port: ESP32’nin bağlı olduğu COM portu
  • ESP32 Paketi: Board Manager’dan “esp32” paketinin yüklü olduğundan emin olun
  • pitches.h: Kütüphane dosyasını projenizin bulunduğu klasöre ekleyin veya Arduino kütüphane dizinine kopyalayın

Adım 5 – Kodu Yükleyin

Aşağıdaki kodu Arduino IDE editörüne yapıştırın ve ESP32 kartınıza yükleyin:

/*
 * ESP32 Buton Kontrollü Piezo Buzzer Projesi
 * Buton GPIO16, Buzzer GPIO21 pinine bağlıdır
 * pitches.h kütüphanesi gereklidir
 */

#include "pitches.h"

#define BUTTON_PIN 16 // Butonun bağlı olduğu GPIO pini
#define BUZZER_PIN 21 // Buzzer'ın bağlı olduğu GPIO pini

// Melodideki notalar:
int melody[] = {
  NOTE_E5, NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5,
  NOTE_E5,
  NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,
  NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5,
  NOTE_D5, NOTE_G5
};

// Nota süreleri: 4 = çeyrek nota, 8 = sekizlik nota, tempo:
int noteDurations[] = {
  8, 8, 4,
  8, 8, 4,
  8, 8, 8, 8,
  2,
  8, 8, 8, 8,
  8, 8, 8, 16, 16,
  8, 8, 8, 8,
  4, 4
};

void setup() {
  Serial.begin(9600);                // Serial iletişimi başlat
  pinMode(BUTTON_PIN, INPUT_PULLUP); // Buton pinini pull-up giriş olarak ayarla
}

void loop() {
  int buttonState = digitalRead(BUTTON_PIN); // Buton durumunu oku

  if (buttonState == LOW) { // Butona basıldıysa
    Serial.println("Butona basılıyor");
    buzzer(); // Melodi fonksiyonunu çalıştır
  }
}

void buzzer() {
  // Melodi dizisindeki notaları sırayla çal
  int size = sizeof(noteDurations) / sizeof(int);

  for (int thisNote = 0; thisNote < size; thisNote++) {
    // Nota süresini hesapla: 1 saniye / nota tipi
    // Örn: çeyrek nota = 1000/4, sekizlik nota = 1000/8
    int noteDuration = 1000 / noteDurations[thisNote];

    // Buzzer'da ilgili frekansta sesi belirtilen süreyle çal
    tone(BUZZER_PIN, melody[thisNote], noteDuration);

    // Notalar arasında ayırt edilebilirlik için kısa bir boşluk bırak
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);

    // Sesi durdur
    noTone(BUZZER_PIN);
  }
}

Kod Nasıl Çalışır

Setup Fonksiyonu

  • Serial.begin(9600): Serial iletişim hızını 9600 baud olarak ayarlar, hata ayıklama için kullanılır.
  • pinMode(BUTTON_PIN, INPUT_PULLUP): Buton pinini dahili pull-up direnç ile giriş olarak yapılandırır. Buton serbestken HIGH, basıldığında LOW okunur.

Loop Fonksiyonu

  • digitalRead(BUTTON_PIN): Butonun anlık durumunu okur.
  • if (buttonState == LOW): Butona basıldığında buzzer() fonksiyonunu çağırarak melodiyi çalar.

Buzzer Fonksiyonu

  • sizeof(noteDurations) / sizeof(int): Dizi eleman sayısını hesaplar.
  • for döngüsü ile her nota sırayla işlenir.
  • 1000 / noteDurations[thisNote]: Nota tipine göre milisaniye cinsinden süre hesaplanır.
  • tone(BUZZER_PIN, melody[thisNote], noteDuration): Belirtilen frekansta ve sürede ses üretir.
  • pauseBetweenNotes: Notalar arasında %30 ek boşluk bırakılarak seslerin net ayrılması sağlanır.
  • noTone(BUZZER_PIN): İlgili pindeki ses sinyalini durdurur.

Adım 6 – Test Edin

Kod yüklendikten sonra:

  1. Serial Monitor’ü açın (9600 baud).
  2. Butona bastığınızda “Butona basılıyor” mesajının Serial Monitor’de göründüğünü kontrol edin.
  3. Butona basıldığında piezo buzzer’dan melodinin çaldığını dinleyin.
  4. Ses gelmiyorsa buzzer bağlantısını, pin atamalarını ve pitches.h dosyasının projede bulunduğunu doğrulayın.

İsteğe Bağlı Geliştirmeler

Temel işlevi tamamladıktan sonra projeyi aşağıdaki şekilde genişletebilirsiniz:

  • Farklı Melodiler: melody[] ve noteDurations[] dizilerini değiştirerek farklı şarkılar ekleyin.
  • Çoklu Buton: Farklı butonlar ile farklı melodileri tetikleyin.
  • Debounce Ekleme: Buton titreşimlerini engellemek için yazılımsal debounce algoritması uygulayın.
  • LED Göstergesi: Melodi çalarken yanıp sönen bir LED ekleyerek görsel geri bildirim sağlayın.
  • Tempo Kontrolü: Butona uzun basma ile melodi hızını artırıp azaltan bir özellik ekleyin.

ESP32 Buzzer Projesi SSS

S: Buzzer’dan ses gelmiyor, neden?
C: Pasif piezo buzzer kullandığınızdan emin olun. Aktif buzzerlar sadece tek frekansta ses üretir, melodi çalamaz. Ayrıca GPIO 21 bağlantısını ve GND bağlantısını kontrol edin.

S: pitches.h dosyası bulunamadı hatası alıyorum.
C: pitches.h dosyasını Arduino IDE’nin kütüphane dizinine veya proje klasörüne kopyalayın. Dosyayı resmi Arduino örneklerinden veya güvenilir kaynaklardan temin edebilirsiniz.

S: Melodi çok hızlı veya yavaş çalıyor.
C: noteDurations[] dizisindeki değerleri veya pauseBetweenNotes çarpanını (1.30) değiştirerek tempoyu ayarlayabilirsiniz.

S: Butona bir kez basıyorum ama melodi tekrar tekrar çalıyor.
C: loop() fonksiyonu sürekli çalıştığı için buton LOW durumda kaldığı sürece melodi tekrar çalınabilir. Buton bırakılana kadar bekleyen veya tek tetikleme yapan bir yapı kurabilirsiniz.

S: Farklı GPIO pinleri kullanabilir miyim?
C: Evet, ancak tone() fonksiyonu yalnızca PWM destekleyen pinlerde çalışır. ESP32’de çoğu GPIO pin PWM için uygundur; ancak GPIO 34-39 gibi sadece giriş pinlerini kullanmayın.

S: Serial Monitor’de yazılar karışık görünüyor.
C: Serial Monitor baud hızının kodda belirtilen değerle (9600) eşleştiğinden emin olun. Ayrıca ESP32’nin doğru COM portunda olduğundan ve USB kablosunun veri aktarımını desteklediğinden emin olun.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir