ESP32 ile Kızılötesi (IR) Uzaktan Kumanda Projesi

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.

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

IR Uzaktan Kumanda (17 Tuşlu)

17 tuşlu IR uzaktan kumanda, kızılötesi LED ile dijital kodlar gönderen bir giriş birimidir. Kumanda üzerinde bulunan tuşlar:

  • Sayı Tuşları (0-9): Sayısal giriş ve komut atama için kullanılır
  • Yön Tuşları (UP, DOWN, LEFT, RIGHT): Navigasyon ve yön kontrolü için kullanılır
  • OK Tuşu: Onay/seçim işlemi için kullanılır
  • * ve # Tuşları: Özel fonksiyon atama için kullanılır

Her tuş basıldığında benzersiz bir IR kodu (NEC protokolü) gönderilir.

IR Alıcı Modülü

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:

  • VCC: Güç beslemesi (3.3V veya 5V)
  • GND: Toprak bağlantısı
  • OUT/DATA: Dijital sinyal çıkışı (ESP32 GPIO pinine bağlanır)

Modül üzerinde dahili filtre ve yükselteç devresi bulunur; gürültüye karşı dayanıklı sinyal üretir.

DIYables_IRcontroller Kütüphanesi

DIYables_IRcontroller, IR uzaktan kumanda sinyallerini decode etmek için optimize edilmiş bir kütüphanedir. Özellikleri:

  • 17 tuşlu kumanda için önceden tanımlı tuş sabitleri (Key17 enum)
  • Yazılımsal debounce ile yanlış tuş algılamayı önleme
  • Basit API: getKey() fonksiyonu ile tuş okuma
  • ESP32 donanımı ile uyumlu zamanlama yönetimi

Adım 2 – GPIO Pin Atamaları

Projede kullanılan pin atamaları:

  • GPIO 19: IR alıcı modülü OUT (sinyal) pini için dijital giriş

Not: IR alıcı sinyali dijital giriş olarak okunduğundan, herhangi bir GPIO pini kullanılabilir. GPIO 19 seçimi örneğe dayanmaktadır.

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

IR Alıcı Modülü Bağlantısı:

  1. IR alıcı modülünün VCC pinini ESP32 3.3V pinine bağlayın.
  2. IR alıcı modülünün GND pinini ESP32 GND pinine bağlayın.
  3. IR alıcı modülünün OUT (DATA) pinini ESP32 GPIO 19 pinine bağlayın.

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.

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

Arduino IDE’yi açın ve aşağıdaki kütüphaneyi yükleyin:

  • DIYables_IRcontroller: GitHub veya kütüphane yöneticisinden “DIYables_IRcontroller” kütüphanesini indirip kurun

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. 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;
    }
  }
}

Kod Nasıl Çalışır

Kütüphane ve Tanımlar

  • #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.

Setup Fonksiyonu

  • 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.

Loop Fonksiyonu

  • 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.

Adım 6 – Test Edin

Kod yüklendikten sonra:

  1. Arduino IDE’de Serial Monitor’ü açın (9600 baud).
  2. IR uzaktan kumandayı alıcı modüle doğru yönlendirin (mesafe: 5-10 cm).
  3. Kumanda üzerinde herhangi bir tuşa basın.
  4. Serial Monitor’de basılan tuşun adının (“1”, “UP”, “OK” vb.) görüntülendiğini kontrol edin.
  5. Farklı tuşlara basarak tüm tuşların doğru algılandığını test edin.
  6. Tuş tepkisi alınamıyorsa IR alıcı bağlantısını, pin atamasını ve kumanda pillerini kontrol edin.
  7. Yanlış tuşlar algılanıyorsa debounce süresini artırın veya alıcıyı güçlü ışık kaynaklarından uzaklaştırın.

İsteğe Bağlı Geliştirmeler

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

  • LED Kontrolü: Sayı tuşları ile farklı LED’leri yakıp söndürün; yön tuşları ile parlaklık ayarlayın.
  • Servo Motor: Yön tuşları ile servo motor açı kontrolü sağlayın; OK tuşu ile merkez konumuna dönün.
  • Şifre Girişi: Sayı tuşları ile 4 haneli şifre girişi yapın; doğru şifrede erişim izni verin.
  • Çoklu Kumanda: Farklı IR kumanda protokollerini destekleyerek birden fazla kumanda tipi ile çalışın.
  • WiFi Entegrasyonu: ESP32 WiFi özelliği ile IR komutlarını ağ üzerinden iletin veya uzaktan kontrol sağlayın.
  • LCD/OLED Ekran: Basılan tuş bilgilerini grafik ekranda görüntüleyerek kullanıcı geri bildirimi sağlayın.

ESP32 IR Kumanda Projesi SSS

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.

Leave a Reply

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