ESP32 ile Keypad ve Buzzer Projesi

Bu rehber, ESP32 geliştirme kartı kullanarak 4×3 matris keypad ile tuş girişi algılama ve ezBuzzer kütüphanesi ile sesli geri bildirim sağlama işlemini adım adım açıklar. Keypad tarama yöntemi ile tuşların okunması ve her tuşlamada buzzer’dan kısa bip sesi üretilmesi prensibine dayanan bu proje, matris klavye entegrasyonu, kütüphane kullanımı ve kullanıcı etkileşimi konularını öğrenmek için temel bir uygulamadır.

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

4×3 Matris Keypad

4×3 matris keypad, 4 satır ve 3 sütundan oluşan 12 tuşlu bir giriş birimidir. Toplam 7 bağlantı ucu bulunur:

  • Row 1-4 (R1-R4): Satır bağlantı pinleri
  • Column 1-3 (C1-C3): Sütun bağlantı pinleri

Keypad, satır ve sütun pinlerinin taranması (scanning) yöntemi ile hangi tuşun basıldığını belirler. Bu yöntem, çok sayıda tuşu az sayıda GPIO pini ile kontrol etmeyi sağlar.

Buzzer

Buzzer, elektrik sinyallerini ses dalgalarına dönüştüren bir bileşendir. İki türü bulunur:

  • Aktif Buzzer: Dahili osilatörü vardır; DC gerilim uygulandığında tek frekansta ses üretir.
  • Pasif Buzzer: Harici PWM sinyali gerektirir; farklı frekanslarda ses üretilebilir.

Bu projede ezBuzzer kütüphanesi kullanıldığından hem aktif hem pasif buzzerlar ile çalışılabilir.

Gerekli Kütüphaneler

Projede kullanılan kütüphaneler:

  • Keypad.h: Matris keypad tarama ve tuş algılama fonksiyonlarını sağlayan kütüphane
  • ezBuzzer.h: Buzzer kontrolü için basit ve etkili fonksiyonlar içeren kütüphane

Adım 2 – GPIO Pin Atamaları

Projede kullanılan pin atamaları:

  • GPIO 12, 14, 27, 26: Keypad satır (Row) pinleri (R1, R2, R3, R4)
  • GPIO 25, 33, 32: Keypad sütun (Column) pinleri (C1, C2, C3)
  • GPIO 19: Buzzer sinyal pini

Not: GPIO 34, 35, 36 ve 39 pinleri ESP32’de yalnızca giriş (input) olarak kullanılabilir; bu projede kullanılan pinler hem giriş hem çıkış modunu destekler.

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

4×3 Keypad Bağlantısı:

  1. Keypad Row 1 pinini ESP32 GPIO 12 pinine bağlayın.
  2. Keypad Row 2 pinini ESP32 GPIO 14 pinine bağlayın.
  3. Keypad Row 3 pinini ESP32 GPIO 27 pinine bağlayın.
  4. Keypad Row 4 pinini ESP32 GPIO 26 pinine bağlayın.
  5. Keypad Column 1 pinini ESP32 GPIO 25 pinine bağlayın.
  6. Keypad Column 2 pinini ESP32 GPIO 33 pinine bağlayın.
  7. Keypad Column 3 pinini ESP32 GPIO 32 pinine bağlayın.

Not: Keypad pinlerinin sırası esnektir; kodda pin_rows ve pin_column dizileri bağlantı sırasına göre ayarlanmalıdır.

Buzzer Bağlantısı:

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

Not: Aktif buzzer kullanılıyorsa polarite dikkate alınmalıdır. Pasif buzzerlarda polarite genellikle önemli değildir ancak üretici spesifikasyonları kontrol edilmelidir.

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

Arduino IDE’yi açın ve aşağıdaki kütüphaneleri Kütüphane Yöneticisi üzerinden yükleyin:

  • Keypad: “Keypad” araması ile Mark Stanley versiyonunu yükleyin
  • ezBuzzer: “ezBuzzer” araması ile Yurii Salimov versiyonunu yükleyin

