Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

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.
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:
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, elektrik sinyallerini ses dalgalarına dönüştüren bir bileşendir. İki türü bulunur:
Bu projede ezBuzzer kütüphanesi kullanıldığından hem aktif hem pasif buzzerlar ile çalışılabilir.
Projede kullanılan kütüphaneler:
Projede kullanılan pin atamaları:
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.

Not: Keypad pinlerinin sırası esnektir; kodda pin_rows ve pin_column dizileri bağlantı sırasına göre ayarlanmalıdır.
Not: Aktif buzzer kullanılıyorsa polarite dikkate alınmalıdır. Pasif buzzerlarda polarite genellikle önemli değildir ancak üretici spesifikasyonları kontrol edilmelidir.
Arduino IDE’yi açın ve aşağıdaki kütüphaneleri Kütüphane Yöneticisi üzerinden yükleyin:


Ayrıca aşağıdaki kart ayarlarını kontrol edin:
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
}
}
#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.Serial.begin(9600): Serial iletişim başlatılır; basılan tuş karakterlerini izlemek ve hata ayıklama için kullanılır.setup() içinde ek başlatma işlemine gerek yoktur.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.Kod yüklendikten sonra:
pin_rows ve pin_column dizilerinin sıralamasını kontrol edin.Temel işlevi tamamladıktan sonra projeyi aşağıdaki şekilde genişletebilirsiniz:
buzzer.tone(frekans, süre) fonksiyonunu kullanın.setDebounceTime() fonksiyonu ile tuş titreşimlerini filtreleyin.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.