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 DIYables IR alıcı modülü ve 17 tuşlu IR uzaktan kumanda ile kablosuz kontrol işlemini adım adım açıklar. Kızılötesi sinyal decoding işlemi ile kumanda tuşlarının tanınması ve switch-case yapısı ile her tuşa özel işlev atama prensibine dayanan bu proje, IR iletişim, kütüphane kullanımı ve uzaktan kontrol sistemleri konularını öğrenmek için temel bir uygulamadır.
17 tuşlu IR uzaktan kumanda, kızılötesi LED ile dijital kodlar gönderen bir giriş birimidir. Kumanda üzerinde bulunan tuşlar:
Her tuş basıldığında benzersiz bir IR kodu (NEC protokolü) gönderilir.

IR alıcı modülü, uzaktan kumandadan gelen kızılötesi sinyalleri alır ve dijital sinyale dönüştürür. Üç bağlantı ucu bulunur:
Modül üzerinde dahili filtre ve yükselteç devresi bulunur; gürültüye karşı dayanıklı sinyal üretir.


DIYables_IRcontroller, IR uzaktan kumanda sinyallerini decode etmek için optimize edilmiş bir kütüphanedir. Özellikleri:
getKey() fonksiyonu ile tuş okumaProjede kullanılan pin atamaları:
Not: IR alıcı sinyali dijital giriş olarak okunduğundan, herhangi bir GPIO pini kullanılabilir. GPIO 19 seçimi örneğe dayanmaktadır.