Ayrıca aşağıdaki kart ayarlarını 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

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 Keypad ve Buzzer Projesi
 * Keypad: Rows=GPIO12,14,27,26 | Columns=GPIO25,33,32
 * Buzzer: GPIO19
 * Tuş başına 100ms bip sesi üretilir
 * Gerekli kütüphaneler: Keypad, ezBuzzer
 */

// Keypad.h kütüphanesi: 4x3 matris keypad tarama ve tuş algılama fonksiyonlarını sağlar
// Satır ve sütun pinlerinin sırayla taranması ile basılan tuşun kimliği belirlenir
#include <Keypad.h>

// ezBuzzer.h kütüphanesi: Buzzer kontrolü için basit arayüz sunar
// beep(), tone(), noTone() gibi fonksiyonlarla ses üretimi kolaylaştırılır
#include <ezBuzzer.h>

// Buzzer'ın sinyal pininin bağlı olduğu GPIO pini
// GPIO19 PWM çıkışı destekleyen bir pindir, ses frekansı üretimi için uygundur
#define BUZZER_PIN 19  // GPIO19 pini buzzer sinyal hattına bağlanır

// Keypad'in satır sayısını tanımla
// 4x3 keypad'te 4 satır (Row) bulunur: R1, R2, R3, R4
#define ROW_NUM 4  // Keypad satır sayısı: 4

// Keypad'in sütun sayısını tanımla
// 4x3 keypad'te 3 sütun (Column) bulunur: C1, C2, C3
#define COLUMN_NUM 3  // Keypad sütun sayısı: 3

// Keypad tuşlarının karakter haritasını 2 boyutlu dizi olarak tanımla
// keys[satır][sütun] formatında düzenlenmiştir
// Her eleman, ilgili satır ve sütun kesişimindeki tuşun karakter değerini temsil eder
char keys[ROW_NUM][COLUMN_NUM] = {
  {'1', '2', '3'},  // 1. satır tuşları: 1, 2, 3
  {'4', '5', '6'},  // 2. satır tuşları: 4, 5, 6
  {'7', '8', '9'},  // 3. satır tuşları: 7, 8, 9
  {'*', '0', '#'}   // 4. satır tuşları: *, 0, #
};

// Keypad satır pinlerinin bağlı olduğu GPIO pinlerini dizi olarak tanımla
// pin_rows[0] = Row 1, pin_rows[1] = Row 2, vb.
// Bu dizideki sıralama, keys dizisindeki satır sırası ile eşleşmelidir
byte pin_rows[ROW_NUM] = {12, 14, 27, 26};  // GPIO12, GPIO14, GPIO27, GPIO26 satır pinlerine bağlanır

// Keypad sütun pinlerinin bağlı olduğu GPIO pinlerini dizi olarak tanımla
// pin_column[0] = Column 1, pin_column[1] = Column 2, vb.
// Bu dizideki sıralama, keys dizisindeki sütun sırası ile eşleşmelidir
byte pin_column[COLUMN_NUM] = {25, 33, 32};  // GPIO25, GPIO33, GPIO32 sütun pinlerine bağlanır

// Keypad nesnesi oluştur
// Parametreler: tuş haritası (makeKeymap), satır pinleri, sütun pinleri, satır sayısı, sütun sayısı
// makeKeymap(): char dizisini Keypad kütüphanesinin kullanabileceği formata dönüştürür
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);

// ezBuzzer nesnesi oluştur ve belirtilen GPIO pinine bağla
// Bu nesne üzerinden buzzer'a beep, tone gibi komutlar gönderilir
ezBuzzer buzzer(BUZZER_PIN);  // GPIO19 pinine bağlı buzzer için nesne örneği oluşturulur

// Kurulum fonksiyonu: reset atıldığında bir kez çalışır
void setup() {
  // Serial iletişim hızını 9600 baud olarak başlat
  // Basılan tuş karakterlerini Serial Monitor'de izlemek ve hata ayıklama için kullanılır
  Serial.begin(9600);
}

// Ana döngü fonksiyonu: sürekli tekrarlanır
void loop() {
  // ezBuzzer kütüphanesinin zamanlama fonksiyonlarını çalıştır
  // beep() gibi asenkron ses komutlarının doğru çalışması için loop() içinde düzenli çağrılmalıdır
  // Bu fonksiyon çağrılmazsa buzzer sesleri beklenen sürede sonlanmayabilir
  buzzer.loop();

  // Keypad'de basılan tuşu oku
  // getKey() fonksiyonu: tuş basıldıysa ilgili karakteri döner, basılmadıysa NULL (0) döner
  char key = keypad.getKey();

  // key değişkeni NULL değilse (yani bir tuş basıldıysa) koşul bloğuna gir
  if (key) {
    // Basılan tuş karakterini Serial Monitor'e yazdır
    // print() fonksiyonu satır sonu eklemez; tuşlar yan yana görüntülenir
    Serial.print(key);  // Basılan tuş karakterini seri porta gönder

    // Buzzer'da 100 milisaniye süreli bip sesi üret
    // beep(süre_ms): Belirtilen milisaniye süresince buzzer'ı aktif eder
    // ezBuzzer kütüphanesi bu işlemi asenkron yönetir; delay() kullanmaya gerek kalmaz
    buzzer.beep(100);  // 100ms süreli bip sesi oluştur
  }
}

Kod Nasıl Çalışır

Kütüphane ve Tanımlar

  • #include <Keypad.h>: Matris keypad tarama algoritmasını içeren kütüphaneyi projeye dahil eder; satır/sütun taraması ile tuş kimliği belirlenir.
  • #include <ezBuzzer.h>: Buzzer kontrolü için basit arayüz sunan kütüphaneyi ekler; beep(), tone() gibi fonksiyonlarla ses üretimi kolaylaştırılır.
  • #define direktifleri ile buzzer pini ve keypad boyutları sabit olarak tanımlanır; kodun okunabilirliği ve bakımı kolaylaşır.
  • keys[ROW_NUM][COLUMN_NUM]: Keypad tuşlarının karakter haritası 2 boyutlu dizi olarak tanımlanır; tarama sırasında bu harita kullanılır.
  • pin_rows[] ve pin_column[]: Keypad satır ve sütun pinlerinin GPIO numaraları dizilerde saklanır; donanım bağlantısı ile eşleşmelidir.
  • Keypad keypad = Keypad(...): Keypad nesnesi oluşturulur; tuş haritası ve pin dizileri ile yapılandırılır.
  • ezBuzzer buzzer(BUZZER_PIN): Buzzer nesnesi oluşturulur ve belirtilen GPIO pinine bağlanır.

Setup Fonksiyonu

  • Serial.begin(9600): Serial iletişim başlatılır; basılan tuş karakterlerini izlemek ve hata ayıklama için kullanılır.
  • Keypad ve buzzer nesneleri global alanda oluşturulduğundan, setup() içinde ek başlatma işlemine gerek yoktur.

Loop Fonksiyonu

  • buzzer.loop(): ezBuzzer kütüphanesinin zamanlama yönetimi için düzenli çağrılması gereken fonksiyondur; asenkron ses komutlarının doğru çalışmasını sağlar.
  • keypad.getKey(): Keypad’de basılan tuşu tarar; tuş basıldıysa ilgili karakteri döner, basılmadıysa NULL (0) döner.
  • if (key): getKey() değeri NULL değilse koşul sağlanır; yani bir tuş basılmış demektir.
  • Serial.print(key): Basılan tuş karakteri Serial Monitor’e yazdırılır; print() kullanıldığı için karakterler yan yana görüntülenir.
  • buzzer.beep(100): Buzzer’da 100 milisaniye süreli bip sesi üretilir; ezBuzzer bu işlemi asenkron yönettiğinden delay() kullanılmaz ve tuş taraması aksamaz.