Not: IR alıcı modüllerinde pin sırası üreticiye göre değişebilir. Modül üzerindeki etiketleri kontrol edin: VCC-GND-OUT veya GND-VCC-OUT şeklinde olabilir.
Arduino IDE’yi açın ve aşağıdaki kütüphaneyi 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. Bu uygulama 17 tuşlu uzaktan kumanda için geçerlidir. Ancak küçük bir modifikasyonla 21 tuşlu kumandada kullanılabilir.
/*
* ESP32 IR Uzaktan Kumanda Projesi
* IR Alıcı: GPIO19, Kumanda: 17 tuşlu DIYables IR remote
* Debounce süresi: 200ms (yanlış tuş algılamayı önler)
* Gerekli kütüphane: DIYables_IRcontroller
*/
// DIYables_IRcontroller kütüphanesini projeye dahil et
// Bu kütüphane IR uzaktan kumanda sinyallerini decode eder ve tuş tanımlama sağlar
// Key17 enum sınıfı ile 17 tuşlu kumanda için önceden tanımlı sabitler sunulur
#include <DIYables_IRcontroller.h>
// IR alıcı modülünün sinyal çıkış pininin bağlı olduğu GPIO pini
// GPIO19 dijital giriş modunda IR sinyalini okumak için kullanılır
#define IR_RECEIVER_PIN 19 // GPIO19 pini IR alıcı OUT hattına bağlanır
// DIYables_IRcontroller_17 nesnesi oluştur
// Parametreler:
// 1. IR_RECEIVER_PIN: IR alıcının bağlı olduğu GPIO pini
// 2. 200: Debounce süresi (milisaniye) - aynı tuşun tekrarlı algılanmasını önler
// Bu nesne üzerinden IR sinyalleri okunur ve tuş kimliği belirlenir
// DIYables_IRcontroller_21 yazılırsa 21 butonlu kumanda kullanılabilir. Ancak bu durumda tuş
// algıma koduna ekleme yapmak gerekir.
DIYables_IRcontroller_17 irController(IR_RECEIVER_PIN, 200);
// 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ş bilgilerini Serial Monitor'de izlemek ve hata ayıklama için kullanılır
Serial.begin(9600);
// IR controller nesnesini başlat ve okumaya hazırla
// begin() fonksiyonu: IR alıcı pinini yapılandırır ve sinyal dinlemeyi aktif eder
irController.begin();
}
// Ana döngü fonksiyonu: sürekli tekrarlanır
void loop() {
// IR kumandadan gelen sinyali oku ve tuş kimliğini al
// getKey() fonksiyonu: yeni bir tuş algılandıysa Key17 enum değerini döner
// Tuş basılmadıysa Key17::NONE değerini döner
Key17 key = irController.getKey();
// Algılanan tuş NONE değilse (yani bir tuş basıldıysa) koşul bloğuna gir
if (key != Key17::NONE) {
// Switch-case yapısı ile her tuş için ayrı işlem tanımla
// Key17 enum sınıfı, tuşları anlamlı isimlerle temsil eder
switch (key) {
// KEY_1: Kumandadaki "1" tuşu algılandığında çalışır
case Key17::KEY_1:
Serial.println("1"); // Serial Monitor'e "1" yazdır ve satır sonu ekle
// TODO: 1 tuşu için özel kontrol kodunuzu buraya ekleyin
// Örnek: digitalWrite(LED_PIN, HIGH);
break; // Switch bloğundan çık, diğer case'leri kontrol etme
// KEY_2: Kumandadaki "2" tuşu algılandığında çalışır
case Key17::KEY_2:
Serial.println("2"); // Serial Monitor'e "2" yazdır
// TODO: 2 tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_3: Kumandadaki "3" tuşu algılandığında çalışır
case Key17::KEY_3:
Serial.println("3"); // Serial Monitor'e "3" yazdır
// TODO: 3 tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_4: Kumandadaki "4" tuşu algılandığında çalışır
case Key17::KEY_4:
Serial.println("4"); // Serial Monitor'e "4" yazdır
// TODO: 4 tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_5: Kumandadaki "5" tuşu algılandığında çalışır
case Key17::KEY_5:
Serial.println("5"); // Serial Monitor'e "5" yazdır
// TODO: 5 tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_6: Kumandadaki "6" tuşu algılandığında çalışır
case Key17::KEY_6:
Serial.println("6"); // Serial Monitor'e "6" yazdır
// TODO: 6 tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_7: Kumandadaki "7" tuşu algılandığında çalışır
case Key17::KEY_7:
Serial.println("7"); // Serial Monitor'e "7" yazdır
// TODO: 7 tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_8: Kumandadaki "8" tuşu algılandığında çalışır
case Key17::KEY_8:
Serial.println("8"); // Serial Monitor'e "8" yazdır
// TODO: 8 tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_9: Kumandadaki "9" tuşu algılandığında çalışır
case Key17::KEY_9:
Serial.println("9"); // Serial Monitor'e "9" yazdır
// TODO: 9 tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_STAR: Kumandadaki "*" tuşu algılandığında çalışır
case Key17::KEY_STAR:
Serial.println("*"); // Serial Monitor'e "*" yazdır
// TODO: * tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_0: Kumandadaki "0" tuşu algılandığında çalışır
case Key17::KEY_0:
Serial.println("0"); // Serial Monitor'e "0" yazdır
// TODO: 0 tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_SHARP: Kumandadaki "#" tuşu algılandığında çalışır
case Key17::KEY_SHARP:
Serial.println("#"); // Serial Monitor'e "#" yazdır
// TODO: # tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_UP: Kumandadaki "YUKARI" yön tuşu algılandığında çalışır
case Key17::KEY_UP:
Serial.println("UP"); // Serial Monitor'e "UP" yazdır
// TODO: UP tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_DOWN: Kumandadaki "AŞAĞI" yön tuşu algılandığında çalışır
case Key17::KEY_DOWN:
Serial.println("DOWN"); // Serial Monitor'e "DOWN" yazdır
// TODO: DOWN tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_LEFT: Kumandadaki "SOL" yön tuşu algılandığında çalışır
case Key17::KEY_LEFT:
Serial.println("LEFT"); // Serial Monitor'e "LEFT" yazdır
// TODO: LEFT tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_RIGHT: Kumandadaki "SAĞ" yön tuşu algılandığında çalışır
case Key17::KEY_RIGHT:
Serial.println("RIGHT"); // Serial Monitor'e "RIGHT" yazdır
// TODO: RIGHT tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// KEY_OK: Kumandadaki "OK/ENTER" tuşu algılandığında çalışır
case Key17::KEY_OK:
Serial.println("OK"); // Serial Monitor'e "OK" yazdır
// TODO: OK tuşu için özel kontrol kodunuzu buraya ekleyin
break;
// default: Tanımlanmamış veya bilinmeyen bir tuş kodu algılandığında çalışır
default:
Serial.println("WARNING: undefined key:"); // Uyarı mesajı yazdır
// Bilinmeyen tuşlar için hata yönetimi veya loglama yapılabilir
break;
}
}
}
#include <DIYables_IRcontroller.h>: IR uzaktan kumanda sinyallerini decode eden kütüphaneyi projeye dahil eder; Key17 enum sınıfı ile tuş tanımlama sağlar.#define IR_RECEIVER_PIN 19: IR alıcı modülünün bağlı olduğu GPIO pini sabit olarak tanımlanır; kodun okunabilirliği ve bakımı kolaylaşır.DIYables_IRcontroller_17 irController(...): IR controller nesnesi oluşturulur; IR alıcı pini ve debounce süresi yapılandırılır.
Serial.begin(9600): Serial iletişim başlatılır; basılan tuş bilgilerini izlemek ve hata ayıklama için kullanılır.irController.begin(): IR controller nesnesi başlatılır; IR alıcı pini giriş moduna ayarlanır ve sinyal dinleme aktif hale getirilir.irController.getKey(): IR alıcıdan gelen sinyali okur ve tuş kimliğini Key17 enum değeri olarak döner; tuş basılmadıysa Key17::NONE döner.if (key != Key17::NONE): Algılanan tuş NONE değilse koşul sağlanır; yani bir tuş basılmış demektir.switch(key): Tuş kimliğine göre ilgili case bloğu çalıştırılır; her tuş için ayrı işlem tanımlanabilir.Serial.println(...): Basılan tuşun adı Serial Monitor’e yazdırılır; println() kullanıldığı için her tuş yeni satırda görüntülenir.// TODO: YOUR CONTROL: Her case bloğunda, ilgili tuşa atanacak özel kontrol kodu buraya eklenmelidir.break;: Switch bloğundan çıkış sağlar; diğer case’lerin yanlışlıkla çalışmasını önler.default:: Tanımlanmamış tuş kodları için yedek işlem bloğu; hata ayıklama ve loglama için kullanılır.Kod yüklendikten sonra:
Temel işlevi tamamladıktan sonra projeyi aşağıdaki şekilde genişletebilirsiniz:
S: IR alıcı tuş algılamıyor, neden?
C: IR alıcı modülünün OUT pini doğru GPIO’ya bağlanmalı ve kumanda pilleri dolu olmalıdır. Ayrıca alıcıyı doğrudan güneş ışığı veya floresan lamba gibi IR gürültüsü yapan kaynaklardan uzak tutun.
S: Tuşlar yanlış algılanıyor veya tekrarlı okunuyor.
C: Debounce süresi yetersiz olabilir. DIYables_IRcontroller_17 irController(IR_RECEIVER_PIN, 200) satırındaki 200 değerini 300-500 ms aralığına artırarak yanlış algılamayı azaltabilirsiniz.
S: Farklı marka IR kumanda kullanabilir miyim?
C: DIYables_IRcontroller kütüphanesi NEC protokolü kullanan 17 tuşlu kumandalar için optimize edilmiştir. Farklı protokol (Sony, RC5 vb.) kullanan kumandalar için uygun kütüphane seçilmelidir.
S: IR alıcı mesafesi ne kadar olmalı?
C: Tipik IR alıcılar 5-10 metre menzile sahiptir ancak güvenilir algılama için 1-3 metre arası önerilir. Alıcı ve kumanda arasında doğrudan görüş hattı olmalıdır.
S: TODO yorumları ne işe yarar?
C: // TODO: YOUR CONTROL satırları, geliştiricinin ilgili tuşa özel kontrol kodunu eklemesi için yer tutucudur. Bu satırlara digitalWrite(), servo.write() gibi fonksiyonlar eklenerek tuş işlevleri tanımlanır.
S: Farklı GPIO pinleri kullanabilir miyim?
C: Evet. IR alıcı sinyali dijital giriş olarak okunduğundan, herhangi bir GPIO pini kullanılabilir. IR_RECEIVER_PIN tanımını değiştirerek pin atamasını güncelleyebilirsiniz.
S: Serial Monitor’de tuş isimleri yerine sayılar görmek istiyorum.
C: Serial.println("1") yerine Serial.println(1) kullanarak sayısal değer gönderebilirsiniz. Ancak tuş isimleri hata ayıklama için daha okunabilirdir.