Adım 6 – Test Edin

Kod yüklendikten sonra:

  1. Arduino IDE’de Serial Monitor’ü açın (9600 baud).
  2. Keypad üzerinde herhangi bir tuşa basın.
  3. Buzzer’dan kısa bir bip sesi duyulduğunu kontrol edin.
  4. Serial Monitor’de basılan tuşun karakterinin görüntülendiğini doğrulayın.
  5. Farklı tuşlara basarak tüm tuşların çalıştığını ve doğru karakterlerin gönderildiğini test edin.
  6. Tuş tepkisi alınamıyorsa keypad pin bağlantılarını, pin_rows ve pin_column dizilerinin sıralamasını kontrol edin.

İsteğe Bağlı Geliştirmeler

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

  • Şifre Doğrulama: Belirli bir tuş dizisini (örn: “1234#”) doğru giren kullanıcıya erişim izni verin.
  • Farklı Sesler: Her tuş için farklı frekans veya süreli bip sesi tanımlayın; buzzer.tone(frekans, süre) fonksiyonunu kullanın.
  • LCD/OLED Entegrasyonu: Basılan tuşları veya şifre giriş durumunu grafik ekranda görüntüleyin.
  • Uzun Basma Algılama: Tuşun basılı kalma süresini ölçerek farklı işlevler tetikleyin.
  • Debouncing: Keypad kütüphanesinin setDebounceTime() fonksiyonu ile tuş titreşimlerini filtreleyin.
  • WiFi Kontrol: ESP32 WiFi özelliği ile tuş girişlerini uzaktan izleyin veya kontrol edin.

ESP32 Keypad-Buzzer Projesi SSS

S: Keypad tuşları yanlış karakter döndürüyor.
C: pin_rows ve pin_column dizilerinin sıralaması, keypad fiziksel bağlantısı ve keys haritası ile eşleşmelidir. Satır/sütun pinlerinin karışık bağlanması yanlış tuş algılanmasına neden olur.

S: Buzzer sesi çok kısa veya duyulmuyor.
C: Aktif buzzer kullanıyorsanız beep() fonksiyonu çalışmalıdır. Pasif buzzer kullanıyorsanız ezBuzzer kütüphanesi PWM sinyali üretir; bağlantıyı ve buzzer tipini kontrol edin.

S: buzzer.loop() neden gerekli?
C: ezBuzzer kütüphanesi asenkron zamanlama kullanır. beep() çağrıldığında ses hemen başlayıp bitmez; loop() içinde düzenli çağrılan buzzer.loop() fonksiyonu ses süresini yönetir. Bu çağrı atlanırsa sesler beklenildiği gibi çalışmaz.

S: Keypad tuşları titriyor veya çift algılanıyor.
C: Mekanik tuşlar basıldığında milisaniyelik titreşimler (bounce) oluşturabilir. Keypad kütüphanesinde keypad.setDebounceTime(50) ile 50ms debounce süresi ekleyerek bu etkiyi azaltabilirsiniz.

S: Farklı GPIO pinleri kullanabilir miyim?
C: Evet. Keypad satır/sütun pinleri ve buzzer pini, giriş/çıkış modunu destekleyen herhangi bir GPIO ile değiştirilebilir. Ancak GPIO 34-39 gibi sadece giriş destekleyen pinleri çıkış olarak atamayın.

S: 4×4 keypad kullanabilir miyim?
C: Evet. COLUMN_NUM değerini 4 olarak değiştirin, keys dizisine dördüncü sütunu ekleyin ve pin_column dizisine dördüncü sütun pinini ekleyin. Örn: {'A', 'B', 'C', 'D'} şeklinde dördüncü satır/sütun tanımlanabilir.

S: Serial Monitor’de tuşlar yan yana değil alt alta görünsün istiyorum.
C: Serial.print(key) satırını Serial.println(key) olarak değiştirin. println() fonksiyonu karakterden sonra satır sonu ekler.

Leave a Reply

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